{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tabs/src/components/widgets/lively-code-mirror.js"],"names":["promisedEvent","through","generateUUID","uuid","debounce","isSet","boundEval","Morph","SyntaxChecker","Preferences","pt","Strings","letsScript","LivelyCodeMirrorWidgetImport","openMenu","spellCheck","fake","CodeMirror","indentationWidth","AEGutter","LivelyCodeMirrorCodeProvider","_","posEq","stripErrorString","self","__codeMirrorLoadingPromise__","undefined","s","toString","replace","a","b","line","ch","LivelyCodeMirror","HTMLElement","args","editor","mode","getAttribute","val","setAttribute","codeMirrorPath","lively4url","loadModule","path","force","console","warn","code","fetch","then","r","text","eval","e","error","loadCSS","lively","loadCSSThroughDOM","loadModules","System","import","loadTernModules","ternIsLoaded","terndir","loadJavaScriptThroughDOM","astCapabilities","myASTCapabilities","__ASTCapabilities__","codeProvider","ternWrapper","m","ternLoaded","TernCodeMirrorWrapper","initialize","_attrObserver","MutationObserver","mutations","forEach","mutation","type","attributeChangedCallback","attributeName","oldValue","target","observe","attributes","addEventListener","evt","onKeyDown","onPointerUp","ctrlKey","metaKey","key","ensureTextContent","button","replaceSelection","applyAttribute","attr","value","attachedCallback","isLoading","root","shadowRoot","textContent","decodeHTML","editView","event","CustomEvent","dispatchEvent","sleep","refresh","updateAExprDependencies","editorLoaded","container","querySelector","innerHTML","setEditor","lineNumbers","gutters","lint","setupEditor","setOption","setupEditorOptions","on","detail","checkSyntax","codeChanged","onCursorActivity","map","ea","name","keyEvent","cm","__CodeMirrorModes__","handleKeyEvent","clearHistory","getDoc","addKeys","keymap","keys","ensureExtraKeys","extraKeys","Object","assign","split","c","upperCase","defaultASTHandlers","enterPsychMode","which","inclusive","pushMode","command","braveNewWorld","slurp","barf","inlineLocalVariable","extractExpressionIntoLocalVariable","rename","swapConditional","fromCursor","psychInSmart","psych","psychEach","negateExpression","replaceParentWithSelection","newlineAndIndent","insertMarkdownComment","isJavaScript","openContextMenu","toggleOverwrite","setTimeout","execCommand","focus","fixHintsPosition","getSelectionOrLine","tryBoundEval","inspectIt","searchField","lastSearch","oldSearch","select","somethingSelected","indentSelection","doSave","getValue","result","tw","showType","notify","jumpToDefinition","jumpBack","showReferences","expandSelection","reduceSelection","selectNextASTNodeLikeThis","selectNextASTChild","selectNextReference","selectDeclaration","singalEditorbackNavigation","showAExprDependencyTextMarkers","selection","getSelection","closeEditor","query","onCancel","bubbles","cancelable","registerExtraKeys","options","keyMap","sublime","normalizeKeyMap","showToken","annotateScrollbar","updateArgHints","widgetEnter","cursorHead","getCursor","cursorAnchor","codemirror","closeCharacters","oldVal","newVal","length","getLine","getDoitContext","doitContext","window","that","setDoitContext","context","getTargetModule","targetModule","setTargetModule","module","str","match","boundEvalPython","log","xterm","document","term","__socket","data","__sendData","printWidget","wrapWidget","from","to","widget","createElement","classList","add","style","whiteSpace","promise","create","comp","display","minWidth","minHeight","marker","doc","markText","replacedWith","printResult","obj","isPromise","isAsync","setCursor","__asyncresult__","promisedWidget","objClass","constructor","call","Array","isMap","mapObj","sort","get","isArray","every","Node","String","table","setFromJSO","maxHeight","overflow","index","ensuredPrintString","inspector","inspect","hideWorkspace","span","parentElement","insertBefore","appendChild","border","resp","isError","LastError","handleError","catch","showElement","openInspector","detachedCallback","_attached","getWidgets","querySelectorAll","updateRangePreSave","_value","setValue","setCustomStyle","source","getCustomStyle","encodeHTML","resize","enableAutocompletion","getOption","isMarkdown","isHTML","changeModeForFile","filename","lang","dict","loadDictLang","startSpellCheck","current","livelyPrepareSave","livelyPreMigrate","lastScrollInfo","getScrollInfo","isFocused","activeElement","livelyMigrate","other","composedPath","removeEventListener","scrollTo","left","top","setPosition","scrollingElement","scrollLeft","scrollTop","subPt","getGlobalPosition","addTernFile","url","ternServer","server","addFile","mergeView","originalText","originalLeftText","_mergeView","MergeView","origLeft","orig","scrollbarStyle","highlightDifferences","connect","lineWrapping","collapseIdentical","resizeMergeView","editorHeight","height","mergeViewHeight","Math","max","leftOriginal","rightOriginal","setSize","newHeight","wrap","hideDataURLs","regEx","RegExp","exec","posFromIndex","div","backgroundColor","img","src","title","slice","createTextNode","wrapImports","id","getImportDeclarationRegex","LiteralString","JavaScriptIdentifier","ImportSpecifierPartSimple","ImportSpecifierPartRename","ImportSpecifierPart","ImportSpecifier","ImportDefaultSpecifier","ImportNamespaceSpecifier","anySpecifier","ImportDeclaration","importWidgetForRange","wrapLinks","link","lastWidget","input","range","find","keyCode","replaceRange","selectionStart","setSelection","checkForSyntaxErrors","found","startPos","indexOf","scrollToLine","heightAtLine","off","total","scrollToCodeElement","optionalText","start","end","rect","getWrapperElement","getBoundingClientRect","topVisibleLine","lineAtHeight","bottomVisibleLine","bottom","visibleLines","unsavedChanges","navbar","onDetailsContentCursorActivity","livelyMinimizedTitle","fileURL","valid","bind","getURL","pathname","allParents","includes","body"],"mappings":"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","file":"lively-code-mirror.js","sourcesContent":["/*MD \n# CodeMirror\n\nWorkspace / main source code editing component. \n\n![](lively-code-mirror.png){height=200}\n\nMD*/\n\nimport { promisedEvent, through, uuid as generateUUID } from 'utils';\nimport boundEval from 'src/client/bound-eval.js';\nimport Morph from \"src/components/widgets/lively-morph.js\";\nimport SyntaxChecker from 'src/client/syntax.js';\nimport { debounce } from \"utils\";\nimport Preferences from 'src/client/preferences.js';\nimport { pt } from 'src/client/graphics.js';\nimport 'src/client/stablefocus.js';\nimport Strings from 'src/client/strings.js';\nimport { letsScript } from 'src/client/vivide/vivide.js';\nimport LivelyCodeMirrorWidgetImport from 'src/components/widgets/lively-code-mirror-widget-import.js';\nimport openMenu from 'src/components/widgets/lively-code-mirror-context-menu.js';\nimport * as spellCheck from \"src/external/codemirror-spellcheck.js\";\nimport { isSet } from 'utils';\nimport fake from \"./lively-code-mirror-fake.js\";\nimport CodeMirror from \"src/external/code-mirror/lib/codemirror.js\";\nself.CodeMirror = CodeMirror; // for modules\nself.__codeMirrorLoadingPromise__ = self.__codeMirrorLoadingPromise__ || undefined;\nimport indentationWidth from 'src/components/widgets/indent.js';\nimport AEGutter from 'src/client/reactive/components/basic/AEGutter.js';\n\nimport LivelyCodeMirrorCodeProvider from 'src/components/widgets/lively-code-mirror-code-provider.js';\nimport 'src/components/widgets/ast-capabilities.js';\nimport 'src/components/widgets/lively-code-mirror-modes.js';\n\nimport _ from 'src/external/lodash/lodash.js';\n\nexport function stripErrorString(s) {\n  return s.toString().replace(/Error: workspace(js)?:[^:]*:/, \"Error:\").replace(/\\n {2}Evaluating workspace(js)?:.*/, \"\").replace(/\\n {2}Loading workspace(js)?:.*/, \"\").replace(/\\n {2}Instantiating workspace(js)?:.*/, \"\");\n}\n\nfunction posEq(a, b) {\n  return a.line == b.line && a.ch == b.ch;\n}\n\nexport default class LivelyCodeMirror extends HTMLElement {\n\n  fake(...args) {\n    fake(this.editor, ...args);\n  }\n\n  get mode() {\n    return this.getAttribute('mode');\n  }\n  set mode(val) {\n    return this.setAttribute('mode', val);\n  }\n\n  static get codeMirrorPath() {\n    return lively4url + \"/src/external/code-mirror/\";\n  }\n\n  static async loadModule(path, force) {\n    if (!self.CodeMirror) {\n      console.warn(\"CodeMirror is missing, could not initialize \" + path);\n      return;\n    }\n    var code = await fetch(this.codeMirrorPath + path).then(r => r.text());\n    try {\n      eval(code);\n    } catch (e) {\n      console.error(\"Could not load CodeMirror module \" + path, e);\n    }\n    // return lively.loadJavaScriptThroughDOM(\"codemirror_\"+path.replace(/[^A-Za-z]/g,\"\"),\n    //   this.codeMirrorPath + path, force)\n  }\n\n  static async loadCSS(path) {\n    return lively.loadCSSThroughDOM(\"codemirror_\" + path.replace(/[^A-Za-z]/g, \"\"), this.codeMirrorPath + path);\n  }\n\n  static async loadModules(force) {\n    // console.log(\"loadModules\", self.__codeMirrorLoadingPromise__);\n    if (self.__codeMirrorLoadingPromise__ && !force) return self.__codeMirrorLoadingPromise__;\n    self.__codeMirrorLoadingPromise__ = (async () => {\n\n      await this.loadModule(\"addon/fold/foldcode.js\");\n\n      await this.loadModule(\"mode/javascript/javascript.js\");\n      await this.loadModule(\"mode/xml/xml.js\");\n      await this.loadModule(\"mode/css/css.js\");\n      await this.loadModule(\"mode/diff/diff.js\");\n\n      await this.loadModule(\"mode/markdown/markdown.js\");\n      await this.loadModule(\"mode/htmlmixed/htmlmixed.js\");\n      await this.loadModule(\"addon/mode/overlay.js\");\n      await this.loadModule(\"mode/gfm/gfm.js\");\n      await this.loadModule(\"mode/stex/stex.js\");\n      await this.loadModule(\"mode/jsx/jsx.js\");\n      await this.loadModule(\"mode/python/python.js\");\n      await this.loadModule(\"mode/clike/clike.js\");\n      await this.loadModule(\"mode/shell/shell.js\");\n      \n      await this.loadModule(\"addon/edit/matchbrackets.js\");\n      await this.loadModule(\"addon/edit/closetag.js\");\n      await this.loadModule(\"addon/edit/closebrackets.js\");\n      await this.loadModule(\"addon/edit/continuelist.js\");\n      await this.loadModule(\"addon/edit/matchtags.js\");\n      await this.loadModule(\"addon/edit/trailingspace.js\");\n      await this.loadModule(\"addon/hint/show-hint.js\");\n      // await this.loadModule(\"addon/hint/javascript-hint.js\");\n      await this.loadModule(\"addon/search/searchcursor.js\");\n      await this.loadModule(\"addon/search/search.js\");\n      await this.loadModule(\"addon/search/jump-to-line.js\");\n      await this.loadModule(\"addon/search/matchesonscrollbar.js\");\n      await this.loadModule(\"addon/search/match-highlighter.js\");\n      await this.loadModule(\"addon/scroll/annotatescrollbar.js\");\n      await this.loadModule(\"addon/comment/comment.js\");\n      await this.loadModule(\"addon/dialog/dialog.js\");\n      await this.loadModule(\"addon/scroll/simplescrollbars.js\"\n\n      //await System.import(\"https://raw.githubusercontent.com/jshint/jshint/master/dist/jshint.js\");\n      //await lively.loadJavaScriptThroughDOM(\"jshintAjax\", \"https://ajax.aspnetcdn.com/ajax/jshint/r07/jshint.js\");\n      //await lively.loadJavaScriptThroughDOM(\"eslint\", \"http://eslint.org/js/app/eslint.js\");\n      );await this.loadModule(\"addon/lint/lint.js\");\n      await this.loadModule(\"addon/lint/javascript-lint.js\");\n      \n      await this.loadModule(\"../eslint/eslint.js\"); // #TODO #BUG  Error: only one instance of babel-polyfill is allowed\n      // await this.loadModule(\"../eslint/eslint-lint.js\", force);\n      await System.import(lively4url + '/src/external/eslint/eslint-lint.js');\n      await this.loadModule(\"addon/merge/merge.js\");\n      await this.loadModule(\"addon/selection/mark-selection.js\");\n      await this.loadModule(\"keymap/sublime.js\");\n      await System.import(lively4url + '/src/components/widgets/lively-code-mirror-hint.js');\n\n      this.loadCSS(\"addon/hint/show-hint.css\");\n      this.loadCSS(\"addon/lint/lint.css\");\n      lively.loadCSSThroughDOM(\"CodeMirrorCSS\", lively4url + \"/src/components/widgets/lively-code-mirror.css\");\n    })();\n    return self.__codeMirrorLoadingPromise__;\n  }\n\n  // #TODO #Refactor not needed anymore\n  static async loadTernModules() {\n    if (this.ternIsLoaded) return;\n\n    await this.loadModule(\"addon/tern/tern.js\");\n\n    var terndir = lively4url + '/src/external/tern/';\n    await lively.loadJavaScriptThroughDOM(\"tern_acorn\", terndir + 'acorn.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_acorn_loose\", terndir + 'acorn_loose.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_walk\", terndir + 'walk.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_polyfill\", terndir + 'polyfill.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_signal\", terndir + 'signal.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_tern\", terndir + 'tern.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_def\", terndir + 'def.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_comment\", terndir + 'comment.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_infer\", terndir + 'infer.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_plugin_modules\", terndir + 'modules.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_plugin_esmodules\", terndir + 'es_modules.js');\n    this.ternIsLoaded = true;\n  }\n\n  get astCapabilities() {\n    if (!this.myASTCapabilities || !(this.myASTCapabilities instanceof self.__ASTCapabilities__\n)) {\n      const codeProvider = new LivelyCodeMirrorCodeProvider(this, this.editor);\n      this.myASTCapabilities = new self.__ASTCapabilities__\n(codeProvider);\n    }\n\n    return this.myASTCapabilities;\n  }\n\n  get ternWrapper() {\n    return System.import('src/components/widgets/tern-wrapper.js').then(m => {\n      this.ternLoaded = true;\n      return m.TernCodeMirrorWrapper;\n    });\n  }\n\n  initialize() {\n    this._attrObserver = new MutationObserver(mutations => {\n      mutations.forEach(mutation => {\n        if (mutation.type == \"attributes\") {\n          // console.log(\"observation\", mutation.attributeName,mutation.target.getAttribute(mutation.attributeName));\n          this.attributeChangedCallback(mutation.attributeName, mutation.oldValue, mutation.target.getAttribute(mutation.attributeName));\n        }\n      });\n    });\n    this._attrObserver.observe(this, { attributes: true });\n    \n    this.addEventListener(\"keydown\", evt => this.onKeyDown(evt))\n    this.addEventListener(\"pointerup\", evt => this.onPointerUp(evt))\n  }\n  \n  onKeyDown(evt) {\n    if ((evt.ctrlKey || evt.metaKey) && evt.key === \"c\") {\n      this.ensureTextContent() // widgets might have a word here..\n    }\n    \n  }\n  \n  onPointerUp(evt) {\n    // keyboard is running out.. so go for the mouse\n    // just a test if this is usefull... TODO make it customizable\n    if (evt.button === 3) {\n      this.editor.replaceSelection(\"“\")\n    } else if (evt.button === 4) {\n      this.editor.replaceSelection(\"”\")\n    }\n  }\n\n  applyAttribute(attr) {\n    var value = this.getAttribute(attr);\n    if (value !== undefined) {\n      this.setAttribute(attr, value);\n    }\n  }\n\n  async attachedCallback() {\n    if (this.isLoading || this.editor) return;\n    this.isLoading = true;\n    this.root = this.shadowRoot; // used in code mirror to find current element\n    await LivelyCodeMirror.loadModules(); // lazy load modules...\n\n    if (this.textContent) {\n      var value = this.decodeHTML(this.textContent);\n    } else {\n      value = this.value || \"\";\n    }\n    this.editView(value);\n    this.isLoading = false;\n    // console.log(\"[editor] #dispatch editor-loaded\")\n    var event = new CustomEvent(\"editor-loaded\");\n    // event.stopPropagation();\n    this.dispatchEvent(event);\n    this[\"editor-loaded\"] = true; // event can sometimes already be fired\n\n    await lively.sleep(0);\n    this.editor.refresh();\n    this.updateAExprDependencies();\n  }\n\n  async editorLoaded() {\n    if (!this[\"editor-loaded\"]) {\n      return promisedEvent(this, \"editor-loaded\");\n    }\n  }\n\n  editView(value) {\n    if (!value) value = this.value || \"\";\n    var container = this.shadowRoot.querySelector(\"#code-mirror-container\");\n    container.innerHTML = \"\";\n    this.setEditor(CodeMirror(container, {\n      value: value,\n      lineNumbers: true,\n      gutters: [\"leftgutter\", \"CodeMirror-linenumbers\", \"rightgutter\", \"CodeMirror-lint-markers\"],\n      lint: true\n    }));\n\n    //load astCapabilities\n    this.astCapabilities;\n  }\n\n  setEditor(editor) {\n    this.editor = editor;\n    this.setupEditor();\n  }\n\n  setupEditor() {\n    var editor = this.editor;\n    if (this.mode) {\n      editor.setOption(\"mode\", this.mode);\n    }\n    this.setupEditorOptions(editor\n    // edit addons\n    // editor.setOption(\"showTrailingSpace\", true)\n    // editor.setOption(\"matchTags\", true)\n\n    );editor.on(\"change\", evt => this.dispatchEvent(new CustomEvent(\"change\", { detail: evt })));\n    editor.on(\"change\", (() => this.checkSyntax()).debounce(500));\n    editor.on(\"change\", (() => this.astCapabilities.codeChanged()).debounce(200));\n\n    editor.on(\"cursorActivity\", (() => this.onCursorActivity()).debounce(500));\n\n    // apply attributes\n    _.map(this.attributes, ea => ea.name).forEach(ea => this.applyAttribute(ea));\n\n    // if(Preferences.get('UseTernInCodeMirror')) {\n    //   this.enableTern();\n    // }\n    editor.on(\"keydown\", (...args) => this.keyEvent(...args));\n  }\n\n  keyEvent(cm, evt) {\n    return self.__CodeMirrorModes__(this, cm).handleKeyEvent(evt);\n  }\n\n  clearHistory() {\n    var cm = this.editor;\n    cm.getDoc().clearHistory();\n  }\n\n  addKeys(keymap) {\n    var keys = this.ensureExtraKeys();\n    this.extraKeys = Object.assign(keys, keymap);\n  }\n\n  ensureExtraKeys() {\n    if (!this.extraKeys) {\n      const keys = '1234567890qwertyuiopasdf hjk zxcvbnm'.replace(/\\s/, '').split('').map(c => c.upperCase());\n      //       const defaultASTHandlers = _.fromPairs(keys.flatMap(c => {\n      //         return ['Alt-', 'Ctrl-Alt-', 'Shift-Alt-'].map(shortcut => {\n      //           const shortcutC = shortcut + c;\n      //           const prop = shortcutC.camelCase();\n\n      //           return [shortcutC, cm => {\n      //             this.astCapabilities(cm).then(ac => {\n      //               if (ac[prop]) {\n      //                 ac[prop]();\n      //               } else {\n      //                 lively.notify(shortcutC, 'No Shortcut defined yet.');\n      //               }\n      //             });\n      //           }];\n      //         });\n      //       }));\n      const defaultASTHandlers = {};\n\n      const enterPsychMode = (cm, which, inclusive) => {\n        self.__CodeMirrorModes__(this, cm).pushMode('psych', { command: which, inclusive });\n      };\n\n      this.extraKeys = Object.assign(defaultASTHandlers, {\n\n        // #KeyboardShortcut Alt-X shortcut for experimental features\n        \"Alt-X\": cm => this.astCapabilities.braveNewWorld(),\n\n        // #KeyboardShortcut Alt-9 slurp backward\n        \"Alt-9\": cm => this.astCapabilities.slurp(false),\n        // #KeyboardShortcut Alt-0 slurp forward\n        \"Alt-0\": cm => this.astCapabilities.slurp(true),\n        // #KeyboardShortcut Alt-[ barf backward\n        \"Alt-[\": cm => this.astCapabilities.barf(false),\n        // #KeyboardShortcut Alt-] barf forward\n        \"Alt-]\": cm => this.astCapabilities.barf(true),\n\n        // #KeyboardShortcut Alt-Enter enter 'command' mode\n        \"Alt-Enter\": cm => self.__CodeMirrorModes__(this, cm).pushMode('command'),\n        // #KeyboardShortcut Alt-I Inline variable\n        \"Alt-I\": cm => {\n          this.astCapabilities.inlineLocalVariable();\n        },\n\n        // #KeyboardShortcut Alt-E Extract Expression into a local variable\n        \"Alt-E\": cm => {\n          this.astCapabilities.extractExpressionIntoLocalVariable();\n        },\n        // #KeyboardShortcut Alt-R Rename this identifier\n        \"Alt-R\": cm => {\n          this.astCapabilities.rename();\n        },\n        // #KeyboardShortcut Alt-T enter 'case' mode\n        \"Alt-T\": cm => self.__CodeMirrorModes__(this, cm).pushMode('case'),\n\n        // #KeyboardShortcut Alt-A Swap then and else block of a conditional\n        \"Alt-A\": cm => this.astCapabilities.swapConditional(),\n        // #KeyboardShortcut Alt-S Select code snippets\n        \"Alt-S\": cm => self.__CodeMirrorModes__(this, cm).pushMode('select', { fromCursor: false }),\n        // #KeyboardShortcut Shift-Alt-S Select code under cursor snippets\n        \"Shift-Alt-S\": cm => self.__CodeMirrorModes__(this, cm).pushMode('select', { fromCursor: true }),\n        // #KeyboardShortcut Alt-D psych within (smart): paste group surrounding mouse position enclosed by brackets, braces, or quotes (exclusive)\n        \"Alt-D\": cm => this.astCapabilities.psychInSmart(false),\n        // #KeyboardShortcut Shift-Alt-D psych within (smart): paste group surrounding mouse position enclosed by brackets, braces, or quotes (inclusive)\n        \"Shift-Alt-D\": cm => this.astCapabilities.psychInSmart(true),\n        // #KeyboardShortcut Alt-F psych within: paste group surrounding mouse position with (exclusive) <character>\n        \"Alt-F\": cm => enterPsychMode(cm, 'psychIn', false),\n        // #KeyboardShortcut Shift-Alt-F psych within: paste group surrounding mouse position with (inclusive) <character>\n        \"Shift-Alt-F\": cm => enterPsychMode(cm, 'psychIn', true),\n        // #KeyboardShortcut Alt-G code snippets generator\n        \"Alt-G\": cm => self.__CodeMirrorModes__(this, cm).pushMode('generate'),\n\n        // #KeyboardShortcut Ctrl-Alt-C enter 'psych' mode\n        \"Ctrl-Alt-C\": cm => self.__CodeMirrorModes__(this, cm).pushMode('psych'),\n        // #KeyboardShortcut Alt-C psych: paste word from mouse position\n        \"Alt-C\": cm => this.astCapabilities.psych(),\n        // #KeyboardShortcut Shift-Alt-C psych each: paste word part from mouse position\n        \"Shift-Alt-C\": cm => this.astCapabilities.psychEach(),\n        // #KeyboardShortcut Alt-V psych to (exclusive): paste from word on mouse position up to (exclusive) <character>\n        \"Alt-V\": cm => enterPsychMode(cm, 'psychTo', false),\n        // #KeyboardShortcut Shift-Alt-V psych to (inclusive): paste from word on mouse position up to (inclusive) <character>\n        \"Shift-Alt-V\": cm => enterPsychMode(cm, 'psychTo', true),\n        // #KeyboardShortcut Alt-B enter lively-specific code snippets\n        \"Alt-B\": cm => self.__CodeMirrorModes__(this, cm).pushMode('lively'),\n\n        // #KeyboardShortcut Alt-N negate an expression\n        \"Alt-N\": cm => this.astCapabilities.negateExpression(),\n        // #KeyboardShortcut Alt-U Replace parent node with selection\n        \"Alt-U\": cm => this.astCapabilities.replaceParentWithSelection(),\n        // #KeyboardShortcut Alt-O Insert new line below\n        \"Alt-O\": cm => this.astCapabilities.newlineAndIndent(true),\n        // #KeyboardShortcut Shift-Alt-O Insert new line above\n        \"Shift-Alt-O\": cm => this.astCapabilities.newlineAndIndent(false),\n\n        // #KeyboardShortcut Alt-/ insert markdown comment\n        \"Alt-/\": cm => this.astCapabilities.insertMarkdownComment(),\n\n        // #KeyboardShortcut Alt-M ast refactoring/autocomplete menu\n        \"Alt-M\": cm => {\n          if (this.isJavaScript) {\n            this.openContextMenu(cm);\n          } else {\n            lively.warn(\"Context Menu doesn't work outside of js files for now!\");\n          }\n        },\n\n        \"Insert\": cm => {\n          // do nothing... the INSERT mode is so often activated by accident \n        },\n        \"Ctrl-Insert\": cm => {\n          // INSERT mode is so often activated by accident, require CTRL now \n          cm.toggleOverwrite();\n        },\n        // #KeyboardShortcut Ctrl-H search and replace\n        \"Ctrl-H\": cm => {\n          setTimeout(() => {\n            this.editor.execCommand(\"replace\");\n            this.shadowRoot.querySelector(\".CodeMirror-search-field\").focus();\n          }, 10);\n        },\n        // #KeyboardShortcut Ctrl-Space auto complete\n        \"Ctrl-Space\": cm => {\n          this.fixHintsPosition();\n          cm.execCommand(\"autocomplete\");\n        },\n        // #KeyboardShortcut Ctrl-Alt-Space auto complete\n        \"Ctrl-Alt-Space\": cm => {\n          this.fixHintsPosition();\n          cm.execCommand(\"autocomplete\");\n        },\n        // #KeyboardShortcut Ctrl-P eval and print selection or line\n        \"Ctrl-P\": cm => {\n          let text = this.getSelectionOrLine();\n          this.tryBoundEval(text, true);\n        },\n        // #KeyboardShortcut Ctrl-I eval and inspect selection or line\n        \"Ctrl-I\": cm => {\n          let text = this.getSelectionOrLine();\n          this.inspectIt(text);\n        },\n        // #KeyboardShortcut Ctrl-D eval selection or line (do it)\n        \"Ctrl-D\": (cm, b, c) => {\n          let text = this.getSelectionOrLine();\n          this.tryBoundEval(text, false);\n          return true;\n        },\n        // #HACK we seem to be incapable of dealling automatically with code snippets that contain \"await\", so lets make it explicit #FutureWork #Research\n        // #KeyboardShortcut Shift-Ctrl-D async eval selection or line (do it)\n        \"Shift-Ctrl-D\": (cm, b, c) => {\n          let text = this.getSelectionOrLine();\n          this.tryBoundEval(\";(async () => { \" + text + \"})()\", false);\n          return true;\n        },\n        // #KeyboardShortcut Ctrl-F search\n        \"Ctrl-F\": cm => {\n          // something immediately grabs the \"focus\" and we close the search dialog..\n          // #Hack...\n          setTimeout(() => {\n            this.editor.execCommand(\"findPersistent\");\n            var searchField = this.shadowRoot.querySelector(\".CodeMirror-search-field\");\n            if (searchField) {\n              // start with the last search..\n              if (!searchField.value && this.lastSearch) {\n                var oldSearch = searchField.value;\n                searchField.value = this.lastSearch;\n              } else {\n                this.lastSearch = searchField.value; // we got a new search\n              }\n              lively.addEventListener(\"lively4\", searchField, \"input\", () => {\n                this.lastSearch = searchField.value;\n              });\n              searchField.focus();\n              searchField.select();\n            }\n          }, 10\n          // editor.execCommand(\"find\")\n          );\n        },\n\n        // #KeyboardShortcut Ctrl-Alt-Right multiselect next\n        \"Ctrl-Alt-Right\": \"selectNextOccurrence\",\n        // #KeyboardShortcut Ctrl-Alt-Left undo multiselect\n        \"Ctrl-Alt-Left\": \"undoSelection\",\n\n        // #KeyboardShortcut Ctrl-/ indent selection\n        \"Ctrl-/\": \"toggleCommentIndented\",\n        // #KeyboardShortcut Ctrl-# indent selection\n        \"Ctrl-#\": \"toggleCommentIndented\",\n        // #KeyboardShortcut Tab insert tab or soft indent\n        'Tab': cm => {\n          if (cm.somethingSelected()) {\n            cm.indentSelection(\"add\");\n          } else {\n            cm.execCommand('insertSoftTab');\n          }\n        },\n        // #KeyboardShortcut Ctrl-S save content\n        \"Ctrl-S\": cm => {\n          this.doSave(cm.getValue());\n        },\n        \n        // #KeyboardShortcut Ctrl-Alt-V eval and open in vivide\n        \"Ctrl-Alt-V\": async cm => {\n          let text = this.getSelectionOrLine();\n          let result = await this.tryBoundEval(text, false);\n          letsScript(result);\n        },\n        // #KeyboardShortcut Ctrl-Alt-I show type using tern\n        \"Ctrl-Alt-I\": cm => {\n          this.ternWrapper.then(tw => tw.showType(cm, this));\n        },\n        // #KeyboardShortcut Alt-. jump to definition using tern\n        \"Alt-.\": cm => {\n          lively.notify(\"try to JUMP TO DEFINITION\");\n          this.ternWrapper.then(tw => tw.jumpToDefinition(cm, this));\n        },\n        // #KeyboardShortcut Alt-, jump back from definition using tern\n        \"Alt-,\": cm => {\n          this.ternWrapper.then(tw => tw.jumpBack(cm, this));\n        },\n        // #KeyboardShortcut Shift-Alt-. show references using tern\n        \"Shift-Alt-.\": cm => {\n          this.ternWrapper.then(tw => tw.showReferences(cm, this));\n        },\n\n        /*MD #AST-Navigation MD*/\n\n        // #KeyboardShortcut Alt-Up Expand selection in ast-aware manner\n        \"Alt-Up\": cm => {\n          this.astCapabilities.expandSelection(cm);\n        },\n        // #KeyboardShortcut Alt-Down Reduce selection in ast-aware manner\n        \"Alt-Down\": cm => {\n          this.astCapabilities.reduceSelection(cm);\n        },\n        // #KeyboardShortcut Alt-Shift-Up Select previous like this\n        \"Shift-Alt-Up\": cm => {\n          this.astCapabilities.selectNextASTNodeLikeThis(true);\n        },\n        // #KeyboardShortcut Alt-Shift-Down Select next like this\n        \"Shift-Alt-Down\": cm => {\n          this.astCapabilities.selectNextASTNodeLikeThis(false);\n        },\n\n        // #KeyboardShortcut Alt-Left Select previous element in ast-aware manner\n        \"Alt-Left\": cm => {\n          this.astCapabilities.selectNextASTChild(true);\n        },\n        // #KeyboardShortcut Alt-Right Select next element in ast-aware manner\n        \"Alt-Right\": cm => {\n          this.astCapabilities.selectNextASTChild(false);\n        },\n        // #KeyboardShortcut Alt-Shift-Left Select previous reference\n        \"Shift-Alt-Left\": cm => {\n          this.astCapabilities.selectNextReference(true);\n        },\n        // #KeyboardShortcut Alt-Shift-Right Select next reference\n        \"Shift-Alt-Right\": cm => {\n          this.astCapabilities.selectNextReference(false);\n        },\n\n        // #KeyboardShortcut Alt-J Jump to declaration of this identifier\n        \"Alt-J\": cm => {\n          this.astCapabilities.selectDeclaration();\n        },\n\n        // #KeyboardShortcut Alt-Backspace Leave Editor and go to Navigation\n        \"alt-Backspace\": async cm => {\n          this.singalEditorbackNavigation();\n        },\n        // #KeyboardShortcut Shift-Alt-Backspace Leave and Close Editor and go to Navigation\n        \"shift-alt-Backspace\": async cm => {\n          this.singalEditorbackNavigation(true);\n        },\n        // #KeyboardShortcut Shift-Alt-A show additional info of this Active Expression\n        \"Shift-Alt-A\": async cm => {\n          this.showAExprDependencyTextMarkers();\n        },\n        // #Async #Workspace #Snippet #Workaround missing global async/await support in JavaScript / our Workspaces\n        \"Ctrl-Alt-A\": cm => {\n          var selection = this.editor.getSelection\n          // #TODO how can we have custom snippets?\n          ();this.editor.replaceSelection(`var value;\n(async () => {\n  value = ${selection}\n})()`);\n          this.editor.execCommand(`goWordLeft`);\n          this.editor.execCommand(`goCharLeft`);\n        },\n        // #KeyboardShortcut Ctrl-Shift-A Update Active Expression Dependencies\n        \"Ctrl-Shift-A\": cm => {\n          this.updateAExprDependencies();\n        }\n\n      });\n    }\n\n    return this.extraKeys;\n  }\n\n  openContextMenu(cm) {\n    openMenu(this.astCapabilities, cm, this);\n  }\n\n  async singalEditorbackNavigation(closeEditor) {\n    var container = lively.query(this, \"lively-container\");\n    if (container) {\n      if (closeEditor) await container.onCancel();\n      await lively.sleep(10\n      // it seems not to bubble across shadow root boundaries #Bug ?\n      // so we do it manually, but keep it an event\n      );container.dispatchEvent(new CustomEvent(\"editorbacknavigation\", {\n        bubbles: true,\n        cancelable: true\n      }));\n    }\n  }\n\n  registerExtraKeys(options) {\n    if (options) this.addKeys(options);\n    var keys = {};\n    keys = Object.assign(keys, CodeMirror.keyMap.sublime);\n    keys = Object.assign(keys, this.ensureExtraKeys());\n    this.editor.setOption(\"extraKeys\", CodeMirror.normalizeKeyMap(keys));\n  }\n\n  setupEditorOptions(editor) {\n    editor.setOption(\"matchBrackets\", true);\n    editor.setOption(\"styleSelectedText\", true);\n    editor.setOption(\"autoCloseBrackets\", true);\n    editor.setOption(\"autoCloseTags\", true);\n    editor.setOption(\"scrollbarStyle\", \"simple\");\n    editor.setOption(\"scrollbarStyle\", \"simple\");\n\n    editor.setOption(\"tabSize\", indentationWidth());\n    editor.setOption(\"indentWithTabs\", false);\n    editor.setOption(\"indentUnit\", indentationWidth());\n\n    editor.setOption(\"highlightSelectionMatches\", { showToken: /\\w/, annotateScrollbar: true\n\n      // editor.setOption(\"keyMap\",  \"sublime\")\n\n    });editor.on(\"cursorActivity\", cm => {\n      if (this.ternLoaded) {\n        this.ternWrapper.then(tw => tw.updateArgHints(cm, this));\n      }\n    });\n\n    // http://bl.ocks.org/jasongrout/5378313#fiddle.js\n    editor.on(\"cursorActivity\", cm => {\n      // this.ternWrapper.then(tw => tw.updateArgHints(cm, this));\n      const widgetEnter = cm.widgetEnter;\n      cm.widgetEnter = undefined;\n      if (widgetEnter) {\n        // check to see if movement is purely navigational, or if it\n        // doing something like extending selection\n        var cursorHead = cm.getCursor('head');\n        var cursorAnchor = cm.getCursor('anchor');\n        if (posEq(cursorHead, cursorAnchor)) {\n          widgetEnter();\n        }\n      }\n    });\n    editor.setOption(\"hintOptions\", {\n      container: this.shadowRoot.querySelector(\"#code-mirror-hints\"),\n      codemirror: this,\n      closeCharacters: /\\;/ // we want to keep the hint open when typing spaces and \"{\" in imports...\n    });\n\n    this.registerExtraKeys();\n  }\n\n  // Fires when an attribute was added, removed, or updated\n  attributeChangedCallback(attr, oldVal, newVal) {\n    if (!this.editor) {\n      return false;\n    }\n    switch (attr) {\n      // case \"theme\":\n      //     this.editor.setTheme( newVal );\n      //     break;\n      case \"mode\":\n        this.editor.setOption('mode', newVal);\n        break;\n      // case \"fontsize\":\n      //     this.editor.setFontSize( newVal );\n      //     break;\n      // case \"softtabs\":\n      //     this.editor.getSession().setUseSoftTabs( newVal );\n      //     break;\n      // case \"tern\":\n      //   if (newVal)\n      // this.enableTern()\n      //   break;\n\n      case \"tabsize\":\n        this.setOption(\"tabSize\", newVal);\n        break;\n      // case \"readonly\":\n      //     this.editor.setReadOnly( newVal );\n      //     break;\n      case \"wrapmode\":\n        this.setOption(\"lineWrapping\", newVal);\n        break;\n    }\n  }\n\n  setOption(name, value) {\n    if (!this.editor) return; // we loose...\n    this.editor.setOption(name, value);\n  }\n\n  doSave(text) {\n    this.tryBoundEval(text // just a default implementation...\n    );\n  }\n\n  getSelectionOrLine() {\n    var text = this.editor.getSelection();\n    if (text.length > 0) return text;else return this.editor.getLine(this.editor.getCursor(\"end\").line);\n  }\n\n  getDoitContext() {\n    return this.doitContext || window.that;\n  }\n\n  setDoitContext(context) {\n    return this.doitContext = context;\n  }\n\n  getTargetModule() {\n    // lazily initialize a target module name as fallback\n    return this.targetModule || (this.targetModule = lively4url + '/unnamed_module_' + generateUUID().replace(/-/g, '_')); // make it relative to a real path so that relative modules work\n  }\n\n  setTargetModule(module) {\n    return this.targetModule = module;\n  }\n\n  async boundEval(str) {\n    // console.log(\"bound eval \" + str)\n    var targetModule = this.getTargetModule();\n\n    if (targetModule.match(/.py$/)) {\n      return this.boundEvalPython(str);\n    }\n    // Ensure target module loaded (for .js files only)\n    if (targetModule.match(/.js$/)) {\n      await System.import(targetModule);\n    }\n    console.log(\"EVAL (CM)\", targetModule);\n    // src, topLevelVariables, thisReference, <- finalStatement\n    return boundEval(str, this.getDoitContext(), targetModule);\n  }\n\n  async boundEvalPython(str) {\n    var result = \"\";\n    var xterm = document.querySelector(\"lively-xterm.python\");\n    if (xterm) {\n      var term = xterm.term;\n      term.__socket.addEventListener('message', function (event) {\n        result += event.data;\n      });\n      // how long do we want to wait?\n\n      term.__sendData(str + \"\\n\");\n\n      while (!result.match(\">>>\")) {\n        // busy wait for the prompt\n        await lively.sleep(50);\n      }\n      // strip input and prompt.... oh what a hack\n      return { value: result.replace(str, \"\").replace(/^[\\r\\n]+/, \"\").replace(/>>> $/, \"\") };\n    } else {\n      lively.notify(\"no open python terminal session found\");\n    }\n    return { value: \"\" };\n  }\n\n  printWidget(name) {\n    return this.wrapWidget(name, this.editor.getCursor(true), this.editor.getCursor(false));\n  }\n\n  wrapWidget(name, from, to, options) {\n    var widget = document.createElement(\"span\");\n    widget.classList.add(\"lively-widget\");\n    widget.style.whiteSpace = \"normal\";\n    var promise = lively.create(name, widget);\n    promise.then(comp => {\n      Object.assign(comp.style, {\n        display: \"inline\",\n        // backgroundColor: \"rgb(250,250,250)\",\n        display: \"inline-block\",\n        minWidth: \"20px\",\n        minHeight: \"20px\"\n      });\n    });\n    // #TODO, we assume that it will keep the first widget, and further replacements do not work.... and get therefore thrown away\n    var marker = this.editor.doc.markText(from, to, Object.assign({\n      replacedWith: widget\n    }, options));\n    promise.then(comp => comp.marker = marker);\n\n    return promise;\n  }\n\n  async printResult(result, obj, isPromise) {\n    var editor = this.editor;\n    var text = result;\n    var isAsync = false;\n    this.editor.setCursor(this.editor.getCursor(\"end\"\n    // don't replace existing selection\n    ));this.editor.replaceSelection(result, \"around\");\n    if (obj && obj.__asyncresult__) {\n      obj = obj.__asyncresult__; // should be handled in bound-eval.js #TODO\n      isAsync = true;\n    }\n    var promisedWidget;\n    var objClass = obj && obj.constructor && obj.constructor.name || typeof obj;\n    if (isSet.call(obj)) {\n      obj = Array.from(obj);\n    }\n\n    if (_.isMap(obj)) {\n      var mapObj = {};\n      Array.from(obj.keys()).sort().forEach(key => mapObj[key] = obj.get(key));\n      obj = mapObj;\n    }\n    if (Array.isArray(obj) && !obj.every(ea => ea instanceof Node)) {\n      if (obj.every(ea => typeof ea == 'object' && !(ea instanceof String))) {\n        promisedWidget = this.printWidget(\"lively-table\").then(table => {\n          table.setFromJSO(obj);\n          table.style.maxHeight = \"300px\";\n          table.style.overflow = \"auto\";\n          return table;\n        });\n      } else {\n        promisedWidget = this.printWidget(\"lively-table\").then(table => {\n          table.setFromJSO(obj.map((ea, index) => {\n            return {\n              index: index,\n              value: this.ensuredPrintString(ea)\n            };\n          }));\n          table.style.maxHeight = \"300px\";\n          table.style.overflow = \"auto\";\n          return table;\n        });\n      }\n    } else if (objClass == \"Matrix\") {\n      // obj = obj.toString()\n      debugger;\n    } else if (typeof obj == 'object' && obj !== null) {\n      promisedWidget = this.printWidget(\"lively-inspector\").then(inspector => {\n        inspector.inspect(obj);\n        inspector.hideWorkspace();\n        return inspector;\n      });\n    }\n    if (promisedWidget) {\n      var widget = await promisedWidget;\n      var span = <span style=\"border-top:2px solid darkgray;color:darkblue\">\n          {isPromise ? \"PROMISED\" : \"\"} <u>:{objClass}</u> </span>;\n      widget.parentElement.insertBefore(span, widget);\n      span.appendChild(widget);\n      if (isAsync && promisedWidget) {\n        if (widget) widget.style.border = \"2px dashed blue\";\n      }\n    }\n  }\n\n  ensuredPrintString(obj) {\n    var s = \"\";\n    try {\n      s += obj; // #HACK some objects cannot be printed any more\n    } catch (e) {\n      s += `UnprintableObject[Error: ${e}]`; // so we print something else\n    }\n    return s;\n  }\n\n  async tryBoundEval(str, printResult) {\n    var resp = await this.boundEval(str);\n    if (resp.isError) {\n      var e = resp.value;\n      console.error(e);\n      if (printResult) {\n        window.LastError = e;\n        this.printResult(stripErrorString(\"\" + e));\n      } else {\n        lively.handleError(e);\n      }\n      return e;\n    }\n    var result = resp.value;\n\n    if (printResult) {\n      // alaways wait on promises.. when interactively working...\n      if (result && result.then) {\n        //  && result instanceof Promise\n        // we will definitly return a promise on which we can wait here\n        result.then(result => {\n          this.printResult(\"RESOLVED: \" + this.ensuredPrintString(result), result, true);\n        }).catch(error => {\n          console.error(error);\n          // window.LastError = error;\n          this.printResult(stripErrorString(\"Error in Promise: \\n\" + error));\n        });\n      } else {\n        this.printResult(\" \" + this.ensuredPrintString(result), result);\n        if (result instanceof HTMLElement) {\n          try {\n            lively.showElement(result);\n          } catch (e) {\n            // silent fail... not everything can be shown...\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  async inspectIt(str) {\n    var result = await this.boundEval(str);\n    if (!result.isError) {\n      result = result.value;\n    }\n    if (result.then) {\n      result = await result; // wait on any promise\n    }\n    lively.openInspector(result, undefined, str);\n  }\n\n  doSave(text) {\n    this.tryBoundEval(text // just a default implementation...\n    );\n  }\n\n  detachedCallback() {\n    this._attached = false;\n  }\n  \n  getWidgets() {\n    return this.shadowRoot.querySelectorAll(\".inline-embedded-widget\")\n  }\n  \n  ensureTextContent() {\n    this.getWidgets().forEach(ea => {\n      if (ea.updateRangePreSave) {\n        ea.updateRangePreSave()\n      }\n    })\n  }\n\n  // #important\n  get value() {\n    if (this.editor) {\n      this.ensureTextContent()\n      return this.editor.getValue();\n    } else {\n      return this._value;\n    }\n  }\n\n  set value(text) {\n    if (text === undefined) text = \"\";\n    if (this.editor) {\n      this.editor.setValue(text);\n    } else {\n      this._value = text;\n    }\n    lively.sleep(0).then(() => {\n      if (this.editor) this.editor.refresh();\n    });\n  }\n\n  setCustomStyle(source) {\n    this.shadowRoot.querySelector(\"#customStyle\").textContent = source;\n  }\n\n  getCustomStyle(source) {\n    return this.shadowRoot.querySelector(\"#customStyle\").textContent;\n  }\n\n  encodeHTML(s) {\n    return s.replace(\"&\", \"&amp;\").replace(\"<\", \"&lt;\");\n  }\n\n  decodeHTML(s) {\n    return s.replace(\"&lt;\", \"<\").replace(\"&amp;\", \"&\");\n  }\n\n  resize() {\n    // #ACE Component compatiblity\n  }\n\n  enableAutocompletion() {\n    // #ACE Component compatiblity\n  }\n\n  get isJavaScript() {\n    if (!this.editor) return false;\n    let mode = this.editor.getOption(\"mode\");\n    return mode === \"javascript\" || mode === 'text/jsx';\n  }\n\n  get isMarkdown() {\n    if (!this.editor) return false;\n    return this.editor.getOption(\"mode\") == \"gfm\";\n  }\n\n  get isHTML() {\n    if (!this.editor) return false;\n    return this.editor.getOption(\"mode\") == \"text/html\";\n  }\n\n  async changeModeForFile(filename) {\n    if (!this.editor) return;\n\n    var mode = \"text\";\n    // #TODO there must be some kind of automatching?\n    if (filename.match(/\\.html$/)) {\n      mode = \"text/html\";\n    } else if (filename.match(/\\.md$/)) {\n      mode = \"gfm\";\n    } else if (filename.match(/\\.tex$/)) {\n      mode = \"text/x-stex\";\n    } else if (filename.match(/\\.css$/)) {\n      mode = \"css\";\n    } else if (filename.match(/\\.xml$/)) {\n      mode = \"xml\";\n    } else if (filename.match(/\\.java$/)) {\n      mode = \"text/x-java\";\n    } else if (filename.match(/\\.json$/)) {\n      mode = \"javascript\";\n    } else if (filename.match(/\\.js$/)) {\n      mode = \"text/jsx\";\n    } else if (filename.match(/\\.mjs$/)) {\n      mode = \"text/jsx\";\n    } else if (filename.match(/\\.py$/)) {\n      mode = \"text/x-python\";\n    } else if (filename.match(/\\.c$/)) {\n      mode = \"text/x-csrc\";\n    } else if (filename.match(/\\.cpp$/)) {\n      mode = \"text/x-c++src\";\n    } else if (filename.match(/\\.h$/)) {\n      mode = \"text/x-c++src\";\n    } else if (filename.match(/\\.sh$/) || filename.match(/Makefile/)) {\n      mode = \"text/x-sh\";\n    }\n\n    this.mode = mode;\n    this.editor.setOption(\"mode\", mode);\n    if (mode == \"gfm\" || mode == \"text/x-stex\") {\n      // #TODO make language customizable\n      var m = this.value.match(/^.*lang\\:(.._..)/);\n      if (m) {\n        var lang = m[1];\n        var dict = await spellCheck.loadDictLang(lang);\n        if (dict) {\n          lively.notify(\"start spell checking lang: \" + lang);\n          spellCheck.startSpellCheck(this.editor, dict);\n        } else {\n          console.log(\"spellchecking language not found: \" + lang);\n        }\n      } else {\n        spellCheck.startSpellCheck(this.editor, (await spellCheck.current()));\n      }\n    }\n    if (mode == \"text/x-sh\") {\n      this.editor.setOption(\"indentWithTabs\", true);\n    }\n  }\n\n  livelyPrepareSave() {\n    if (!this.editor) {\n      return;\n    }\n    this.textContent = this.encodeHTML(this.editor.getValue());\n  }\n\n  livelyPreMigrate() {\n    if (this.editor) {\n      this.lastScrollInfo = this.editor.getScrollInfo(); // #Example #PreserveContext\n    }\n  }\n\n  focus() {\n    // lively.notify(\"[codemirror] focus\")\n    if (this.editor) {\n      // if (this.editor.options.readOnly == \"nocursor\") {\n      //   // console.warn(\"[lively-code-mirror] prevent focus\")\n      //   return\n      // }\n      this.editor.focus();\n    }\n  }\n\n  isFocused(doc) {\n    doc = doc || document;\n    if (doc.activeElement === this) return true;\n    // search recursively in shadowDoms\n    if (doc.activeElement && doc.activeElement.shadowRoot) {\n      return this.isFocused(doc.activeElement.shadowRoot);\n    }\n    return false;\n  }\n\n  async livelyMigrate(other) {\n    lively.addEventListener(\"Migrate\", this, \"editor-loaded\", evt => {\n      if (evt.composedPath()[0] !== this) return; // bubbled from another place... that is not me!\n      lively.removeEventListener(\"Migrate\", this, \"editor-loaded\" // make sure we migrate only once\n      );this.value = other.value;\n      if (other.lastScrollInfo) {\n        this.editor.scrollTo(other.lastScrollInfo.left, other.lastScrollInfo.top);\n      }\n    });\n  }\n\n  fixHintsPosition() {\n    lively.setPosition(this.shadowRoot.querySelector(\"#code-mirror-hints\"), pt(-document.scrollingElement.scrollLeft, -document.scrollingElement.scrollTop).subPt(lively.getGlobalPosition(this)));\n  }\n\n  //   async enableTern() {\n  //     await LivelyCodeMirror.loadTernModules()\n\n  //     var ecmascriptdefs = await fetch(lively4url + \"/src/external/tern/ecmascript.json\").then(r => r.json())\n  //     var browserdefs = await fetch(lively4url + \"/src/external/tern/browser.json\").then(r => r.json())\n  //     // var chaidefs = await fetch(lively4url + \"/src/external/tern/chai.json\").then(r => r.json())\n\n  //     // Options supported (all optional):\n  //     // * defs: An array of JSON definition data structures.\n  //     // * plugins: An object mapping plugin names to configuration\n  //     //   options.\n  //     // * getFile: A function(name, c) that can be used to access files in\n  //     //   the project that haven't been loaded yet. Simply do c(null) to\n  //     //   indicate that a file is not available.\n  //     // * fileFilter: A function(value, docName, doc) that will be applied\n  //     //   to documents before passing them on to Tern.\n  //     // * switchToDoc: A function(name, doc) that should, when providing a\n  //     //   multi-file view, switch the view or focus to the named file.\n  //     // * showError: A function(editor, message) that can be used to\n  //     //   override the way errors are displayed.\n  //     // * completionTip: Customize the content in tooltips for completions.\n  //     //   Is passed a single argument the completion's data as returned by\n  //     //   Tern and may return a string, DOM node, or null to indicate that\n  //     //   no tip should be shown. By default the docstring is shown.\n  //     // * typeTip: Like completionTip, but for the tooltips shown for type\n  //     //   queries.\n  //     // * responseFilter: A function(doc, query, request, error, data) that\n  //     //   will be applied to the Tern responses before treating them\n\n  //     // It is possible to run the Tern server in a web worker by specifying\n  //     // these additional options:\n  //     // * useWorker: Set to true to enable web worker mode. You'll probably\n  //     //   want to feature detect the actual value you use here, for example\n  //     //   !!window.Worker.\n  //     // * workerScript: The main script of the worker. Point this to\n  //     //   wherever you are hosting worker.js from this directory.\n  //     // * workerDeps: An array of paths pointing (relative to workerScript)\n  //     //   to the Acorn and Tern libraries and any Tern plugins you want to\n  //     //   load. Or, if you minified those into a single script and included\n  //     //   them in the workerScript, simply leave this undefined.\n\n  //     this.ternServer = new CodeMirror.TernServer({\n  //       defs: [ecmascriptdefs, browserdefs], // chaidefs\n  //       plugins: {\n  //         es_modules: {}\n  //       },\n  //       getFile: (name, c) => {\n  //         lively.notify(\"get file \" + name)\n  //         c(null)\n  //       },\n  //       // responseFilter: (doc, query, request, error, data) => {\n  //       //  return data\n  //       // }\n\n  //     });\n\n  //     this.editor.setOption(\"extraKeys\", Object.assign({},\n  //       this.editor.getOption(\"extraKeys\"),\n  //       {\n  //         \"Ctrl-Space\": (cm) => {\n  //           this.fixHintsPosition();\n  //           this.ternServer.complete(cm);\n  //         },\n  //         \"Ctrl-Alt-I\": (cm) => { this.ternServer.showType(cm); },\n  //         \"Ctrl-O\": (cm) => { this.ternServer.showDocs(cm); },\n  //         \"Alt-.\": (cm) => { this.ternServer.jumpToDef(cm); },\n  //         \"Alt-,\": (cm) => { this.ternServer.jumpBack(cm); },\n  //         \"Ctrl-Q\": (cm) => { this.ternServer.rename(cm); },\n  //         \"Ctrl-.\": (cm) => { this.ternServer.selectName(cm); }\n  //       }))\n\n  //     this.editor.on(\"cursorActivity\", (cm) => { this.ternServer.updateArgHints(cm); });\n  //   }\n\n\n  async addTernFile(name, url, text) {\n    if (!this.ternServer) return;\n    url = url || name;\n    text = text || (await fetch(url).then(r => r.text()));\n    this.ternServer.server.addFile(name, text);\n  }\n\n  mergeView(originalText, originalLeftText) {\n    var target = this.shadowRoot.querySelector(\"#code-mirror-container\");\n    target.innerHTML = \"\";\n    this._mergeView = CodeMirror.MergeView(target, {\n      value: this.value,\n      origLeft: originalLeftText,\n      orig: originalText,\n      lineNumbers: true,\n      mode: this.editor.getOption('mode'),\n      scrollbarStyle: this.editor.getOption('scrollbarStyle'),\n      highlightDifferences: true,\n      connect: \"align\",\n      lineWrapping: true,\n      collapseIdentical: false\n    });\n    // if (this._mergeView.right) {\n    // this.setEditor(this._mergeView.right.edit)\n    // }\n    this.setEditor(this._mergeView.editor\n    // this.resizeMergeView(this._mergeView)\n    ());\n  }\n\n  resizeMergeView(mergeView) {\n    function editorHeight(editor) {\n      if (!editor) return 0;\n      return editor.getScrollInfo().height;\n    }\n\n    function mergeViewHeight(mergeView) {\n      return Math.max(editorHeight(mergeView.leftOriginal()), editorHeight(mergeView.editor()), editorHeight(mergeView.rightOriginal()));\n    }\n    var height = mergeViewHeight(mergeView);\n    for (;;) {\n      if (mergeView.leftOriginal()) mergeView.leftOriginal().setSize(null, height);\n      mergeView.editor().setSize(null, height);\n      if (mergeView.rightOriginal()) mergeView.rightOriginal().setSize(null, height);\n\n      var newHeight = mergeViewHeight(mergeView);\n      if (newHeight >= height) break;else height = newHeight;\n    }\n    mergeView.wrap.style.height = height + \"px\";\n  }\n\n  async hideDataURLs() {\n    var regEx = new RegExp(\"[\\\"\\'](data:[^\\\"\\']*)[\\\"\\']\", \"g\");\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        var from = m.index;\n        var to = m.index + m[0].length;\n        await this.wrapWidget(\"span\", this.editor.posFromIndex(from), this.editor.posFromIndex(to)).then(div => {\n          div.style.backgroundColor = \"rgb(240,240,240)\";\n\n          if (m[1].match(/^data:image/)) {\n            var img = document.createElement(\"img\");\n            img.src = m[1];\n            img.title = m[1].slice(0, 50) + \"...\";\n            img.style.maxHeight = \"100px\";\n\n            div.appendChild(document.createTextNode(\"\\\"\"));\n            div.appendChild(img);\n            div.appendChild(document.createTextNode(\"\\\"\"));\n          } else {\n            div.innerHTML = \"\\\"\" + m[1].slice(0, 50) + \"...\" + \"\\\"\";\n          }\n        });\n      }\n    } while (m);\n  }\n\n  //    async wrapImageLinks() {\n  //     var regEx = new RegExp(\"\\!\\[\\]\\(([A-Za-z0-9_ .]\\.((jpg)|(png)))$\\)\", \"g\");\n  //     do {\n  //       var m = regEx.exec(this.value);\n  //       if (m) {\n  //         var from = m.index\n  //         var to = m.index + m[0].length\n  //         var url = m[1]\n  //         await this.wrapWidget(\"span\", this.editor.posFromIndex(from),\n  //                               this.editor.posFromIndex(to)).then( div => {\n  //           div.style.backgroundColor = \"rgb(240,240,240)\"\n\n  //           if (m[1].match(/^data:image/)) {\n  //             var img = document.createElement(\"img\")\n  //             img.src = m[1]\n  //             img.title = m[1].slice(0,50) + \"...\"\n  //             img.style.maxHeight = \"100px\"\n\n  //             div.appendChild(document.createTextNode(\"\\\"\"))\n  //             div.appendChild(img)\n  //             div.appendChild(document.createTextNode(\"\\\"\"))\n  //           } else {\n  //             div.innerHTML = \"\\\"\"+ m[1].slice(0,50) + \"...\" + \"\\\"\"\n  //           }\n  //         })\n\n  //       }\n  //     } while (m);\n  //   }\n\n\n  async wrapImports() {\n    // dev mode alternative to #DevLayers, a #S3Pattern: add code the scopes your dev example inline while developing\n    if (this.id !== 'spike') {\n      // lively.warn('skip because id is not spike')\n      return;\n    }\n    // lively.success('wrap imports in spike')\n\n    const getImportDeclarationRegex = () => {\n      const LiteralString = `([\"][^\"\\\\n\\\\r]*[\"]|['][^'\\\\n\\\\r]*['])`;\n      const JavaScriptIdentifier = '([a-zA-Z$_][a-zA-Z0-9$_]*)';\n\n      const ImportSpecifierPartSimple = `(${JavaScriptIdentifier})`;\n      const ImportSpecifierPartRename = `(${JavaScriptIdentifier}\\\\s+as\\\\s+${JavaScriptIdentifier})`;\n      const ImportSpecifierPart = `(${ImportSpecifierPartSimple}|${ImportSpecifierPartRename})`;\n      // ImportSpecifier: {foo} or {foo as bar}\n      const ImportSpecifier = `({\\\\s*((${ImportSpecifierPart}\\\\s*\\\\,\\\\s*)*${ImportSpecifierPart}\\\\,?)?\\\\s*})`;\n      // ImportDefaultSpecifier: foo\n      const ImportDefaultSpecifier = `(${JavaScriptIdentifier})`;\n      // ImportNamespaceSpecifier: * as foo\n      const ImportNamespaceSpecifier = `(\\\\*\\\\s*as\\\\s+${JavaScriptIdentifier})`;\n      const anySpecifier = `(${ImportSpecifier}|${ImportDefaultSpecifier}|${ImportNamespaceSpecifier})`;\n      // ImportDeclaration: import [any] from Literal\n      const ImportDeclaration = `import\\\\s*(${anySpecifier}\\\\s*\\\\,\\\\s*)*${anySpecifier}\\\\s*from\\\\s*${LiteralString}(\\\\s*\\\\;)?`;\n\n      return ImportDeclaration;\n    };\n\n    var regEx = new RegExp(getImportDeclarationRegex(), 'g');\n\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        await LivelyCodeMirrorWidgetImport.importWidgetForRange(this, m);\n      }\n    } while (m);\n  }\n\n  async wrapLinks() {\n    // dev mode\n    if (this !== window.that) {\n      return;\n    }\n    var regEx = new RegExp(\"\\<([a-zA-Z0-9]+\\:\\/\\/[^ ]+)\\>\", \"g\");\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        lively.warn(\"wrap link: \" + m[0]);\n        var from = m.index;\n        var to = m.index + m[0].length;\n        var link = m[1];\n        // #TODO check for an existing widget and reuse / update it...\n        await this.wrapWidget(\"span\", this.editor.posFromIndex(from), this.editor.posFromIndex(to)).then(widget => {\n          window.lastWidget = widget;\n\n          widget.style.backgroundColor = \"rgb(120,120, 240)\";\n          var input = <input></input>;\n          input.value = m[0];\n\n          lively.warn(\"new input \" + input);\n\n          input.addEventListener(\"keydown\", evt => {\n            var range = widget.marker.find();\n            if (evt.keyCode == 13) {\n              // ENTER\n              // #TODO how to replace // update text without replacing widgets\n              this.editor.replaceRange(input.value, range.from, range.to // @Stefan, your welcome! ;-)\n              );this.wrapLinks // don't wait and do what you can now\n              ();\n            }\n            if (evt.keyCode == 37) {\n              // Left\n              if (input.selectionStart == 0) {\n                this.editor.setSelection(range.from, range.from);\n                this.focus();\n              }\n            }\n\n            if (evt.keyCode == 39) {\n              // Right\n              if (input.selectionStart == input.value.length) {\n                this.editor.setSelection(range.to, range.to);\n                this.focus();\n              }\n            }\n          });\n\n          widget.appendChild(input\n          // widget.appendChild(<button click={e => {\n          //   lively.openBrowser(link)  // #TODO fix browse and open browser...\n          // }}>browse</button>)\n          );\n        });\n      }\n    } while (m);\n  }\n\n  checkSyntax() {\n    if (this.isJavaScript) {\n      SyntaxChecker.checkForSyntaxErrors(this.editor);\n      this.wrapImports();\n      this.wrapLinks();\n    }\n    if (this.isMarkdown || this.isHTML) {\n      this.hideDataURLs();\n    }\n  }\n\n  find(str) {\n    // #TODO this is horrible... Why is there not a standard method for this?\n    if (!this.editor) return;\n    var found = false;\n    this.value.split(\"\\n\").forEach((ea, index) => {\n      var startPos = ea.indexOf(str);\n      if (!found && startPos != -1) {\n        this.editor.setCursor(index + 20, 10000); // line end ;-)\n        this.editor.focus();\n        this.editor.setSelection({ line: index, ch: startPos }, { line: index, ch: startPos + str.length });\n        found = ea;\n      }\n    });\n  }\n\n  scrollToLine(line) {\n    this.editor.scrollTo(null, this.editor.heightAtLine(line - 1, \"local\"));\n  }\n  \n  \n  // custom \n  posFromIndex(off, text=this.value) {\n    var line = 0\n    var total = 0\n    for(let s of text.split(\"\\n\")) {\n      var length = s.length  \n      if (total + length >  off) {\n        break;\n      }\n      total += length + 1\n      line++\n    }\n    var ch = off - total\n    return {ch: ch, line: line}\n  }\n  \n  scrollToCodeElement(data, optionalText) {\n    var cm = this.editor //  ok, to many levels of editor involved here...\n    \n    // #BUG when dealing with babylonian source code, the source code we are editing might not be the same we \n    // are storing... though the lines should be ok\n    // \n    // var start = cm.posFromIndex(data.start)\n    // var end = cm.posFromIndex(data.end)\n    \n    var start = this.posFromIndex(data.start, optionalText)\n    var end = this.posFromIndex(data.end, optionalText)\n    \n    \n\n    cm.setSelection(start, end)\n\n    // scroll only if necessary\n    var rect = cm.getWrapperElement().getBoundingClientRect();\n    var topVisibleLine = cm.lineAtHeight(rect.top, \"window\"); \n    var bottomVisibleLine = cm.lineAtHeight(rect.bottom, \"window\");\n\n    if (start.line < topVisibleLine) {\n      this.scrollToLine(start.line )\n    } \n    if (end.line > bottomVisibleLine) {\n      var visibleLines = (bottomVisibleLine - topVisibleLine)\n      this.scrollToLine(end.line - visibleLines)\n    }\n  }\n\n  unsavedChanges() {\n    if (this.editor.getValue() === \"\") return false;\n    return true; // workspaces should be treated carefully\n  }\n\n  onCursorActivity() {\n    var container = lively.query(this, \"lively-container\");\n    if (!container) return;\n    var navbar = lively.query(this, \"lively-container-navbar\");\n    if (!navbar) return;\n    navbar.onDetailsContentCursorActivity(this.editor, this.editor.getCursor(\"start\"), this.editor.getCursor(\"end\"));\n  }\n\n  livelyMinimizedTitle() {\n    return this.value.slice(0, 80);\n  }\n\n  /*MD ## Active Expression Support MD*/\n\n  async updateAExprDependencies() {\n    if (!this.isJavaScript || !lively.query(this, \"lively-container\")) return;\n    if(!Preferences.get(\"EnableAEDebugging\")) return;\n    new AEGutter(await this.editor, this.fileURL(), this.valid.bind(this));\n  }\n\n  fileURL() {\n    return lively.query(this, \"lively-container\").getURL().pathname;\n  }\n\n  valid() {\n    return lively.allParents(this, [], true).includes(document.body);\n  }\n}"]}