Skip to content
Kward Search API index

Module: Kward::PromptInterface::EditorEndwise

Included in:
Kward::PromptInterface
Defined in:
lib/kward/prompt_interface/editor/endwise.rb

Overview

Endwise-style closing keyword insertion for the built-in editor.

Constant Summary collapse

ENDWISE_LINE_PARSE_LIMIT =
100_000
ENDWISE_SINGLE_LINE_DEFINITION =
/;\s*end[\s;]*\z/.freeze
ENDWISE_ENDLESS_DEFINITION =
/\A\s*?def\s+[^\s(]+\s*(?:\(.*\))?\s*=/.freeze
ENDWISE_LANGUAGES =
{
  ruby: {
    line_comments: ["#"],
    block_comments: [{ start: /\A\s*=begin\b/, end: /\A\s*=end\b/ }],
    close_pattern: /\Aend\b/,
    openings: [
      { pattern: /\A\s*?if(\s|\()/, close: "end" },
      { pattern: /\A\s*?unless(\s|\()/, close: "end" },
      { pattern: /\A\s*?while(\s|\()/, close: "end" },
      { pattern: /\A\s*?for(\s|\()/, close: "end" },
      { pattern: /\s?do(\s?\z|\s\|.*\|\s?\z)/, close: "end" },
      { pattern: /\A\s*?def\s/, close: "end" },
      { pattern: /\A\s*?class\s/, close: "end" },
      { pattern: /\A\s*?module\s/, close: "end" },
      { pattern: /\A\s*?case(\s|\()/, close: "end" },
      { pattern: /\A\s*?begin\s/, close: "end" },
      { pattern: /\A\s*?until(\s|\()/, close: "end" }
    ]
  },
  crystal: {
    line_comments: ["#"],
    block_comments: [],
    close_pattern: /\Aend\b/,
    openings: [
      { pattern: /\A\s*?if(\s|\()/, close: "end" },
      { pattern: /\A\s*?unless(\s|\()/, close: "end" },
      { pattern: /\A\s*?while(\s|\()/, close: "end" },
      { pattern: /\A\s*?for(\s|\()/, close: "end" },
      { pattern: /\s?do(\s?\z|\s\|.*\|\s?\z)/, close: "end" },
      { pattern: /\A\s*?enum\s/, close: "end" },
      { pattern: /\A\s*?struct\s/, close: "end" },
      { pattern: /\A\s*?macro\s/, close: "end" },
      { pattern: /\A\s*?union\s/, close: "end" },
      { pattern: /\A\s*?lib\s/, close: "end" },
      { pattern: /\A\s*?annotation\s/, close: "end" },
      { pattern: /\A\s*?def\s/, close: "end" },
      { pattern: /\A\s*?class\s/, close: "end" },
      { pattern: /\A\s*?module\s/, close: "end" },
      { pattern: /\A\s*?case(\s|\()/, close: "end" },
      { pattern: /\A\s*?begin\s/, close: "end" },
      { pattern: /\A\s*?until(\s|\()/, close: "end" }
    ]
  },
  elixir: {
    line_comments: ["#"],
    block_comments: [],
    close_pattern: /\Aend\b/,
    openings: [
      { pattern: /\bdo\s*\z/, close: "end" },
      { pattern: /\A\s*fn\s*\z/, close: "end" },
      { pattern: /\bfn\b.*->\s*\z/, close: "end" }
    ]
  },
  julia: {
    line_comments: ["#"],
    block_comments: [],
    close_pattern: /\Aend\b/,
    openings: [
      { pattern: /\A\s*begin\s*\z/, close: "end" },
      { pattern: /\A\s*if\b/, close: "end" },
      { pattern: /\A\s*while\b/, close: "end" },
      { pattern: /\A\s*for\b/, close: "end" },
      { pattern: /\A\s*try\s*\z/, close: "end" },
      { pattern: /\A\s*let(?:\s|\z)/, close: "end" },
      { pattern: /\A\s*quote\s*\z/, close: "end" },
      { pattern: /\A\s*function\b/, close: "end" },
      { pattern: /\A\s*macro\b/, close: "end" },
      { pattern: /\A\s*module\b/, close: "end" },
      { pattern: /\A\s*baremodule\b/, close: "end" },
      { pattern: /\A\s*(?:mutable\s+)?struct\b/, close: "end" },
      { pattern: /\A\s*abstract\s+type\b/, close: "end" },
      { pattern: /\A\s*primitive\s+type\b/, close: "end" },
      { pattern: /\bdo(?:\s+.*)?\s*\z/, close: "end" }
    ]
  },
  lua: {
    line_comments: ["--"],
    block_comments: [{ start: /\A\s*--\[\[/, end: /\]\]/ }],
    close_pattern: /\Aend\b/,
    openings: [
      { pattern: /\A\s*do\s*\z/, close: "end" },
      { pattern: /\A\s*while\b.*\bdo\s*\z/, close: "end" },
      { pattern: /\A\s*if\b.*\bthen\s*\z/, close: "end" },
      { pattern: /\A\s*for\b.*\bdo\s*\z/, close: "end" },
      { pattern: /\A\s*(?:local\s+)?function\b.*\)\s*\z/, close: "end" }
    ]
  },
  makefile: {
    line_comments: ["#"],
    block_comments: [],
    close_pattern: /\Aendif\b/,
    openings: [
      { pattern: /\A\s*if(?:eq|neq)\b/, close: "endif" },
      { pattern: /\A\s*ifn?def\b/, close: "endif" }
    ]
  },
  shell: {
    line_comments: ["#"],
    block_comments: [],
    close_pattern: /\A(?:fi|done|esac)\b/,
    openings: [
      { pattern: /\bthen\s*\z/, close: "fi" },
      { pattern: /\A\s*case\b/, close: "esac" },
      { pattern: /\bdo\s*\z/, close: "done" }
    ]
  }
}.freeze