{"version":3,"sources":["https://lively-kernel.org/lively4/composed-offset/src/components/widgets/lively-code-mirror-modes.js"],"names":["Preferences","Morph","toTitleCase","indentFromTo","comparePos","a","b","line","ch","Mode","constructor","cmm","data","enter","exit","CommandMode","InsertMode","CaseMode","PsychMode","KillMode","GenerateMode","LivelyMode","SelectMode","CodeMirrorModes","lcm","cm","stack","inputModes","defaultMode","commandModeAsDefault","get","type","getMode","length","last","withASTCapabilities","callback","Promise","resolve","astCapabilities","then","ac","handleKeyEvent","evt","circumventMode","completion","state","completionActive","key","digit","split","find","ea","cancelDefaultEvent","pick","parseInt","shiftKey","execCommand","noModifier","altKey","ctrlKey","popMode","preventDefault","codemirrorIgnore","isCommandInput","f4","f23","isSelectionInput","f9","f24","logKey","msg","lively","warn","pushMode","altRight","killSelectionState","innerOuter","outer","selections","listSelections","map","anchor","head","findSmartAroundSelection","setSelections","forEach","underlineText","includes","getCursor","lineContent","getLine","match","endOfCondition","index","singlePlainCursor","somethingSelected","condition","insertions","push","insertion","end","endsWith","replaceSelection","getSelections","replaceSelections","ctrlRight","insertArrowFunction","chars","i","pos","reverse","anchorLine","headLine","startLine","endLine","start","content","getRange","replaceRange","repeat","that","value","editor","indexFromPos","word","findWordAt","addSelection","æ","unifiedKeyDescription","alt","ctrl","shift","shiftRight","transformCase","transformer","multi","operations","z","Enter","Space","m","c","text","camelCase","C","capitalize","k","kebabCase","l","lowerFirst","L","toLower","lowerCase","s","snakeCase","S","startCase","u","upperFirst","U","toUpper","upperCase","t","operation","notify","command","inclusive","e","inlineLocalVariable","generateIf","f","test","newlineAndIndent","functionHeadLine","ensureMode","v","extractExpressionIntoLocalVariable","n","livelyNotify","lively4url","cursor","setCursor","j","o","dispatchMode","renderModeStack","pop","modeMap","Map","set","mode","modeContainer","prototype","getSubmorph","innerHTML","append","self","__CodeMirrorModes__"],"mappings":"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","file":"lively-code-mirror-modes.js","sourcesContent":["\nimport Preferences from 'src/client/preferences.js';\nimport Morph from \"src/components/widgets/lively-morph.js\";\nimport 'src/client/keys-input.js';\n\nimport toTitleCase from \"src/external/title-case.js\";\nimport { indentFromTo } from './code-mirror-utils.js';\n\nfunction comparePos(a, b) {\n  return a.line - b.line || a.ch - b.ch;\n}\n\nclass Mode {\n  constructor(cmm, data) {\n    this.cmm = cmm;\n    this.data = data;\n  }\n  enter() {}\n  exit() {}\n}\n\nclass CommandMode extends Mode {}\n\n// the standard editor mode\nclass InsertMode extends Mode {}\n\n// special-purpose modes\nclass CaseMode extends Mode {}\nclass PsychMode extends Mode {}\nclass KillMode extends Mode {}\nclass GenerateMode extends Mode {}\nclass LivelyMode extends Mode {}\nclass SelectMode extends Mode {}\n\nclass CodeMirrorModes {\n\n  constructor(lcm, cm) {\n    this.lcm = lcm;\n    this.cm = cm;\n  }\n\n  get stack() {\n    if (!this.lcm.inputModes) {\n      this.lcm.inputModes = [];\n    }\n    return this.lcm.inputModes;\n  }\n\n  get defaultMode() {\n    const commandModeAsDefault = Preferences.get('CommandModeAsDefault');\n    return {\n      type: commandModeAsDefault ? 'command' : 'insert',\n      data: {}\n    };\n  }\n\n  getMode() {\n    return this.stack.length > 0 ? this.stack.last : this.defaultMode;\n  }\n\n  withASTCapabilities(callback) {\n    Promise.resolve(this.lcm.astCapabilities).then(callback);\n  }\n\n  get ac() {\n    return this.lcm.astCapabilities;\n  }\n\n  // #important\n  handleKeyEvent(evt) {\n    \n    // Use this option in context menu to toggle off mode-specific behavior in case you shot yourself in the foot\n    const circumventMode = Preferences.get('CircumventCodeMirrorModes');\n    if (circumventMode) {\n      return;\n    }\n\n    const completion = this.cm.state.completionActive;\n    if (completion) {\n      if (evt.key === 'Escape') {\n        // use default behavior, i.e. close the completion\n        return;\n      }\n\n      const digit = '0123456789'.split('').find(ea => ea === evt.key);\n      if (digit) {\n        cancelDefaultEvent();\n        completion.pick(completion.data, parseInt(digit));\n      }\n    }\n\n    // #KeyboardShortcut Shift-Escape clear multi-selection\n    if (evt.key === 'Escape' && evt.shiftKey) {\n      cancelDefaultEvent();\n      this.cm.execCommand('singleSelection');\n      return;\n    }\n\n    const { type, data } = this.getMode();\n\n    // leave any mode with `Escape`\n    const noModifier = !evt.altKey && !evt.ctrlKey && !evt.shiftKey;\n    if (evt.key === 'Escape' && noModifier) {\n      cancelDefaultEvent();\n      if (this.stack.length === 0 && type === 'insert') {\n        this.cm.execCommand('singleSelection');\n      } else {\n        this.popMode();\n      }\n      return;\n    }\n\n    if (evt.key === 'Tab') {\n      cancelDefaultEvent();\n      this.cm.execCommand(evt.ctrlKey ? 'indentAuto' : evt.shiftKey ? 'indentLess' : 'indentMore');\n      return;\n    }\n\n    function cancelDefaultEvent() {\n      evt.preventDefault();\n      evt.codemirrorIgnore = true;\n    }\n\n    function isCommandInput() {\n      return evt.f4 || evt.f23;\n    }\n    function isSelectionInput() {\n      return evt.f9 || evt.f24;\n    }\n    function logKey(msg) {\n      \n      lively.warn(`${evt.ctrlKey}${evt.shiftKey}${evt.altKey}`, msg)\n    }\n    // logKey('modes')\n    if (isCommandInput()) {\n      // #KeyboardShortcut F4/F23-G code snippets generator\n      if (evt.key === 'g') {\n        this.pushMode('generate');\n        cancelDefaultEvent();\n        return;\n      }\n    }\n    \n    // #KeyboardShortcut Alt-[ used in container to manipulate navbar\n    if (evt.key === '[' && (evt.altKey && !evt.ctrlKey && !evt.shiftKey || evt.altRight)) {\n      evt.preventDefault();\n      evt.codemirrorIgnore = true;\n    }\n\n    if (isSelectionInput()) {\n      const killSelectionState = () => {\n        delete this.cm.innerOuter;\n      };\n\n      // #KeyboardShortcut F9/F24-O 'outer' modifier\n      if (evt.key === 'o') {\n        this.cm.innerOuter = 'outer';\n        cancelDefaultEvent();\n        return;\n      }\n      // #KeyboardShortcut F9/F24-I 'inner' modifier\n      if (evt.key === 'i') {\n        this.cm.innerOuter = 'inner';\n        cancelDefaultEvent();\n        return;\n      }\n      // #KeyboardShortcut F9/F24-L select 'list'\n      if (evt.key === 'l') {\n        const outer = this.cm.innerOuter === 'outer';\n        const selections = this.cm.listSelections().map(({ anchor, head }) => {\n          return this.ac.findSmartAroundSelection(this.cm, anchor, head, outer);\n        });\n        // Array.prototype.filter(test, i, array, context?)\n        this.cm.setSelections(selections);\n        killSelectionState();\n        cancelDefaultEvent();\n        return;\n      }\n      // #KeyboardShortcut F9/F24-K select 'item'\n      if (evt.key === 'k') {\n        const outer = this.cm.innerOuter === 'outer';\n        const selections = this.cm.listSelections().map(({ anchor, head }) => {\n          return this.ac.findSmartAroundSelection(this.cm, anchor, head, outer);\n        });\n        this.cm.setSelections(selections);\n        killSelectionState();\n        cancelDefaultEvent();\n        return;\n      }\n      if (evt.key === 'q') {\n        this.cm.listSelections().forEach(({ anchor, head }) => {\n          this.ac.underlineText(this.cm, anchor, head);\n        });\n        killSelectionState();\n        cancelDefaultEvent();\n        return;\n      }\n    }\n\n    if (type === 'insert') {\n      const cm = this.cm;\n\n      // #KeyboardShortcut Alt-G code snippets generator\n      if (evt.key === 'g' && evt.altKey) {\n        this.pushMode('generate');\n        cancelDefaultEvent();\n        return;\n      }\n\n      // #KeyboardShortcut = insert ' === ' at end of if condition\n      if (' =!<>&|'.split('').includes(evt.key)) {\n        const { line, ch } = cm.getCursor();\n        const lineContent = cm.getLine(line);\n        const match = lineContent.match(/(\\s*\\bif\\s*\\()(.+)\\)\\s?\\{?/);\n\n        const endOfCondition = match && match.index + match[1].length + match[2].length === ch;\n        const singlePlainCursor = !cm.somethingSelected() && cm.listSelections().length === 1;\n        if (singlePlainCursor && endOfCondition) {\n          const condition = match[2];\n          const insertions = [];\n          insertions.push(['=', '<', '= ']);\n          insertions.push(['=', '>', '= ']);\n          insertions.push(['=', '!', '== ']);\n          insertions.push(['=', ' ==', '= ']);\n          insertions.push(['=', ' === ', '']);\n          insertions.push(['=', '!== ', '']);\n          insertions.push(['=', ' ', '=== ']);\n          insertions.push(['=', '', ' === ']);\n          insertions.push([' ', ' ', '']);\n          insertions.push(['!', ' ', '!== ']);\n          insertions.push(['!', '', ' !== ']);\n          insertions.push(['<', ' <', '']);\n          insertions.push(['<', ' ', '<']);\n          insertions.push(['<', '', ' <']);\n          insertions.push(['>', ' ', '> ']);\n          insertions.push(['>', '', ' > ']);\n          insertions.push(['&', '& ', '']);\n          insertions.push(['&', '', ' && ']);\n          insertions.push(['|', '| ', '']);\n          insertions.push(['|', '', ' || ']);\n\n          const insertion = insertions.find(([key, end]) => {\n            return key === evt.key && condition.endsWith(end);\n          });\n          if (insertion) {\n            cm.replaceSelection(insertion[2]);\n\n            cancelDefaultEvent();\n          }\n        }\n      }\n\n      // #KeyboardShortcut AltRight-A insert arrow function with 0 arguments\n      if (evt.key === 'a' && evt.altRight) {\n        const cm = this.cm;\n\n        const selections = cm.getSelections();\n        cm.replaceSelection('() => ');\n        cm.replaceSelections(selections, 'around');\n        cancelDefaultEvent();\n      }\n\n      // #KeyboardShortcut CtrlRight-A insert arrow function with 1 argument\n      if (evt.key === 'a' && evt.ctrlRight) {\n        this.ac.insertArrowFunction(1);\n\n        cancelDefaultEvent();\n      }\n\n      // #KeyboardShortcut AltRight-K kill line(s)\n      if (evt.key === 'k' && evt.altRight) {\n        const cm = this.cm;\n\n        const chars = cm.listSelections().map(({ head }) => head.ch);\n        this.cm.execCommand('deleteLine');\n        cm.setSelections(cm.listSelections().map(({ head }, i) => {\n          const pos = { line: head.line, ch: chars[i] };\n          return { anchor: pos, head: pos };\n        }));\n\n        cancelDefaultEvent();\n      }\n\n      // #TODO: need to merge selections, if there are multiple on the same line\n      // #KeyboardShortcut AltRight-D duplicate line(s)\n      if (evt.key === 'd' && evt.altRight) {\n        const cm = this.cm;\n\n        cm.listSelections().reverse().forEach(({ anchor, head }) => {\n          const anchorLine = anchor.line;\n          const headLine = head.line;\n\n          const startLine = anchorLine > headLine ? headLine : anchorLine;\n          const endLine = anchorLine > headLine ? anchorLine : headLine;\n\n          const start = { line: startLine, ch: 0 };\n          const content = cm.getRange(start, { line: endLine + 1, ch: 0 });\n          cm.replaceRange(content, start, start);\n        });\n        cancelDefaultEvent();\n      }\n\n      // #KeyboardShortcut AltRight-S enter select mode\n      if (evt.key === 's' && evt.altRight && !evt.repeat) {\n        this.pushMode('select'), cancelDefaultEvent();\n      }\n\n      if (evt.key === '<') {\n        return;\n        const that = this;\n        that.value;\n        const cm = that.editor;\n        cm.indexFromPos(cm.getCursor());\n        that.cm.listSelections().forEach(({ anchor, head }) => {\n          if (comparePos(anchor, head) === 0) {\n            const word = that.cm.findWordAt(anchor);\n            that.cm.addSelection(word.anchor, word.head);\n          }\n        });\n      }\n\n      return;\n    }\n\n    var æ = type;\n\n    const unifiedKeyDescription = evt => {\n      const alt = evt.altKey ? evt.altRight ? '>^' : '^' : '';\n      const ctrl = evt.ctrlKey ? evt.ctrlRight ? '>!' : '!' : '';\n      const shift = evt.shiftKey ? evt.shiftRight ? '>+' : '+' : '';\n      return ctrl + shift + alt + evt.key;\n    };\n\n    if (type === 'case' && !evt.repeat) {\n      const transformCase = transformer => {\n        // extend collapsed selections to words\n        this.cm.listSelections().forEach(({ anchor, head }) => {\n          if (comparePos(anchor, head) === 0) {\n            const word = this.cm.findWordAt(anchor);\n            this.cm.addSelection(word.anchor, word.head);\n          }\n        });\n\n        const selections = this.cm.getSelections();\n        this.cm.replaceSelections(selections.map(transformer), 'around');\n\n        if (!data.multi) {\n          this.popMode();\n        }\n      };\n\n      const operations = {\n        // #KeyboardShortcut z (case mode) undo\n        z: () => this.cm.execCommand('undo'),\n        // #KeyboardShortcut Enter (case mode) exit case mode\n        Enter: () => this.popMode(),\n        // #KeyboardShortcut Space (case mode) exit case mode\n        Space: () => this.popMode(),\n        // #KeyboardShortcut m (case mode) chain multiple case transformations\n        m: () => data.multi = !data.multi,\n        // #KeyboardShortcut c (case mode) camelCase\n        c: () => transformCase(text => text.camelCase()),\n        // #KeyboardShortcut C (case mode) Capitalize\n        C: () => transformCase(text => text.capitalize()),\n        // #KeyboardShortcut k (case mode) kebab-case\n        k: () => transformCase(text => text.kebabCase()),\n        // #KeyboardShortcut l (case mode) lOWERFIRST\n        l: () => transformCase(text => text.lowerFirst()),\n        // #KeyboardShortcut L (case mode) tolower\n        L: () => transformCase(text => text.toLower()),\n        // #KeyboardShortcut Ctrl-l (case mode) lower case\n        '^l': () => transformCase(text => text.lowerCase()),\n        // #KeyboardShortcut s (case mode) snake_case\n        s: () => transformCase(text => text.snakeCase()),\n        // #KeyboardShortcut S (case mode) Start Case\n        S: () => transformCase(text => text.startCase()),\n        // #KeyboardShortcut u (case mode) Upperfirst\n        u: () => transformCase(text => text.upperFirst()),\n        // #KeyboardShortcut U (case mode) TOUPPER\n        U: () => transformCase(text => text.toUpper()),\n        // #KeyboardShortcut Ctrl-u (case mode) UPPER CASE\n        '^u': () => transformCase(text => text.upperCase()),\n        // #KeyboardShortcut t (case mode) To Title Case\n        t: () => transformCase(text => toTitleCase(text))\n      };\n\n      const operation = operations[(evt.ctrlKey ? '^' : '') + evt.key];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(evt.key);\n      }\n      return;\n    }\n\n    if (type === 'select' && !evt.repeat) {\n      const transformCase = transformer => {\n        // extend collapsed selections to words\n        this.cm.listSelections().forEach(({ anchor, head }) => {\n          if (comparePos(anchor, head) === 0) {\n            const word = this.cm.findWordAt(anchor);\n            this.cm.addSelection(word.anchor, word.head);\n          }\n        });\n\n        const selections = this.cm.getSelections();\n        this.cm.replaceSelections(selections.map(transformer), 'around');\n\n        if (!data.multi) {\n          this.popMode();\n        }\n      };\n\n      const operations = {\n        // #KeyboardShortcut z (case mode) undo\n        z: () => this.cm.execCommand('undo'),\n        // #KeyboardShortcut Enter (case mode) exit case mode\n        Enter: () => this.popMode(),\n        // #KeyboardShortcut Space (case mode) exit case mode\n        Space: () => this.popMode(),\n        // #KeyboardShortcut m (case mode) chain multiple case transformations\n        m: () => data.multi = !data.multi,\n        // #KeyboardShortcut c (case mode) camelCase\n        c: () => transformCase(text => text.camelCase()),\n        // #KeyboardShortcut C (case mode) Capitalize\n        C: () => transformCase(text => text.capitalize()),\n        // #KeyboardShortcut k (case mode) kebab-case\n        k: () => transformCase(text => text.kebabCase()),\n        // #KeyboardShortcut l (case mode) lOWERFIRST\n        l: () => transformCase(text => text.lowerFirst()),\n        // #KeyboardShortcut L (case mode) tolower\n        L: () => transformCase(text => text.toLower()),\n        // #KeyboardShortcut Ctrl-l (case mode) lower case\n        '^l': () => transformCase(text => text.lowerCase()),\n        // #KeyboardShortcut s (case mode) snake_case\n        s: () => transformCase(text => text.snakeCase()),\n        // #KeyboardShortcut S (case mode) Start Case\n        S: () => transformCase(text => text.startCase()),\n        // #KeyboardShortcut u (case mode) Upperfirst\n        u: () => transformCase(text => text.upperFirst()),\n        // #KeyboardShortcut U (case mode) TOUPPER\n        U: () => transformCase(text => text.toUpper()),\n        // #KeyboardShortcut Ctrl-u (case mode) UPPER CASE\n        '^u': () => transformCase(text => text.upperCase()),\n        // #KeyboardShortcut t (case mode) To Title Case\n        t: () => transformCase(text => toTitleCase(text))\n      };\n\n      const operation = operations[(evt.ctrlKey ? '^' : '') + evt.key];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(evt.key);\n      }\n      return;\n    }\n\n    if (type === 'psych' && !evt.repeat) {\n      if (evt.key.length === 1 || evt.key === 'Enter') {\n        const { command, inclusive } = data;\n\n        cancelDefaultEvent();\n        this.popMode();\n\n        this.ac[command](evt.key, inclusive);\n        return;\n      }\n    }\n\n    if (type === 'command' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        i: () => {\n          this.ac.inlineLocalVariable();\n        },\n        Enter: () => {\n          this.pushMode('insert');\n        },\n        k: () => {\n          this.pushMode('kill');\n        },\n        'Shift-K': () => {\n          this.cm.execCommand('deleteLine');\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'generate' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        // #KeyboardShortcut i wrap in if-statement\n        i: () => {\n          this.ac.generateIf('if');\n        },\n        // #KeyboardShortcut f generate function\n        f: () => {\n          const line = this.cm.getLine(this.cm.getCursor().line);\n\n          if (/\\S/.test(line)) {\n            this.ac.newlineAndIndent();\n          }\n\n          this.cm.replaceSelection('function ');\n          this.cm.replaceSelection(`() {\n  \n}`, 'start');\n          this.cm.replaceSelection('fn', 'around');\n\n          const functionHeadLine = this.cm.getCursor().line;\n          this.cm::indentFromTo(functionHeadLine, functionHeadLine + 2)\n\n          this.ensureMode('insert');\n        },\n        // #KeyboardShortcut v declare variable\n        v: () => {\n          if (this.cm.somethingSelected()) {\n            this.ac.extractExpressionIntoLocalVariable();\n          } else {\n            const line = this.cm.getLine(this.cm.getCursor().line);\n\n            if (/\\S/.test(line)) {\n              this.ac.newlineAndIndent(true);\n            }\n            this.cm.execCommand('indentAuto');\n\n            this.cm.replaceSelection('const ');\n            this.cm.replaceSelection(' = $hole$;', 'start');\n            this.cm.replaceSelection('name', 'around');\n\n            this.ensureMode('insert');\n          }\n        },\n        // #KeyboardShortcut m insert method category\n        m: () => {\n          const line = this.cm.getLine(this.cm.getCursor().line);\n\n          if (/\\S/.test(line)) {\n            this.ac.newlineAndIndent();\n          }\n          this.cm.execCommand('indentAuto');\n\n          this.cm.replaceSelection('/*MD ## ');\n          this.cm.replaceSelection(' MD*/;', 'start');\n          this.cm.replaceSelection('Category', 'around');\n\n          this.ensureMode('insert');\n        },\n        // #KeyboardShortcut t insert todo for this line\n        t: () => {\n          const line = this.cm.getLine(this.cm.getCursor().line);\n\n          if (/\\S/.test(line)) {\n            this.ac.newlineAndIndent();\n          }\n          this.cm.execCommand('indentAuto');\n\n          this.cm.replaceSelection('// #TODO: ');\n\n          this.ensureMode('insert');\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        this.popMode();\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'select' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {};\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'lively' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        // #KeyboardShortcut Alt-N wrap selection in lively notify\n        n: () => this.ac.livelyNotify(),\n        // #KeyboardShortcut Alt-U insert lively4url\n        u: () => this.ac.lively4url()\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'kill' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        k: () => {\n          const cursor = this.cm.getCursor();\n          this.cm.execCommand('deleteLine');\n          this.cm.setCursor(cursor);\n          this.popMode();\n        },\n        l: () => {\n          this.cm.execCommand('killLine'); // cursor to end of line\n          this.popMode();\n        },\n        j: () => {\n          this.cm.execCommand('delLineLeft');\n          this.popMode();\n        },\n        o: () => {\n          this.cm.execCommand('delWrappedLineRight');\n          this.popMode();\n        },\n        u: () => {\n          this.cm.execCommand('delWrappedLineLeft');\n          this.popMode();\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n  }\n\n  ensureMode(type, data = {}) {\n    if (this.getMode().type === type) {\n      return;\n    }\n\n    this.pushMode(type, data);\n  }\n\n  pushMode(type, data = {}) {\n    this.stack.push({ type, data });\n    this.dispatchMode(type, data).enter();\n    this.renderModeStack();\n  }\n\n  popMode() {\n    if (this.stack.length === 0) {\n      lively.notify('no mode to pop');\n      return;\n    }\n    const { type, data } = this.stack.last;\n    this.dispatchMode(type, data).exit();\n    this.stack.pop();\n    this.renderModeStack();\n  }\n\n  dispatchMode(type, data) {\n    const modeMap = new Map();\n    modeMap.set('case', CaseMode);\n    modeMap.set('psych', PsychMode);\n    modeMap.set('command', CommandMode);\n    modeMap.set('insert', InsertMode);\n    modeMap.set('kill', KillMode);\n    modeMap.set('generate', GenerateMode);\n    modeMap.set('lively', LivelyMode);\n    modeMap.set('select', SelectMode);\n\n    let mode = modeMap.get(type);\n    if (!mode) {\n      lively.warn('No mode found for ' + type);\n      mode = Mode;\n    }\n    return new mode(this, data);\n  }\n\n  renderModeStack() {\n    const modeContainer = this.lcm::Morph.prototype.getSubmorph('#modes-indicator');\n    modeContainer.innerHTML = '';\n    modeContainer.append(...this.stack.map(({ type }) => <div style=\"background: aliceblue; color: cornflowerblue; border-top: 0.5px solid blue;\">{type}</div>).reverse());\n  }\n}\n\nself.__CodeMirrorModes__ = function __CodeMirrorModes__(lcm, cm) {\n  return new CodeMirrorModes(lcm, cm);\n};"]}