mirror of
https://github.com/open-webui/open-webui
synced 2024-11-26 05:51:12 +00:00
1 line
120 KiB
Plaintext
1 line
120 KiB
Plaintext
{"version":3,"file":"codemirror_commands-MgxtVkrD.js","sources":["../node_modules/@codemirror/commands/dist/index.js"],"sourcesContent":["import { Annotation, Facet, combineConfig, StateField, Transaction, ChangeSet, ChangeDesc, EditorSelection, StateEffect, Text, findClusterBreak, countColumn, CharCategory } from '@codemirror/state';\nimport { EditorView, Direction } from '@codemirror/view';\nimport { IndentContext, getIndentation, indentString, matchBrackets, syntaxTree, getIndentUnit, indentUnit } from '@codemirror/language';\nimport { NodeProp } from '@lezer/common';\n\n/**\nComment or uncomment the current selection. Will use line comments\nif available, otherwise falling back to block comments.\n*/\nconst toggleComment = target => {\n let { state } = target, line = state.doc.lineAt(state.selection.main.from), config = getConfig(target.state, line.from);\n return config.line ? toggleLineComment(target) : config.block ? toggleBlockCommentByLine(target) : false;\n};\nfunction command(f, option) {\n return ({ state, dispatch }) => {\n if (state.readOnly)\n return false;\n let tr = f(option, state);\n if (!tr)\n return false;\n dispatch(state.update(tr));\n return true;\n };\n}\n/**\nComment or uncomment the current selection using line comments.\nThe line comment syntax is taken from the\n[`commentTokens`](https://codemirror.net/6/docs/ref/#commands.CommentTokens) [language\ndata](https://codemirror.net/6/docs/ref/#state.EditorState.languageDataAt).\n*/\nconst toggleLineComment = /*@__PURE__*/command(changeLineComment, 0 /* CommentOption.Toggle */);\n/**\nComment the current selection using line comments.\n*/\nconst lineComment = /*@__PURE__*/command(changeLineComment, 1 /* CommentOption.Comment */);\n/**\nUncomment the current selection using line comments.\n*/\nconst lineUncomment = /*@__PURE__*/command(changeLineComment, 2 /* CommentOption.Uncomment */);\n/**\nComment or uncomment the current selection using block comments.\nThe block comment syntax is taken from the\n[`commentTokens`](https://codemirror.net/6/docs/ref/#commands.CommentTokens) [language\ndata](https://codemirror.net/6/docs/ref/#state.EditorState.languageDataAt).\n*/\nconst toggleBlockComment = /*@__PURE__*/command(changeBlockComment, 0 /* CommentOption.Toggle */);\n/**\nComment the current selection using block comments.\n*/\nconst blockComment = /*@__PURE__*/command(changeBlockComment, 1 /* CommentOption.Comment */);\n/**\nUncomment the current selection using block comments.\n*/\nconst blockUncomment = /*@__PURE__*/command(changeBlockComment, 2 /* CommentOption.Uncomment */);\n/**\nComment or uncomment the lines around the current selection using\nblock comments.\n*/\nconst toggleBlockCommentByLine = /*@__PURE__*/command((o, s) => changeBlockComment(o, s, selectedLineRanges(s)), 0 /* CommentOption.Toggle */);\nfunction getConfig(state, pos) {\n let data = state.languageDataAt(\"commentTokens\", pos);\n return data.length ? data[0] : {};\n}\nconst SearchMargin = 50;\n/**\nDetermines if the given range is block-commented in the given\nstate.\n*/\nfunction findBlockComment(state, { open, close }, from, to) {\n let textBefore = state.sliceDoc(from - SearchMargin, from);\n let textAfter = state.sliceDoc(to, to + SearchMargin);\n let spaceBefore = /\\s*$/.exec(textBefore)[0].length, spaceAfter = /^\\s*/.exec(textAfter)[0].length;\n let beforeOff = textBefore.length - spaceBefore;\n if (textBefore.slice(beforeOff - open.length, beforeOff) == open &&\n textAfter.slice(spaceAfter, spaceAfter + close.length) == close) {\n return { open: { pos: from - spaceBefore, margin: spaceBefore && 1 },\n close: { pos: to + spaceAfter, margin: spaceAfter && 1 } };\n }\n let startText, endText;\n if (to - from <= 2 * SearchMargin) {\n startText = endText = state.sliceDoc(from, to);\n }\n else {\n startText = state.sliceDoc(from, from + SearchMargin);\n endText = state.sliceDoc(to - SearchMargin, to);\n }\n let startSpace = /^\\s*/.exec(startText)[0].length, endSpace = /\\s*$/.exec(endText)[0].length;\n let endOff = endText.length - endSpace - close.length;\n if (startText.slice(startSpace, startSpace + open.length) == open &&\n endText.slice(endOff, endOff + close.length) == close) {\n return { open: { pos: from + startSpace + open.length,\n margin: /\\s/.test(startText.charAt(startSpace + open.length)) ? 1 : 0 },\n close: { pos: to - endSpace - close.length,\n margin: /\\s/.test(endText.charAt(endOff - 1)) ? 1 : 0 } };\n }\n return null;\n}\nfunction selectedLineRanges(state) {\n let ranges = [];\n for (let r of state.selection.ranges) {\n let fromLine = state.doc.lineAt(r.from);\n let toLine = r.to <= fromLine.to ? fromLine : state.doc.lineAt(r.to);\n let last = ranges.length - 1;\n if (last >= 0 && ranges[last].to > fromLine.from)\n ranges[last].to = toLine.to;\n else\n ranges.push({ from: fromLine.from + /^\\s*/.exec(fromLine.text)[0].length, to: toLine.to });\n }\n return ranges;\n}\n// Performs toggle, comment and uncomment of block comments in\n// languages that support them.\nfunction changeBlockComment(option, state, ranges = state.selection.ranges) {\n let tokens = ranges.map(r => getConfig(state, r.from).block);\n if (!tokens.every(c => c))\n return null;\n let comments = ranges.map((r, i) => findBlockComment(state, tokens[i], r.from, r.to));\n if (option != 2 /* CommentOption.Uncomment */ && !comments.every(c => c)) {\n return { changes: state.changes(ranges.map((range, i) => {\n if (comments[i])\n return [];\n return [{ from: range.from, insert: tokens[i].open + \" \" }, { from: range.to, insert: \" \" + tokens[i].close }];\n })) };\n }\n else if (option != 1 /* CommentOption.Comment */ && comments.some(c => c)) {\n let changes = [];\n for (let i = 0, comment; i < comments.length; i++)\n if (comment = comments[i]) {\n let token = tokens[i], { open, close } = comment;\n changes.push({ from: open.pos - token.open.length, to: open.pos + open.margin }, { from: close.pos - close.margin, to: close.pos + token.close.length });\n }\n return { changes };\n }\n return null;\n}\n// Performs toggle, comment and uncomment of line comments.\nfunction changeLineComment(option, state, ranges = state.selection.ranges) {\n let lines = [];\n let prevLine = -1;\n for (let { from, to } of ranges) {\n let startI = lines.length, minIndent = 1e9;\n let token = getConfig(state, from).line;\n if (!token)\n continue;\n for (let pos = from; pos <= to;) {\n let line = state.doc.lineAt(pos);\n if (line.from > prevLine && (from == to || to > line.from)) {\n prevLine = line.from;\n let indent = /^\\s*/.exec(line.text)[0].length;\n let empty = indent == line.length;\n let comment = line.text.slice(indent, indent + token.length) == token ? indent : -1;\n if (indent < line.text.length && indent < minIndent)\n minIndent = indent;\n lines.push({ line, comment, token, indent, empty, single: false });\n }\n pos = line.to + 1;\n }\n if (minIndent < 1e9)\n for (let i = startI; i < lines.length; i++)\n if (lines[i].indent < lines[i].line.text.length)\n lines[i].indent = minIndent;\n if (lines.length == startI + 1)\n lines[startI].single = true;\n }\n if (option != 2 /* CommentOption.Uncomment */ && lines.some(l => l.comment < 0 && (!l.empty || l.single))) {\n let changes = [];\n for (let { line, token, indent, empty, single } of lines)\n if (single || !empty)\n changes.push({ from: line.from + indent, insert: token + \" \" });\n let changeSet = state.changes(changes);\n return { changes: changeSet, selection: state.selection.map(changeSet, 1) };\n }\n else if (option != 1 /* CommentOption.Comment */ && lines.some(l => l.comment >= 0)) {\n let changes = [];\n for (let { line, comment, token } of lines)\n if (comment >= 0) {\n let from = line.from + comment, to = from + token.length;\n if (line.text[to - line.from] == \" \")\n to++;\n changes.push({ from, to });\n }\n return { changes };\n }\n return null;\n}\n\nconst fromHistory = /*@__PURE__*/Annotation.define();\n/**\nTransaction annotation that will prevent that transaction from\nbeing combined with other transactions in the undo history. Given\n`\"before\"`, it'll prevent merging with previous transactions. With\n`\"after\"`, subsequent transactions won't be combined with this\none. With `\"full\"`, the transaction is isolated on both sides.\n*/\nconst isolateHistory = /*@__PURE__*/Annotation.define();\n/**\nThis facet provides a way to register functions that, given a\ntransaction, provide a set of effects that the history should\nstore when inverting the transaction. This can be used to\nintegrate some kinds of effects in the history, so that they can\nbe undone (and redone again).\n*/\nconst invertedEffects = /*@__PURE__*/Facet.define();\nconst historyConfig = /*@__PURE__*/Facet.define({\n combine(configs) {\n return combineConfig(configs, {\n minDepth: 100,\n newGroupDelay: 500,\n joinToEvent: (_t, isAdjacent) => isAdjacent,\n }, {\n minDepth: Math.max,\n newGroupDelay: Math.min,\n joinToEvent: (a, b) => (tr, adj) => a(tr, adj) || b(tr, adj)\n });\n }\n});\nconst historyField_ = /*@__PURE__*/StateField.define({\n create() {\n return HistoryState.empty;\n },\n update(state, tr) {\n let config = tr.state.facet(historyConfig);\n let fromHist = tr.annotation(fromHistory);\n if (fromHist) {\n let item = HistEvent.fromTransaction(tr, fromHist.selection), from = fromHist.side;\n let other = from == 0 /* BranchName.Done */ ? state.undone : state.done;\n if (item)\n other = updateBranch(other, other.length, config.minDepth, item);\n else\n other = addSelection(other, tr.startState.selection);\n return new HistoryState(from == 0 /* BranchName.Done */ ? fromHist.rest : other, from == 0 /* BranchName.Done */ ? other : fromHist.rest);\n }\n let isolate = tr.annotation(isolateHistory);\n if (isolate == \"full\" || isolate == \"before\")\n state = state.isolate();\n if (tr.annotation(Transaction.addToHistory) === false)\n return !tr.changes.empty ? state.addMapping(tr.changes.desc) : state;\n let event = HistEvent.fromTransaction(tr);\n let time = tr.annotation(Transaction.time), userEvent = tr.annotation(Transaction.userEvent);\n if (event)\n state = state.addChanges(event, time, userEvent, config, tr);\n else if (tr.selection)\n state = state.addSelection(tr.startState.selection, time, userEvent, config.newGroupDelay);\n if (isolate == \"full\" || isolate == \"after\")\n state = state.isolate();\n return state;\n },\n toJSON(value) {\n return { done: value.done.map(e => e.toJSON()), undone: value.undone.map(e => e.toJSON()) };\n },\n fromJSON(json) {\n return new HistoryState(json.done.map(HistEvent.fromJSON), json.undone.map(HistEvent.fromJSON));\n }\n});\n/**\nCreate a history extension with the given configuration.\n*/\nfunction history(config = {}) {\n return [\n historyField_,\n historyConfig.of(config),\n EditorView.domEventHandlers({\n beforeinput(e, view) {\n let command = e.inputType == \"historyUndo\" ? undo : e.inputType == \"historyRedo\" ? redo : null;\n if (!command)\n return false;\n e.preventDefault();\n return command(view);\n }\n })\n ];\n}\n/**\nThe state field used to store the history data. Should probably\nonly be used when you want to\n[serialize](https://codemirror.net/6/docs/ref/#state.EditorState.toJSON) or\n[deserialize](https://codemirror.net/6/docs/ref/#state.EditorState^fromJSON) state objects in a way\nthat preserves history.\n*/\nconst historyField = historyField_;\nfunction cmd(side, selection) {\n return function ({ state, dispatch }) {\n if (!selection && state.readOnly)\n return false;\n let historyState = state.field(historyField_, false);\n if (!historyState)\n return false;\n let tr = historyState.pop(side, state, selection);\n if (!tr)\n return false;\n dispatch(tr);\n return true;\n };\n}\n/**\nUndo a single group of history events. Returns false if no group\nwas available.\n*/\nconst undo = /*@__PURE__*/cmd(0 /* BranchName.Done */, false);\n/**\nRedo a group of history events. Returns false if no group was\navailable.\n*/\nconst redo = /*@__PURE__*/cmd(1 /* BranchName.Undone */, false);\n/**\nUndo a change or selection change.\n*/\nconst undoSelection = /*@__PURE__*/cmd(0 /* BranchName.Done */, true);\n/**\nRedo a change or selection change.\n*/\nconst redoSelection = /*@__PURE__*/cmd(1 /* BranchName.Undone */, true);\nfunction depth(side) {\n return function (state) {\n let histState = state.field(historyField_, false);\n if (!histState)\n return 0;\n let branch = side == 0 /* BranchName.Done */ ? histState.done : histState.undone;\n return branch.length - (branch.length && !branch[0].changes ? 1 : 0);\n };\n}\n/**\nThe amount of undoable change events available in a given state.\n*/\nconst undoDepth = /*@__PURE__*/depth(0 /* BranchName.Done */);\n/**\nThe amount of redoable change events available in a given state.\n*/\nconst redoDepth = /*@__PURE__*/depth(1 /* BranchName.Undone */);\n// History events store groups of changes or effects that need to be\n// undone/redone together.\nclass HistEvent {\n constructor(\n // The changes in this event. Normal events hold at least one\n // change or effect. But it may be necessary to store selection\n // events before the first change, in which case a special type of\n // instance is created which doesn't hold any changes, with\n // changes == startSelection == undefined\n changes, \n // The effects associated with this event\n effects, \n // Accumulated mapping (from addToHistory==false) that should be\n // applied to events below this one.\n mapped, \n // The selection before this event\n startSelection, \n // Stores selection changes after this event, to be used for\n // selection undo/redo.\n selectionsAfter) {\n this.changes = changes;\n this.effects = effects;\n this.mapped = mapped;\n this.startSelection = startSelection;\n this.selectionsAfter = selectionsAfter;\n }\n setSelAfter(after) {\n return new HistEvent(this.changes, this.effects, this.mapped, this.startSelection, after);\n }\n toJSON() {\n var _a, _b, _c;\n return {\n changes: (_a = this.changes) === null || _a === void 0 ? void 0 : _a.toJSON(),\n mapped: (_b = this.mapped) === null || _b === void 0 ? void 0 : _b.toJSON(),\n startSelection: (_c = this.startSelection) === null || _c === void 0 ? void 0 : _c.toJSON(),\n selectionsAfter: this.selectionsAfter.map(s => s.toJSON())\n };\n }\n static fromJSON(json) {\n return new HistEvent(json.changes && ChangeSet.fromJSON(json.changes), [], json.mapped && ChangeDesc.fromJSON(json.mapped), json.startSelection && EditorSelection.fromJSON(json.startSelection), json.selectionsAfter.map(EditorSelection.fromJSON));\n }\n // This does not check `addToHistory` and such, it assumes the\n // transaction needs to be converted to an item. Returns null when\n // there are no changes or effects in the transaction.\n static fromTransaction(tr, selection) {\n let effects = none;\n for (let invert of tr.startState.facet(invertedEffects)) {\n let result = invert(tr);\n if (result.length)\n effects = effects.concat(result);\n }\n if (!effects.length && tr.changes.empty)\n return null;\n return new HistEvent(tr.changes.invert(tr.startState.doc), effects, undefined, selection || tr.startState.selection, none);\n }\n static selection(selections) {\n return new HistEvent(undefined, none, undefined, undefined, selections);\n }\n}\nfunction updateBranch(branch, to, maxLen, newEvent) {\n let start = to + 1 > maxLen + 20 ? to - maxLen - 1 : 0;\n let newBranch = branch.slice(start, to);\n newBranch.push(newEvent);\n return newBranch;\n}\nfunction isAdjacent(a, b) {\n let ranges = [], isAdjacent = false;\n a.iterChangedRanges((f, t) => ranges.push(f, t));\n b.iterChangedRanges((_f, _t, f, t) => {\n for (let i = 0; i < ranges.length;) {\n let from = ranges[i++], to = ranges[i++];\n if (t >= from && f <= to)\n isAdjacent = true;\n }\n });\n return isAdjacent;\n}\nfunction eqSelectionShape(a, b) {\n return a.ranges.length == b.ranges.length &&\n a.ranges.filter((r, i) => r.empty != b.ranges[i].empty).length === 0;\n}\nfunction conc(a, b) {\n return !a.length ? b : !b.length ? a : a.concat(b);\n}\nconst none = [];\nconst MaxSelectionsPerEvent = 200;\nfunction addSelection(branch, selection) {\n if (!branch.length) {\n return [HistEvent.selection([selection])];\n }\n else {\n let lastEvent = branch[branch.length - 1];\n let sels = lastEvent.selectionsAfter.slice(Math.max(0, lastEvent.selectionsAfter.length - MaxSelectionsPerEvent));\n if (sels.length && sels[sels.length - 1].eq(selection))\n return branch;\n sels.push(selection);\n return updateBranch(branch, branch.length - 1, 1e9, lastEvent.setSelAfter(sels));\n }\n}\n// Assumes the top item has one or more selectionAfter values\nfunction popSelection(branch) {\n let last = branch[branch.length - 1];\n let newBranch = branch.slice();\n newBranch[branch.length - 1] = last.setSelAfter(last.selectionsAfter.slice(0, last.selectionsAfter.length - 1));\n return newBranch;\n}\n// Add a mapping to the top event in the given branch. If this maps\n// away all the changes and effects in that item, drop it and\n// propagate the mapping to the next item.\nfunction addMappingToBranch(branch, mapping) {\n if (!branch.length)\n return branch;\n let length = branch.length, selections = none;\n while (length) {\n let event = mapEvent(branch[length - 1], mapping, selections);\n if (event.changes && !event.changes.empty || event.effects.length) { // Event survived mapping\n let result = branch.slice(0, length);\n result[length - 1] = event;\n return result;\n }\n else { // Drop this event, since there's no changes or effects left\n mapping = event.mapped;\n length--;\n selections = event.selectionsAfter;\n }\n }\n return selections.length ? [HistEvent.selection(selections)] : none;\n}\nfunction mapEvent(event, mapping, extraSelections) {\n let selections = conc(event.selectionsAfter.length ? event.selectionsAfter.map(s => s.map(mapping)) : none, extraSelections);\n // Change-less events don't store mappings (they are always the last event in a branch)\n if (!event.changes)\n return HistEvent.selection(selections);\n let mappedChanges = event.changes.map(mapping), before = mapping.mapDesc(event.changes, true);\n let fullMapping = event.mapped ? event.mapped.composeDesc(before) : before;\n return new HistEvent(mappedChanges, StateEffect.mapEffects(event.effects, mapping), fullMapping, event.startSelection.map(before), selections);\n}\nconst joinableUserEvent = /^(input\\.type|delete)($|\\.)/;\nclass HistoryState {\n constructor(done, undone, prevTime = 0, prevUserEvent = undefined) {\n this.done = done;\n this.undone = undone;\n this.prevTime = prevTime;\n this.prevUserEvent = prevUserEvent;\n }\n isolate() {\n return this.prevTime ? new HistoryState(this.done, this.undone) : this;\n }\n addChanges(event, time, userEvent, config, tr) {\n let done = this.done, lastEvent = done[done.length - 1];\n if (lastEvent && lastEvent.changes && !lastEvent.changes.empty && event.changes &&\n (!userEvent || joinableUserEvent.test(userEvent)) &&\n ((!lastEvent.selectionsAfter.length &&\n time - this.prevTime < config.newGroupDelay &&\n config.joinToEvent(tr, isAdjacent(lastEvent.changes, event.changes))) ||\n // For compose (but not compose.start) events, always join with previous event\n userEvent == \"input.type.compose\")) {\n done = updateBranch(done, done.length - 1, config.minDepth, new HistEvent(event.changes.compose(lastEvent.changes), conc(event.effects, lastEvent.effects), lastEvent.mapped, lastEvent.startSelection, none));\n }\n else {\n done = updateBranch(done, done.length, config.minDepth, event);\n }\n return new HistoryState(done, none, time, userEvent);\n }\n addSelection(selection, time, userEvent, newGroupDelay) {\n let last = this.done.length ? this.done[this.done.length - 1].selectionsAfter : none;\n if (last.length > 0 &&\n time - this.prevTime < newGroupDelay &&\n userEvent == this.prevUserEvent && userEvent && /^select($|\\.)/.test(userEvent) &&\n eqSelectionShape(last[last.length - 1], selection))\n return this;\n return new HistoryState(addSelection(this.done, selection), this.undone, time, userEvent);\n }\n addMapping(mapping) {\n return new HistoryState(addMappingToBranch(this.done, mapping), addMappingToBranch(this.undone, mapping), this.prevTime, this.prevUserEvent);\n }\n pop(side, state, onlySelection) {\n let branch = side == 0 /* BranchName.Done */ ? this.done : this.undone;\n if (branch.length == 0)\n return null;\n let event = branch[branch.length - 1], selection = event.selectionsAfter[0] || state.selection;\n if (onlySelection && event.selectionsAfter.length) {\n return state.update({\n selection: event.selectionsAfter[event.selectionsAfter.length - 1],\n annotations: fromHistory.of({ side, rest: popSelection(branch), selection }),\n userEvent: side == 0 /* BranchName.Done */ ? \"select.undo\" : \"select.redo\",\n scrollIntoView: true\n });\n }\n else if (!event.changes) {\n return null;\n }\n else {\n let rest = branch.length == 1 ? none : branch.slice(0, branch.length - 1);\n if (event.mapped)\n rest = addMappingToBranch(rest, event.mapped);\n return state.update({\n changes: event.changes,\n selection: event.startSelection,\n effects: event.effects,\n annotations: fromHistory.of({ side, rest, selection }),\n filter: false,\n userEvent: side == 0 /* BranchName.Done */ ? \"undo\" : \"redo\",\n scrollIntoView: true\n });\n }\n }\n}\nHistoryState.empty = /*@__PURE__*/new HistoryState(none, none);\n/**\nDefault key bindings for the undo history.\n\n- Mod-z: [`undo`](https://codemirror.net/6/docs/ref/#commands.undo).\n- Mod-y (Mod-Shift-z on macOS) + Ctrl-Shift-z on Linux: [`redo`](https://codemirror.net/6/docs/ref/#commands.redo).\n- Mod-u: [`undoSelection`](https://codemirror.net/6/docs/ref/#commands.undoSelection).\n- Alt-u (Mod-Shift-u on macOS): [`redoSelection`](https://codemirror.net/6/docs/ref/#commands.redoSelection).\n*/\nconst historyKeymap = [\n { key: \"Mod-z\", run: undo, preventDefault: true },\n { key: \"Mod-y\", mac: \"Mod-Shift-z\", run: redo, preventDefault: true },\n { linux: \"Ctrl-Shift-z\", run: redo, preventDefault: true },\n { key: \"Mod-u\", run: undoSelection, preventDefault: true },\n { key: \"Alt-u\", mac: \"Mod-Shift-u\", run: redoSelection, preventDefault: true }\n];\n\nfunction updateSel(sel, by) {\n return EditorSelection.create(sel.ranges.map(by), sel.mainIndex);\n}\nfunction setSel(state, selection) {\n return state.update({ selection, scrollIntoView: true, userEvent: \"select\" });\n}\nfunction moveSel({ state, dispatch }, how) {\n let selection = updateSel(state.selection, how);\n if (selection.eq(state.selection, true))\n return false;\n dispatch(setSel(state, selection));\n return true;\n}\nfunction rangeEnd(range, forward) {\n return EditorSelection.cursor(forward ? range.to : range.from);\n}\nfunction cursorByChar(view, forward) {\n return moveSel(view, range => range.empty ? view.moveByChar(range, forward) : rangeEnd(range, forward));\n}\nfunction ltrAtCursor(view) {\n return view.textDirectionAt(view.state.selection.main.head) == Direction.LTR;\n}\n/**\nMove the selection one character to the left (which is backward in\nleft-to-right text, forward in right-to-left text).\n*/\nconst cursorCharLeft = view => cursorByChar(view, !ltrAtCursor(view));\n/**\nMove the selection one character to the right.\n*/\nconst cursorCharRight = view => cursorByChar(view, ltrAtCursor(view));\n/**\nMove the selection one character forward.\n*/\nconst cursorCharForward = view => cursorByChar(view, true);\n/**\nMove the selection one character backward.\n*/\nconst cursorCharBackward = view => cursorByChar(view, false);\nfunction cursorByGroup(view, forward) {\n return moveSel(view, range => range.empty ? view.moveByGroup(range, forward) : rangeEnd(range, forward));\n}\n/**\nMove the selection to the left across one group of word or\nnon-word (but also non-space) characters.\n*/\nconst cursorGroupLeft = view => cursorByGroup(view, !ltrAtCursor(view));\n/**\nMove the selection one group to the right.\n*/\nconst cursorGroupRight = view => cursorByGroup(view, ltrAtCursor(view));\n/**\nMove the selection one group forward.\n*/\nconst cursorGroupForward = view => cursorByGroup(view, true);\n/**\nMove the selection one group backward.\n*/\nconst cursorGroupBackward = view => cursorByGroup(view, false);\nconst segmenter = typeof Intl != \"undefined\" && Intl.Segmenter ?\n /*@__PURE__*/new (Intl.Segmenter)(undefined, { granularity: \"word\" }) : null;\nfunction moveBySubword(view, range, forward) {\n let categorize = view.state.charCategorizer(range.from);\n let cat = CharCategory.Space, pos = range.from, steps = 0;\n let done = false, sawUpper = false, sawLower = false;\n let step = (next) => {\n if (done)\n return false;\n pos += forward ? next.length : -next.length;\n let nextCat = categorize(next), ahead;\n if (nextCat == CharCategory.Word && next.charCodeAt(0) < 128 && /[\\W_]/.test(next))\n nextCat = -1; // Treat word punctuation specially\n if (cat == CharCategory.Space)\n cat = nextCat;\n if (cat != nextCat)\n return false;\n if (cat == CharCategory.Word) {\n if (next.toLowerCase() == next) {\n if (!forward && sawUpper)\n return false;\n sawLower = true;\n }\n else if (sawLower) {\n if (forward)\n return false;\n done = true;\n }\n else {\n if (sawUpper && forward && categorize(ahead = view.state.sliceDoc(pos, pos + 1)) == CharCategory.Word &&\n ahead.toLowerCase() == ahead)\n return false;\n sawUpper = true;\n }\n }\n steps++;\n return true;\n };\n let end = view.moveByChar(range, forward, start => {\n step(start);\n return step;\n });\n if (segmenter && cat == CharCategory.Word && end.from == range.from + steps * (forward ? 1 : -1)) {\n let from = Math.min(range.head, end.head), to = Math.max(range.head, end.head);\n let skipped = view.state.sliceDoc(from, to);\n if (skipped.length > 1 && /[\\u4E00-\\uffff]/.test(skipped)) {\n let segments = Array.from(segmenter.segment(skipped));\n if (segments.length > 1) {\n if (forward)\n return EditorSelection.cursor(range.head + segments[1].index, -1);\n return EditorSelection.cursor(end.head + segments[segments.length - 1].index, 1);\n }\n }\n }\n return end;\n}\nfunction cursorBySubword(view, forward) {\n return moveSel(view, range => range.empty ? moveBySubword(view, range, forward) : rangeEnd(range, forward));\n}\n/**\nMove the selection one group or camel-case subword forward.\n*/\nconst cursorSubwordForward = view => cursorBySubword(view, true);\n/**\nMove the selection one group or camel-case subword backward.\n*/\nconst cursorSubwordBackward = view => cursorBySubword(view, false);\nfunction interestingNode(state, node, bracketProp) {\n if (node.type.prop(bracketProp))\n return true;\n let len = node.to - node.from;\n return len && (len > 2 || /[^\\s,.;:]/.test(state.sliceDoc(node.from, node.to))) || node.firstChild;\n}\nfunction moveBySyntax(state, start, forward) {\n let pos = syntaxTree(state).resolveInner(start.head);\n let bracketProp = forward ? NodeProp.closedBy : NodeProp.openedBy;\n // Scan forward through child nodes to see if there's an interesting\n // node ahead.\n for (let at = start.head;;) {\n let next = forward ? pos.childAfter(at) : pos.childBefore(at);\n if (!next)\n break;\n if (interestingNode(state, next, bracketProp))\n pos = next;\n else\n at = forward ? next.to : next.from;\n }\n let bracket = pos.type.prop(bracketProp), match, newPos;\n if (bracket && (match = forward ? matchBrackets(state, pos.from, 1) : matchBrackets(state, pos.to, -1)) && match.matched)\n newPos = forward ? match.end.to : match.end.from;\n else\n newPos = forward ? pos.to : pos.from;\n return EditorSelection.cursor(newPos, forward ? -1 : 1);\n}\n/**\nMove the cursor over the next syntactic element to the left.\n*/\nconst cursorSyntaxLeft = view => moveSel(view, range => moveBySyntax(view.state, range, !ltrAtCursor(view)));\n/**\nMove the cursor over the next syntactic element to the right.\n*/\nconst cursorSyntaxRight = view => moveSel(view, range => moveBySyntax(view.state, range, ltrAtCursor(view)));\nfunction cursorByLine(view, forward) {\n return moveSel(view, range => {\n if (!range.empty)\n return rangeEnd(range, forward);\n let moved = view.moveVertically(range, forward);\n return moved.head != range.head ? moved : view.moveToLineBoundary(range, forward);\n });\n}\n/**\nMove the selection one line up.\n*/\nconst cursorLineUp = view => cursorByLine(view, false);\n/**\nMove the selection one line down.\n*/\nconst cursorLineDown = view => cursorByLine(view, true);\nfunction pageInfo(view) {\n let selfScroll = view.scrollDOM.clientHeight < view.scrollDOM.scrollHeight - 2;\n let marginTop = 0, marginBottom = 0, height;\n if (selfScroll) {\n for (let source of view.state.facet(EditorView.scrollMargins)) {\n let margins = source(view);\n if (margins === null || margins === void 0 ? void 0 : margins.top)\n marginTop = Math.max(margins === null || margins === void 0 ? void 0 : margins.top, marginTop);\n if (margins === null || margins === void 0 ? void 0 : margins.bottom)\n marginBottom = Math.max(margins === null || margins === void 0 ? void 0 : margins.bottom, marginBottom);\n }\n height = view.scrollDOM.clientHeight - marginTop - marginBottom;\n }\n else {\n height = (view.dom.ownerDocument.defaultView || window).innerHeight;\n }\n return { marginTop, marginBottom, selfScroll,\n height: Math.max(view.defaultLineHeight, height - 5) };\n}\nfunction cursorByPage(view, forward) {\n let page = pageInfo(view);\n let { state } = view, selection = updateSel(state.selection, range => {\n return range.empty ? view.moveVertically(range, forward, page.height)\n : rangeEnd(range, forward);\n });\n if (selection.eq(state.selection))\n return false;\n let effect;\n if (page.selfScroll) {\n let startPos = view.coordsAtPos(state.selection.main.head);\n let scrollRect = view.scrollDOM.getBoundingClientRect();\n let scrollTop = scrollRect.top + page.marginTop, scrollBottom = scrollRect.bottom - page.marginBottom;\n if (startPos && startPos.top > scrollTop && startPos.bottom < scrollBottom)\n effect = EditorView.scrollIntoView(selection.main.head, { y: \"start\", yMargin: startPos.top - scrollTop });\n }\n view.dispatch(setSel(state, selection), { effects: effect });\n return true;\n}\n/**\nMove the selection one page up.\n*/\nconst cursorPageUp = view => cursorByPage(view, false);\n/**\nMove the selection one page down.\n*/\nconst cursorPageDown = view => cursorByPage(view, true);\nfunction moveByLineBoundary(view, start, forward) {\n let line = view.lineBlockAt(start.head), moved = view.moveToLineBoundary(start, forward);\n if (moved.head == start.head && moved.head != (forward ? line.to : line.from))\n moved = view.moveToLineBoundary(start, forward, false);\n if (!forward && moved.head == line.from && line.length) {\n let space = /^\\s*/.exec(view.state.sliceDoc(line.from, Math.min(line.from + 100, line.to)))[0].length;\n if (space && start.head != line.from + space)\n moved = EditorSelection.cursor(line.from + space);\n }\n return moved;\n}\n/**\nMove the selection to the next line wrap point, or to the end of\nthe line if there isn't one left on this line.\n*/\nconst cursorLineBoundaryForward = view => moveSel(view, range => moveByLineBoundary(view, range, true));\n/**\nMove the selection to previous line wrap point, or failing that to\nthe start of the line. If the line is indented, and the cursor\nisn't already at the end of the indentation, this will move to the\nend of the indentation instead of the start of the line.\n*/\nconst cursorLineBoundaryBackward = view => moveSel(view, range => moveByLineBoundary(view, range, false));\n/**\nMove the selection one line wrap point to the left.\n*/\nconst cursorLineBoundaryLeft = view => moveSel(view, range => moveByLineBoundary(view, range, !ltrAtCursor(view)));\n/**\nMove the selection one line wrap point to the right.\n*/\nconst cursorLineBoundaryRight = view => moveSel(view, range => moveByLineBoundary(view, range, ltrAtCursor(view)));\n/**\nMove the selection to the start of the line.\n*/\nconst cursorLineStart = view => moveSel(view, range => EditorSelection.cursor(view.lineBlockAt(range.head).from, 1));\n/**\nMove the selection to the end of the line.\n*/\nconst cursorLineEnd = view => moveSel(view, range => EditorSelection.cursor(view.lineBlockAt(range.head).to, -1));\nfunction toMatchingBracket(state, dispatch, extend) {\n let found = false, selection = updateSel(state.selection, range => {\n let matching = matchBrackets(state, range.head, -1)\n || matchBrackets(state, range.head, 1)\n || (range.head > 0 && matchBrackets(state, range.head - 1, 1))\n || (range.head < state.doc.length && matchBrackets(state, range.head + 1, -1));\n if (!matching || !matching.end)\n return range;\n found = true;\n let head = matching.start.from == range.head ? matching.end.to : matching.end.from;\n return extend ? EditorSelection.range(range.anchor, head) : EditorSelection.cursor(head);\n });\n if (!found)\n return false;\n dispatch(setSel(state, selection));\n return true;\n}\n/**\nMove the selection to the bracket matching the one it is currently\non, if any.\n*/\nconst cursorMatchingBracket = ({ state, dispatch }) => toMatchingBracket(state, dispatch, false);\n/**\nExtend the selection to the bracket matching the one the selection\nhead is currently on, if any.\n*/\nconst selectMatchingBracket = ({ state, dispatch }) => toMatchingBracket(state, dispatch, true);\nfunction extendSel(view, how) {\n let selection = updateSel(view.state.selection, range => {\n let head = how(range);\n return EditorSelection.range(range.anchor, head.head, head.goalColumn, head.bidiLevel || undefined);\n });\n if (selection.eq(view.state.selection))\n return false;\n view.dispatch(setSel(view.state, selection));\n return true;\n}\nfunction selectByChar(view, forward) {\n return extendSel(view, range => view.moveByChar(range, forward));\n}\n/**\nMove the selection head one character to the left, while leaving\nthe anchor in place.\n*/\nconst selectCharLeft = view => selectByChar(view, !ltrAtCursor(view));\n/**\nMove the selection head one character to the right.\n*/\nconst selectCharRight = view => selectByChar(view, ltrAtCursor(view));\n/**\nMove the selection head one character forward.\n*/\nconst selectCharForward = view => selectByChar(view, true);\n/**\nMove the selection head one character backward.\n*/\nconst selectCharBackward = view => selectByChar(view, false);\nfunction selectByGroup(view, forward) {\n return extendSel(view, range => view.moveByGroup(range, forward));\n}\n/**\nMove the selection head one [group](https://codemirror.net/6/docs/ref/#commands.cursorGroupLeft) to\nthe left.\n*/\nconst selectGroupLeft = view => selectByGroup(view, !ltrAtCursor(view));\n/**\nMove the selection head one group to the right.\n*/\nconst selectGroupRight = view => selectByGroup(view, ltrAtCursor(view));\n/**\nMove the selection head one group forward.\n*/\nconst selectGroupForward = view => selectByGroup(view, true);\n/**\nMove the selection head one group backward.\n*/\nconst selectGroupBackward = view => selectByGroup(view, false);\nfunction selectBySubword(view, forward) {\n return extendSel(view, range => moveBySubword(view, range, forward));\n}\n/**\nMove the selection head one group or camel-case subword forward.\n*/\nconst selectSubwordForward = view => selectBySubword(view, true);\n/**\nMove the selection head one group or subword backward.\n*/\nconst selectSubwordBackward = view => selectBySubword(view, false);\n/**\nMove the selection head over the next syntactic element to the left.\n*/\nconst selectSyntaxLeft = view => extendSel(view, range => moveBySyntax(view.state, range, !ltrAtCursor(view)));\n/**\nMove the selection head over the next syntactic element to the right.\n*/\nconst selectSyntaxRight = view => extendSel(view, range => moveBySyntax(view.state, range, ltrAtCursor(view)));\nfunction selectByLine(view, forward) {\n return extendSel(view, range => view.moveVertically(range, forward));\n}\n/**\nMove the selection head one line up.\n*/\nconst selectLineUp = view => selectByLine(view, false);\n/**\nMove the selection head one line down.\n*/\nconst selectLineDown = view => selectByLine(view, true);\nfunction selectByPage(view, forward) {\n return extendSel(view, range => view.moveVertically(range, forward, pageInfo(view).height));\n}\n/**\nMove the selection head one page up.\n*/\nconst selectPageUp = view => selectByPage(view, false);\n/**\nMove the selection head one page down.\n*/\nconst selectPageDown = view => selectByPage(view, true);\n/**\nMove the selection head to the next line boundary.\n*/\nconst selectLineBoundaryForward = view => extendSel(view, range => moveByLineBoundary(view, range, true));\n/**\nMove the selection head to the previous line boundary.\n*/\nconst selectLineBoundaryBackward = view => extendSel(view, range => moveByLineBoundary(view, range, false));\n/**\nMove the selection head one line boundary to the left.\n*/\nconst selectLineBoundaryLeft = view => extendSel(view, range => moveByLineBoundary(view, range, !ltrAtCursor(view)));\n/**\nMove the selection head one line boundary to the right.\n*/\nconst selectLineBoundaryRight = view => extendSel(view, range => moveByLineBoundary(view, range, ltrAtCursor(view)));\n/**\nMove the selection head to the start of the line.\n*/\nconst selectLineStart = view => extendSel(view, range => EditorSelection.cursor(view.lineBlockAt(range.head).from));\n/**\nMove the selection head to the end of the line.\n*/\nconst selectLineEnd = view => extendSel(view, range => EditorSelection.cursor(view.lineBlockAt(range.head).to));\n/**\nMove the selection to the start of the document.\n*/\nconst cursorDocStart = ({ state, dispatch }) => {\n dispatch(setSel(state, { anchor: 0 }));\n return true;\n};\n/**\nMove the selection to the end of the document.\n*/\nconst cursorDocEnd = ({ state, dispatch }) => {\n dispatch(setSel(state, { anchor: state.doc.length }));\n return true;\n};\n/**\nMove the selection head to the start of the document.\n*/\nconst selectDocStart = ({ state, dispatch }) => {\n dispatch(setSel(state, { anchor: state.selection.main.anchor, head: 0 }));\n return true;\n};\n/**\nMove the selection head to the end of the document.\n*/\nconst selectDocEnd = ({ state, dispatch }) => {\n dispatch(setSel(state, { anchor: state.selection.main.anchor, head: state.doc.length }));\n return true;\n};\n/**\nSelect the entire document.\n*/\nconst selectAll = ({ state, dispatch }) => {\n dispatch(state.update({ selection: { anchor: 0, head: state.doc.length }, userEvent: \"select\" }));\n return true;\n};\n/**\nExpand the selection to cover entire lines.\n*/\nconst selectLine = ({ state, dispatch }) => {\n let ranges = selectedLineBlocks(state).map(({ from, to }) => EditorSelection.range(from, Math.min(to + 1, state.doc.length)));\n dispatch(state.update({ selection: EditorSelection.create(ranges), userEvent: \"select\" }));\n return true;\n};\n/**\nSelect the next syntactic construct that is larger than the\nselection. Note that this will only work insofar as the language\n[provider](https://codemirror.net/6/docs/ref/#language.language) you use builds up a full\nsyntax tree.\n*/\nconst selectParentSyntax = ({ state, dispatch }) => {\n let selection = updateSel(state.selection, range => {\n var _a;\n let stack = syntaxTree(state).resolveStack(range.from, 1);\n for (let cur = stack; cur; cur = cur.next) {\n let { node } = cur;\n if (((node.from < range.from && node.to >= range.to) ||\n (node.to > range.to && node.from <= range.from)) &&\n ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.parent))\n return EditorSelection.range(node.to, node.from);\n }\n return range;\n });\n dispatch(setSel(state, selection));\n return true;\n};\n/**\nSimplify the current selection. When multiple ranges are selected,\nreduce it to its main range. Otherwise, if the selection is\nnon-empty, convert it to a cursor selection.\n*/\nconst simplifySelection = ({ state, dispatch }) => {\n let cur = state.selection, selection = null;\n if (cur.ranges.length > 1)\n selection = EditorSelection.create([cur.main]);\n else if (!cur.main.empty)\n selection = EditorSelection.create([EditorSelection.cursor(cur.main.head)]);\n if (!selection)\n return false;\n dispatch(setSel(state, selection));\n return true;\n};\nfunction deleteBy(target, by) {\n if (target.state.readOnly)\n return false;\n let event = \"delete.selection\", { state } = target;\n let changes = state.changeByRange(range => {\n let { from, to } = range;\n if (from == to) {\n let towards = by(range);\n if (towards < from) {\n event = \"delete.backward\";\n towards = skipAtomic(target, towards, false);\n }\n else if (towards > from) {\n event = \"delete.forward\";\n towards = skipAtomic(target, towards, true);\n }\n from = Math.min(from, towards);\n to = Math.max(to, towards);\n }\n else {\n from = skipAtomic(target, from, false);\n to = skipAtomic(target, to, true);\n }\n return from == to ? { range } : { changes: { from, to }, range: EditorSelection.cursor(from, from < range.head ? -1 : 1) };\n });\n if (changes.changes.empty)\n return false;\n target.dispatch(state.update(changes, {\n scrollIntoView: true,\n userEvent: event,\n effects: event == \"delete.selection\" ? EditorView.announce.of(state.phrase(\"Selection deleted\")) : undefined\n }));\n return true;\n}\nfunction skipAtomic(target, pos, forward) {\n if (target instanceof EditorView)\n for (let ranges of target.state.facet(EditorView.atomicRanges).map(f => f(target)))\n ranges.between(pos, pos, (from, to) => {\n if (from < pos && to > pos)\n pos = forward ? to : from;\n });\n return pos;\n}\nconst deleteByChar = (target, forward, byIndentUnit) => deleteBy(target, range => {\n let pos = range.from, { state } = target, line = state.doc.lineAt(pos), before, targetPos;\n if (byIndentUnit && !forward && pos > line.from && pos < line.from + 200 &&\n !/[^ \\t]/.test(before = line.text.slice(0, pos - line.from))) {\n if (before[before.length - 1] == \"\\t\")\n return pos - 1;\n let col = countColumn(before, state.tabSize), drop = col % getIndentUnit(state) || getIndentUnit(state);\n for (let i = 0; i < drop && before[before.length - 1 - i] == \" \"; i++)\n pos--;\n targetPos = pos;\n }\n else {\n targetPos = findClusterBreak(line.text, pos - line.from, forward, forward) + line.from;\n if (targetPos == pos && line.number != (forward ? state.doc.lines : 1))\n targetPos += forward ? 1 : -1;\n else if (!forward && /[\\ufe00-\\ufe0f]/.test(line.text.slice(targetPos - line.from, pos - line.from)))\n targetPos = findClusterBreak(line.text, targetPos - line.from, false, false) + line.from;\n }\n return targetPos;\n});\n/**\nDelete the selection, or, for cursor selections, the character or\nindentation unit before the cursor.\n*/\nconst deleteCharBackward = view => deleteByChar(view, false, true);\n/**\nDelete the selection or the character before the cursor. Does not\nimplement any extended behavior like deleting whole indentation\nunits in one go.\n*/\nconst deleteCharBackwardStrict = view => deleteByChar(view, false, false);\n/**\nDelete the selection or the character after the cursor.\n*/\nconst deleteCharForward = view => deleteByChar(view, true, false);\nconst deleteByGroup = (target, forward) => deleteBy(target, range => {\n let pos = range.head, { state } = target, line = state.doc.lineAt(pos);\n let categorize = state.charCategorizer(pos);\n for (let cat = null;;) {\n if (pos == (forward ? line.to : line.from)) {\n if (pos == range.head && line.number != (forward ? state.doc.lines : 1))\n pos += forward ? 1 : -1;\n break;\n }\n let next = findClusterBreak(line.text, pos - line.from, forward) + line.from;\n let nextChar = line.text.slice(Math.min(pos, next) - line.from, Math.max(pos, next) - line.from);\n let nextCat = categorize(nextChar);\n if (cat != null && nextCat != cat)\n break;\n if (nextChar != \" \" || pos != range.head)\n cat = nextCat;\n pos = next;\n }\n return pos;\n});\n/**\nDelete the selection or backward until the end of the next\n[group](https://codemirror.net/6/docs/ref/#view.EditorView.moveByGroup), only skipping groups of\nwhitespace when they consist of a single space.\n*/\nconst deleteGroupBackward = target => deleteByGroup(target, false);\n/**\nDelete the selection or forward until the end of the next group.\n*/\nconst deleteGroupForward = target => deleteByGroup(target, true);\n/**\nDelete the selection, or, if it is a cursor selection, delete to\nthe end of the line. If the cursor is directly at the end of the\nline, delete the line break after it.\n*/\nconst deleteToLineEnd = view => deleteBy(view, range => {\n let lineEnd = view.lineBlockAt(range.head).to;\n return range.head < lineEnd ? lineEnd : Math.min(view.state.doc.length, range.head + 1);\n});\n/**\nDelete the selection, or, if it is a cursor selection, delete to\nthe start of the line. If the cursor is directly at the start of the\nline, delete the line break before it.\n*/\nconst deleteToLineStart = view => deleteBy(view, range => {\n let lineStart = view.lineBlockAt(range.head).from;\n return range.head > lineStart ? lineStart : Math.max(0, range.head - 1);\n});\n/**\nDelete the selection, or, if it is a cursor selection, delete to\nthe start of the line or the next line wrap before the cursor.\n*/\nconst deleteLineBoundaryBackward = view => deleteBy(view, range => {\n let lineStart = view.moveToLineBoundary(range, false).head;\n return range.head > lineStart ? lineStart : Math.max(0, range.head - 1);\n});\n/**\nDelete the selection, or, if it is a cursor selection, delete to\nthe end of the line or the next line wrap after the cursor.\n*/\nconst deleteLineBoundaryForward = view => deleteBy(view, range => {\n let lineStart = view.moveToLineBoundary(range, true).head;\n return range.head < lineStart ? lineStart : Math.min(view.state.doc.length, range.head + 1);\n});\n/**\nDelete all whitespace directly before a line end from the\ndocument.\n*/\nconst deleteTrailingWhitespace = ({ state, dispatch }) => {\n if (state.readOnly)\n return false;\n let changes = [];\n for (let pos = 0, prev = \"\", iter = state.doc.iter();;) {\n iter.next();\n if (iter.lineBreak || iter.done) {\n let trailing = prev.search(/\\s+$/);\n if (trailing > -1)\n changes.push({ from: pos - (prev.length - trailing), to: pos });\n if (iter.done)\n break;\n prev = \"\";\n }\n else {\n prev = iter.value;\n }\n pos += iter.value.length;\n }\n if (!changes.length)\n return false;\n dispatch(state.update({ changes, userEvent: \"delete\" }));\n return true;\n};\n/**\nReplace each selection range with a line break, leaving the cursor\non the line before the break.\n*/\nconst splitLine = ({ state, dispatch }) => {\n if (state.readOnly)\n return false;\n let changes = state.changeByRange(range => {\n return { changes: { from: range.from, to: range.to, insert: Text.of([\"\", \"\"]) },\n range: EditorSelection.cursor(range.from) };\n });\n dispatch(state.update(changes, { scrollIntoView: true, userEvent: \"input\" }));\n return true;\n};\n/**\nFlip the characters before and after the cursor(s).\n*/\nconst transposeChars = ({ state, dispatch }) => {\n if (state.readOnly)\n return false;\n let changes = state.changeByRange(range => {\n if (!range.empty || range.from == 0 || range.from == state.doc.length)\n return { range };\n let pos = range.from, line = state.doc.lineAt(pos);\n let from = pos == line.from ? pos - 1 : findClusterBreak(line.text, pos - line.from, false) + line.from;\n let to = pos == line.to ? pos + 1 : findClusterBreak(line.text, pos - line.from, true) + line.from;\n return { changes: { from, to, insert: state.doc.slice(pos, to).append(state.doc.slice(from, pos)) },\n range: EditorSelection.cursor(to) };\n });\n if (changes.changes.empty)\n return false;\n dispatch(state.update(changes, { scrollIntoView: true, userEvent: \"move.character\" }));\n return true;\n};\nfunction selectedLineBlocks(state) {\n let blocks = [], upto = -1;\n for (let range of state.selection.ranges) {\n let startLine = state.doc.lineAt(range.from), endLine = state.doc.lineAt(range.to);\n if (!range.empty && range.to == endLine.from)\n endLine = state.doc.lineAt(range.to - 1);\n if (upto >= startLine.number) {\n let prev = blocks[blocks.length - 1];\n prev.to = endLine.to;\n prev.ranges.push(range);\n }\n else {\n blocks.push({ from: startLine.from, to: endLine.to, ranges: [range] });\n }\n upto = endLine.number + 1;\n }\n return blocks;\n}\nfunction moveLine(state, dispatch, forward) {\n if (state.readOnly)\n return false;\n let changes = [], ranges = [];\n for (let block of selectedLineBlocks(state)) {\n if (forward ? block.to == state.doc.length : block.from == 0)\n continue;\n let nextLine = state.doc.lineAt(forward ? block.to + 1 : block.from - 1);\n let size = nextLine.length + 1;\n if (forward) {\n changes.push({ from: block.to, to: nextLine.to }, { from: block.from, insert: nextLine.text + state.lineBreak });\n for (let r of block.ranges)\n ranges.push(EditorSelection.range(Math.min(state.doc.length, r.anchor + size), Math.min(state.doc.length, r.head + size)));\n }\n else {\n changes.push({ from: nextLine.from, to: block.from }, { from: block.to, insert: state.lineBreak + nextLine.text });\n for (let r of block.ranges)\n ranges.push(EditorSelection.range(r.anchor - size, r.head - size));\n }\n }\n if (!changes.length)\n return false;\n dispatch(state.update({\n changes,\n scrollIntoView: true,\n selection: EditorSelection.create(ranges, state.selection.mainIndex),\n userEvent: \"move.line\"\n }));\n return true;\n}\n/**\nMove the selected lines up one line.\n*/\nconst moveLineUp = ({ state, dispatch }) => moveLine(state, dispatch, false);\n/**\nMove the selected lines down one line.\n*/\nconst moveLineDown = ({ state, dispatch }) => moveLine(state, dispatch, true);\nfunction copyLine(state, dispatch, forward) {\n if (state.readOnly)\n return false;\n let changes = [];\n for (let block of selectedLineBlocks(state)) {\n if (forward)\n changes.push({ from: block.from, insert: state.doc.slice(block.from, block.to) + state.lineBreak });\n else\n changes.push({ from: block.to, insert: state.lineBreak + state.doc.slice(block.from, block.to) });\n }\n dispatch(state.update({ changes, scrollIntoView: true, userEvent: \"input.copyline\" }));\n return true;\n}\n/**\nCreate a copy of the selected lines. Keep the selection in the top copy.\n*/\nconst copyLineUp = ({ state, dispatch }) => copyLine(state, dispatch, false);\n/**\nCreate a copy of the selected lines. Keep the selection in the bottom copy.\n*/\nconst copyLineDown = ({ state, dispatch }) => copyLine(state, dispatch, true);\n/**\nDelete selected lines.\n*/\nconst deleteLine = view => {\n if (view.state.readOnly)\n return false;\n let { state } = view, changes = state.changes(selectedLineBlocks(state).map(({ from, to }) => {\n if (from > 0)\n from--;\n else if (to < state.doc.length)\n to++;\n return { from, to };\n }));\n let selection = updateSel(state.selection, range => {\n let dist = undefined;\n if (view.lineWrapping) {\n let block = view.lineBlockAt(range.head), pos = view.coordsAtPos(range.head, range.assoc || 1);\n if (pos)\n dist = (block.bottom + view.documentTop) - pos.bottom + view.defaultLineHeight / 2;\n }\n return view.moveVertically(range, true, dist);\n }).map(changes);\n view.dispatch({ changes, selection, scrollIntoView: true, userEvent: \"delete.line\" });\n return true;\n};\n/**\nReplace the selection with a newline.\n*/\nconst insertNewline = ({ state, dispatch }) => {\n dispatch(state.update(state.replaceSelection(state.lineBreak), { scrollIntoView: true, userEvent: \"input\" }));\n return true;\n};\n/**\nReplace the selection with a newline and the same amount of\nindentation as the line above.\n*/\nconst insertNewlineKeepIndent = ({ state, dispatch }) => {\n dispatch(state.update(state.changeByRange(range => {\n let indent = /^\\s*/.exec(state.doc.lineAt(range.from).text)[0];\n return {\n changes: { from: range.from, to: range.to, insert: state.lineBreak + indent },\n range: EditorSelection.cursor(range.from + indent.length + 1)\n };\n }), { scrollIntoView: true, userEvent: \"input\" }));\n return true;\n};\nfunction isBetweenBrackets(state, pos) {\n if (/\\(\\)|\\[\\]|\\{\\}/.test(state.sliceDoc(pos - 1, pos + 1)))\n return { from: pos, to: pos };\n let context = syntaxTree(state).resolveInner(pos);\n let before = context.childBefore(pos), after = context.childAfter(pos), closedBy;\n if (before && after && before.to <= pos && after.from >= pos &&\n (closedBy = before.type.prop(NodeProp.closedBy)) && closedBy.indexOf(after.name) > -1 &&\n state.doc.lineAt(before.to).from == state.doc.lineAt(after.from).from &&\n !/\\S/.test(state.sliceDoc(before.to, after.from)))\n return { from: before.to, to: after.from };\n return null;\n}\n/**\nReplace the selection with a newline and indent the newly created\nline(s). If the current line consists only of whitespace, this\nwill also delete that whitespace. When the cursor is between\nmatching brackets, an additional newline will be inserted after\nthe cursor.\n*/\nconst insertNewlineAndIndent = /*@__PURE__*/newlineAndIndent(false);\n/**\nCreate a blank, indented line below the current line.\n*/\nconst insertBlankLine = /*@__PURE__*/newlineAndIndent(true);\nfunction newlineAndIndent(atEof) {\n return ({ state, dispatch }) => {\n if (state.readOnly)\n return false;\n let changes = state.changeByRange(range => {\n let { from, to } = range, line = state.doc.lineAt(from);\n let explode = !atEof && from == to && isBetweenBrackets(state, from);\n if (atEof)\n from = to = (to <= line.to ? line : state.doc.lineAt(to)).to;\n let cx = new IndentContext(state, { simulateBreak: from, simulateDoubleBreak: !!explode });\n let indent = getIndentation(cx, from);\n if (indent == null)\n indent = countColumn(/^\\s*/.exec(state.doc.lineAt(from).text)[0], state.tabSize);\n while (to < line.to && /\\s/.test(line.text[to - line.from]))\n to++;\n if (explode)\n ({ from, to } = explode);\n else if (from > line.from && from < line.from + 100 && !/\\S/.test(line.text.slice(0, from)))\n from = line.from;\n let insert = [\"\", indentString(state, indent)];\n if (explode)\n insert.push(indentString(state, cx.lineIndent(line.from, -1)));\n return { changes: { from, to, insert: Text.of(insert) },\n range: EditorSelection.cursor(from + 1 + insert[1].length) };\n });\n dispatch(state.update(changes, { scrollIntoView: true, userEvent: \"input\" }));\n return true;\n };\n}\nfunction changeBySelectedLine(state, f) {\n let atLine = -1;\n return state.changeByRange(range => {\n let changes = [];\n for (let pos = range.from; pos <= range.to;) {\n let line = state.doc.lineAt(pos);\n if (line.number > atLine && (range.empty || range.to > line.from)) {\n f(line, changes, range);\n atLine = line.number;\n }\n pos = line.to + 1;\n }\n let changeSet = state.changes(changes);\n return { changes,\n range: EditorSelection.range(changeSet.mapPos(range.anchor, 1), changeSet.mapPos(range.head, 1)) };\n });\n}\n/**\nAuto-indent the selected lines. This uses the [indentation service\nfacet](https://codemirror.net/6/docs/ref/#language.indentService) as source for auto-indent\ninformation.\n*/\nconst indentSelection = ({ state, dispatch }) => {\n if (state.readOnly)\n return false;\n let updated = Object.create(null);\n let context = new IndentContext(state, { overrideIndentation: start => {\n let found = updated[start];\n return found == null ? -1 : found;\n } });\n let changes = changeBySelectedLine(state, (line, changes, range) => {\n let indent = getIndentation(context, line.from);\n if (indent == null)\n return;\n if (!/\\S/.test(line.text))\n indent = 0;\n let cur = /^\\s*/.exec(line.text)[0];\n let norm = indentString(state, indent);\n if (cur != norm || range.from < line.from + cur.length) {\n updated[line.from] = indent;\n changes.push({ from: line.from, to: line.from + cur.length, insert: norm });\n }\n });\n if (!changes.changes.empty)\n dispatch(state.update(changes, { userEvent: \"indent\" }));\n return true;\n};\n/**\nAdd a [unit](https://codemirror.net/6/docs/ref/#language.indentUnit) of indentation to all selected\nlines.\n*/\nconst indentMore = ({ state, dispatch }) => {\n if (state.readOnly)\n return false;\n dispatch(state.update(changeBySelectedLine(state, (line, changes) => {\n changes.push({ from: line.from, insert: state.facet(indentUnit) });\n }), { userEvent: \"input.indent\" }));\n return true;\n};\n/**\nRemove a [unit](https://codemirror.net/6/docs/ref/#language.indentUnit) of indentation from all\nselected lines.\n*/\nconst indentLess = ({ state, dispatch }) => {\n if (state.readOnly)\n return false;\n dispatch(state.update(changeBySelectedLine(state, (line, changes) => {\n let space = /^\\s*/.exec(line.text)[0];\n if (!space)\n return;\n let col = countColumn(space, state.tabSize), keep = 0;\n let insert = indentString(state, Math.max(0, col - getIndentUnit(state)));\n while (keep < space.length && keep < insert.length && space.charCodeAt(keep) == insert.charCodeAt(keep))\n keep++;\n changes.push({ from: line.from + keep, to: line.from + space.length, insert: insert.slice(keep) });\n }), { userEvent: \"delete.dedent\" }));\n return true;\n};\n/**\nInsert a tab character at the cursor or, if something is selected,\nuse [`indentMore`](https://codemirror.net/6/docs/ref/#commands.indentMore) to indent the entire\nselection.\n*/\nconst insertTab = ({ state, dispatch }) => {\n if (state.selection.ranges.some(r => !r.empty))\n return indentMore({ state, dispatch });\n dispatch(state.update(state.replaceSelection(\"\\t\"), { scrollIntoView: true, userEvent: \"input\" }));\n return true;\n};\n/**\nArray of key bindings containing the Emacs-style bindings that are\navailable on macOS by default.\n\n - Ctrl-b: [`cursorCharLeft`](https://codemirror.net/6/docs/ref/#commands.cursorCharLeft) ([`selectCharLeft`](https://codemirror.net/6/docs/ref/#commands.selectCharLeft) with Shift)\n - Ctrl-f: [`cursorCharRight`](https://codemirror.net/6/docs/ref/#commands.cursorCharRight) ([`selectCharRight`](https://codemirror.net/6/docs/ref/#commands.selectCharRight) with Shift)\n - Ctrl-p: [`cursorLineUp`](https://codemirror.net/6/docs/ref/#commands.cursorLineUp) ([`selectLineUp`](https://codemirror.net/6/docs/ref/#commands.selectLineUp) with Shift)\n - Ctrl-n: [`cursorLineDown`](https://codemirror.net/6/docs/ref/#commands.cursorLineDown) ([`selectLineDown`](https://codemirror.net/6/docs/ref/#commands.selectLineDown) with Shift)\n - Ctrl-a: [`cursorLineStart`](https://codemirror.net/6/docs/ref/#commands.cursorLineStart) ([`selectLineStart`](https://codemirror.net/6/docs/ref/#commands.selectLineStart) with Shift)\n - Ctrl-e: [`cursorLineEnd`](https://codemirror.net/6/docs/ref/#commands.cursorLineEnd) ([`selectLineEnd`](https://codemirror.net/6/docs/ref/#commands.selectLineEnd) with Shift)\n - Ctrl-d: [`deleteCharForward`](https://codemirror.net/6/docs/ref/#commands.deleteCharForward)\n - Ctrl-h: [`deleteCharBackward`](https://codemirror.net/6/docs/ref/#commands.deleteCharBackward)\n - Ctrl-k: [`deleteToLineEnd`](https://codemirror.net/6/docs/ref/#commands.deleteToLineEnd)\n - Ctrl-Alt-h: [`deleteGroupBackward`](https://codemirror.net/6/docs/ref/#commands.deleteGroupBackward)\n - Ctrl-o: [`splitLine`](https://codemirror.net/6/docs/ref/#commands.splitLine)\n - Ctrl-t: [`transposeChars`](https://codemirror.net/6/docs/ref/#commands.transposeChars)\n - Ctrl-v: [`cursorPageDown`](https://codemirror.net/6/docs/ref/#commands.cursorPageDown)\n - Alt-v: [`cursorPageUp`](https://codemirror.net/6/docs/ref/#commands.cursorPageUp)\n*/\nconst emacsStyleKeymap = [\n { key: \"Ctrl-b\", run: cursorCharLeft, shift: selectCharLeft, preventDefault: true },\n { key: \"Ctrl-f\", run: cursorCharRight, shift: selectCharRight },\n { key: \"Ctrl-p\", run: cursorLineUp, shift: selectLineUp },\n { key: \"Ctrl-n\", run: cursorLineDown, shift: selectLineDown },\n { key: \"Ctrl-a\", run: cursorLineStart, shift: selectLineStart },\n { key: \"Ctrl-e\", run: cursorLineEnd, shift: selectLineEnd },\n { key: \"Ctrl-d\", run: deleteCharForward },\n { key: \"Ctrl-h\", run: deleteCharBackward },\n { key: \"Ctrl-k\", run: deleteToLineEnd },\n { key: \"Ctrl-Alt-h\", run: deleteGroupBackward },\n { key: \"Ctrl-o\", run: splitLine },\n { key: \"Ctrl-t\", run: transposeChars },\n { key: \"Ctrl-v\", run: cursorPageDown },\n];\n/**\nAn array of key bindings closely sticking to platform-standard or\nwidely used bindings. (This includes the bindings from\n[`emacsStyleKeymap`](https://codemirror.net/6/docs/ref/#commands.emacsStyleKeymap), with their `key`\nproperty changed to `mac`.)\n\n - ArrowLeft: [`cursorCharLeft`](https://codemirror.net/6/docs/ref/#commands.cursorCharLeft) ([`selectCharLeft`](https://codemirror.net/6/docs/ref/#commands.selectCharLeft) with Shift)\n - ArrowRight: [`cursorCharRight`](https://codemirror.net/6/docs/ref/#commands.cursorCharRight) ([`selectCharRight`](https://codemirror.net/6/docs/ref/#commands.selectCharRight) with Shift)\n - Ctrl-ArrowLeft (Alt-ArrowLeft on macOS): [`cursorGroupLeft`](https://codemirror.net/6/docs/ref/#commands.cursorGroupLeft) ([`selectGroupLeft`](https://codemirror.net/6/docs/ref/#commands.selectGroupLeft) with Shift)\n - Ctrl-ArrowRight (Alt-ArrowRight on macOS): [`cursorGroupRight`](https://codemirror.net/6/docs/ref/#commands.cursorGroupRight) ([`selectGroupRight`](https://codemirror.net/6/docs/ref/#commands.selectGroupRight) with Shift)\n - Cmd-ArrowLeft (on macOS): [`cursorLineStart`](https://codemirror.net/6/docs/ref/#commands.cursorLineStart) ([`selectLineStart`](https://codemirror.net/6/docs/ref/#commands.selectLineStart) with Shift)\n - Cmd-ArrowRight (on macOS): [`cursorLineEnd`](https://codemirror.net/6/docs/ref/#commands.cursorLineEnd) ([`selectLineEnd`](https://codemirror.net/6/docs/ref/#commands.selectLineEnd) with Shift)\n - ArrowUp: [`cursorLineUp`](https://codemirror.net/6/docs/ref/#commands.cursorLineUp) ([`selectLineUp`](https://codemirror.net/6/docs/ref/#commands.selectLineUp) with Shift)\n - ArrowDown: [`cursorLineDown`](https://codemirror.net/6/docs/ref/#commands.cursorLineDown) ([`selectLineDown`](https://codemirror.net/6/docs/ref/#commands.selectLineDown) with Shift)\n - Cmd-ArrowUp (on macOS): [`cursorDocStart`](https://codemirror.net/6/docs/ref/#commands.cursorDocStart) ([`selectDocStart`](https://codemirror.net/6/docs/ref/#commands.selectDocStart) with Shift)\n - Cmd-ArrowDown (on macOS): [`cursorDocEnd`](https://codemirror.net/6/docs/ref/#commands.cursorDocEnd) ([`selectDocEnd`](https://codemirror.net/6/docs/ref/#commands.selectDocEnd) with Shift)\n - Ctrl-ArrowUp (on macOS): [`cursorPageUp`](https://codemirror.net/6/docs/ref/#commands.cursorPageUp) ([`selectPageUp`](https://codemirror.net/6/docs/ref/#commands.selectPageUp) with Shift)\n - Ctrl-ArrowDown (on macOS): [`cursorPageDown`](https://codemirror.net/6/docs/ref/#commands.cursorPageDown) ([`selectPageDown`](https://codemirror.net/6/docs/ref/#commands.selectPageDown) with Shift)\n - PageUp: [`cursorPageUp`](https://codemirror.net/6/docs/ref/#commands.cursorPageUp) ([`selectPageUp`](https://codemirror.net/6/docs/ref/#commands.selectPageUp) with Shift)\n - PageDown: [`cursorPageDown`](https://codemirror.net/6/docs/ref/#commands.cursorPageDown) ([`selectPageDown`](https://codemirror.net/6/docs/ref/#commands.selectPageDown) with Shift)\n - Home: [`cursorLineBoundaryBackward`](https://codemirror.net/6/docs/ref/#commands.cursorLineBoundaryBackward) ([`selectLineBoundaryBackward`](https://codemirror.net/6/docs/ref/#commands.selectLineBoundaryBackward) with Shift)\n - End: [`cursorLineBoundaryForward`](https://codemirror.net/6/docs/ref/#commands.cursorLineBoundaryForward) ([`selectLineBoundaryForward`](https://codemirror.net/6/docs/ref/#commands.selectLineBoundaryForward) with Shift)\n - Ctrl-Home (Cmd-Home on macOS): [`cursorDocStart`](https://codemirror.net/6/docs/ref/#commands.cursorDocStart) ([`selectDocStart`](https://codemirror.net/6/docs/ref/#commands.selectDocStart) with Shift)\n - Ctrl-End (Cmd-Home on macOS): [`cursorDocEnd`](https://codemirror.net/6/docs/ref/#commands.cursorDocEnd) ([`selectDocEnd`](https://codemirror.net/6/docs/ref/#commands.selectDocEnd) with Shift)\n - Enter: [`insertNewlineAndIndent`](https://codemirror.net/6/docs/ref/#commands.insertNewlineAndIndent)\n - Ctrl-a (Cmd-a on macOS): [`selectAll`](https://codemirror.net/6/docs/ref/#commands.selectAll)\n - Backspace: [`deleteCharBackward`](https://codemirror.net/6/docs/ref/#commands.deleteCharBackward)\n - Delete: [`deleteCharForward`](https://codemirror.net/6/docs/ref/#commands.deleteCharForward)\n - Ctrl-Backspace (Alt-Backspace on macOS): [`deleteGroupBackward`](https://codemirror.net/6/docs/ref/#commands.deleteGroupBackward)\n - Ctrl-Delete (Alt-Delete on macOS): [`deleteGroupForward`](https://codemirror.net/6/docs/ref/#commands.deleteGroupForward)\n - Cmd-Backspace (macOS): [`deleteLineBoundaryBackward`](https://codemirror.net/6/docs/ref/#commands.deleteLineBoundaryBackward).\n - Cmd-Delete (macOS): [`deleteLineBoundaryForward`](https://codemirror.net/6/docs/ref/#commands.deleteLineBoundaryForward).\n*/\nconst standardKeymap = /*@__PURE__*/[\n { key: \"ArrowLeft\", run: cursorCharLeft, shift: selectCharLeft, preventDefault: true },\n { key: \"Mod-ArrowLeft\", mac: \"Alt-ArrowLeft\", run: cursorGroupLeft, shift: selectGroupLeft, preventDefault: true },\n { mac: \"Cmd-ArrowLeft\", run: cursorLineBoundaryLeft, shift: selectLineBoundaryLeft, preventDefault: true },\n { key: \"ArrowRight\", run: cursorCharRight, shift: selectCharRight, preventDefault: true },\n { key: \"Mod-ArrowRight\", mac: \"Alt-ArrowRight\", run: cursorGroupRight, shift: selectGroupRight, preventDefault: true },\n { mac: \"Cmd-ArrowRight\", run: cursorLineBoundaryRight, shift: selectLineBoundaryRight, preventDefault: true },\n { key: \"ArrowUp\", run: cursorLineUp, shift: selectLineUp, preventDefault: true },\n { mac: \"Cmd-ArrowUp\", run: cursorDocStart, shift: selectDocStart },\n { mac: \"Ctrl-ArrowUp\", run: cursorPageUp, shift: selectPageUp },\n { key: \"ArrowDown\", run: cursorLineDown, shift: selectLineDown, preventDefault: true },\n { mac: \"Cmd-ArrowDown\", run: cursorDocEnd, shift: selectDocEnd },\n { mac: \"Ctrl-ArrowDown\", run: cursorPageDown, shift: selectPageDown },\n { key: \"PageUp\", run: cursorPageUp, shift: selectPageUp },\n { key: \"PageDown\", run: cursorPageDown, shift: selectPageDown },\n { key: \"Home\", run: cursorLineBoundaryBackward, shift: selectLineBoundaryBackward, preventDefault: true },\n { key: \"Mod-Home\", run: cursorDocStart, shift: selectDocStart },\n { key: \"End\", run: cursorLineBoundaryForward, shift: selectLineBoundaryForward, preventDefault: true },\n { key: \"Mod-End\", run: cursorDocEnd, shift: selectDocEnd },\n { key: \"Enter\", run: insertNewlineAndIndent },\n { key: \"Mod-a\", run: selectAll },\n { key: \"Backspace\", run: deleteCharBackward, shift: deleteCharBackward },\n { key: \"Delete\", run: deleteCharForward },\n { key: \"Mod-Backspace\", mac: \"Alt-Backspace\", run: deleteGroupBackward },\n { key: \"Mod-Delete\", mac: \"Alt-Delete\", run: deleteGroupForward },\n { mac: \"Mod-Backspace\", run: deleteLineBoundaryBackward },\n { mac: \"Mod-Delete\", run: deleteLineBoundaryForward }\n].concat(/*@__PURE__*/emacsStyleKeymap.map(b => ({ mac: b.key, run: b.run, shift: b.shift })));\n/**\nThe default keymap. Includes all bindings from\n[`standardKeymap`](https://codemirror.net/6/docs/ref/#commands.standardKeymap) plus the following:\n\n- Alt-ArrowLeft (Ctrl-ArrowLeft on macOS): [`cursorSyntaxLeft`](https://codemirror.net/6/docs/ref/#commands.cursorSyntaxLeft) ([`selectSyntaxLeft`](https://codemirror.net/6/docs/ref/#commands.selectSyntaxLeft) with Shift)\n- Alt-ArrowRight (Ctrl-ArrowRight on macOS): [`cursorSyntaxRight`](https://codemirror.net/6/docs/ref/#commands.cursorSyntaxRight) ([`selectSyntaxRight`](https://codemirror.net/6/docs/ref/#commands.selectSyntaxRight) with Shift)\n- Alt-ArrowUp: [`moveLineUp`](https://codemirror.net/6/docs/ref/#commands.moveLineUp)\n- Alt-ArrowDown: [`moveLineDown`](https://codemirror.net/6/docs/ref/#commands.moveLineDown)\n- Shift-Alt-ArrowUp: [`copyLineUp`](https://codemirror.net/6/docs/ref/#commands.copyLineUp)\n- Shift-Alt-ArrowDown: [`copyLineDown`](https://codemirror.net/6/docs/ref/#commands.copyLineDown)\n- Escape: [`simplifySelection`](https://codemirror.net/6/docs/ref/#commands.simplifySelection)\n- Ctrl-Enter (Cmd-Enter on macOS): [`insertBlankLine`](https://codemirror.net/6/docs/ref/#commands.insertBlankLine)\n- Alt-l (Ctrl-l on macOS): [`selectLine`](https://codemirror.net/6/docs/ref/#commands.selectLine)\n- Ctrl-i (Cmd-i on macOS): [`selectParentSyntax`](https://codemirror.net/6/docs/ref/#commands.selectParentSyntax)\n- Ctrl-[ (Cmd-[ on macOS): [`indentLess`](https://codemirror.net/6/docs/ref/#commands.indentLess)\n- Ctrl-] (Cmd-] on macOS): [`indentMore`](https://codemirror.net/6/docs/ref/#commands.indentMore)\n- Ctrl-Alt-\\\\ (Cmd-Alt-\\\\ on macOS): [`indentSelection`](https://codemirror.net/6/docs/ref/#commands.indentSelection)\n- Shift-Ctrl-k (Shift-Cmd-k on macOS): [`deleteLine`](https://codemirror.net/6/docs/ref/#commands.deleteLine)\n- Shift-Ctrl-\\\\ (Shift-Cmd-\\\\ on macOS): [`cursorMatchingBracket`](https://codemirror.net/6/docs/ref/#commands.cursorMatchingBracket)\n- Ctrl-/ (Cmd-/ on macOS): [`toggleComment`](https://codemirror.net/6/docs/ref/#commands.toggleComment).\n- Shift-Alt-a: [`toggleBlockComment`](https://codemirror.net/6/docs/ref/#commands.toggleBlockComment).\n*/\nconst defaultKeymap = /*@__PURE__*/[\n { key: \"Alt-ArrowLeft\", mac: \"Ctrl-ArrowLeft\", run: cursorSyntaxLeft, shift: selectSyntaxLeft },\n { key: \"Alt-ArrowRight\", mac: \"Ctrl-ArrowRight\", run: cursorSyntaxRight, shift: selectSyntaxRight },\n { key: \"Alt-ArrowUp\", run: moveLineUp },\n { key: \"Shift-Alt-ArrowUp\", run: copyLineUp },\n { key: \"Alt-ArrowDown\", run: moveLineDown },\n { key: \"Shift-Alt-ArrowDown\", run: copyLineDown },\n { key: \"Escape\", run: simplifySelection },\n { key: \"Mod-Enter\", run: insertBlankLine },\n { key: \"Alt-l\", mac: \"Ctrl-l\", run: selectLine },\n { key: \"Mod-i\", run: selectParentSyntax, preventDefault: true },\n { key: \"Mod-[\", run: indentLess },\n { key: \"Mod-]\", run: indentMore },\n { key: \"Mod-Alt-\\\\\", run: indentSelection },\n { key: \"Shift-Mod-k\", run: deleteLine },\n { key: \"Shift-Mod-\\\\\", run: cursorMatchingBracket },\n { key: \"Mod-/\", run: toggleComment },\n { key: \"Alt-A\", run: toggleBlockComment }\n].concat(standardKeymap);\n/**\nA binding that binds Tab to [`indentMore`](https://codemirror.net/6/docs/ref/#commands.indentMore) and\nShift-Tab to [`indentLess`](https://codemirror.net/6/docs/ref/#commands.indentLess).\nPlease see the [Tab example](../../examples/tab/) before using\nthis.\n*/\nconst indentWithTab = { key: \"Tab\", run: indentMore, shift: indentLess };\n\nexport { blockComment, blockUncomment, copyLineDown, copyLineUp, cursorCharBackward, cursorCharForward, cursorCharLeft, cursorCharRight, cursorDocEnd, cursorDocStart, cursorGroupBackward, cursorGroupForward, cursorGroupLeft, cursorGroupRight, cursorLineBoundaryBackward, cursorLineBoundaryForward, cursorLineBoundaryLeft, cursorLineBoundaryRight, cursorLineDown, cursorLineEnd, cursorLineStart, cursorLineUp, cursorMatchingBracket, cursorPageDown, cursorPageUp, cursorSubwordBackward, cursorSubwordForward, cursorSyntaxLeft, cursorSyntaxRight, defaultKeymap, deleteCharBackward, deleteCharBackwardStrict, deleteCharForward, deleteGroupBackward, deleteGroupForward, deleteLine, deleteLineBoundaryBackward, deleteLineBoundaryForward, deleteToLineEnd, deleteToLineStart, deleteTrailingWhitespace, emacsStyleKeymap, history, historyField, historyKeymap, indentLess, indentMore, indentSelection, indentWithTab, insertBlankLine, insertNewline, insertNewlineAndIndent, insertNewlineKeepIndent, insertTab, invertedEffects, isolateHistory, lineComment, lineUncomment, moveLineDown, moveLineUp, redo, redoDepth, redoSelection, selectAll, selectCharBackward, selectCharForward, selectCharLeft, selectCharRight, selectDocEnd, selectDocStart, selectGroupBackward, selectGroupForward, selectGroupLeft, selectGroupRight, selectLine, selectLineBoundaryBackward, selectLineBoundaryForward, selectLineBoundaryLeft, selectLineBoundaryRight, selectLineDown, selectLineEnd, selectLineStart, selectLineUp, selectMatchingBracket, selectPageDown, selectPageUp, selectParentSyntax, selectSubwordBackward, selectSubwordForward, selectSyntaxLeft, selectSyntaxRight, simplifySelection, splitLine, standardKeymap, toggleBlockComment, toggleBlockCommentByLine, toggleComment, toggleLineComment, transposeChars, undo, undoDepth, undoSelection };\n"],"names":["toggleComment","target","state","line","doc","lineAt","selection","main","from","config","getConfig","toggleLineComment","block","toggleBlockCommentByLine","command","f","option","dispatch","readOnly","tr","update","changeLineComment","lineComment","lineUncomment","toggleBlockComment","changeBlockComment","blockComment","blockUncomment","o","s","ranges","r","fromLine","toLine","to","last","length","push","exec","text","selectedLineRanges","pos","data","languageDataAt","SearchMargin","tokens","map","every","c","comments","i","open","close","startText","endText","textBefore","sliceDoc","textAfter","spaceBefore","spaceAfter","beforeOff","slice","margin","startSpace","endSpace","endOff","test","charAt","findBlockComment","changes","range","insert","some","comment","token","lines","prevLine","startI","minIndent","indent","empty","single","l","changeSet","fromHistory","Annotation","define","isolateHistory","invertedEffects","Facet","historyConfig","combine","configs","combineConfig","minDepth","newGroupDelay","joinToEvent","_t","isAdjacent","Math","max","min","a","b","adj","historyField_","StateField","create","HistoryState","facet","fromHist","annotation","item","HistEvent","fromTransaction","side","other","undone","done","updateBranch","addSelection","startState","rest","isolate","Transaction","addToHistory","addMapping","desc","event","time","userEvent","addChanges","toJSON","value","e","fromJSON","json","history","of","EditorView","domEventHandlers","beforeinput","view","inputType","undo","redo","preventDefault","historyField","cmd","historyState","field","pop","undoSelection","redoSelection","depth","histState","branch","undoDepth","redoDepth","constructor","effects","mapped","startSelection","selectionsAfter","this","setSelAfter","after","_a","_b","_c","ChangeSet","ChangeDesc","EditorSelection","none","invert","result","concat","undefined","selections","maxLen","newEvent","start","newBranch","conc","MaxSelectionsPerEvent","lastEvent","sels","eq","popSelection","addMappingToBranch","mapping","mapEvent","extraSelections","mappedChanges","before","mapDesc","fullMapping","composeDesc","StateEffect","mapEffects","joinableUserEvent","prevTime","prevUserEvent","iterChangedRanges","t","_f","compose","filter","onlySelection","annotations","scrollIntoView","historyKeymap","key","run","mac","linux","updateSel","sel","by","mainIndex","setSel","moveSel","how","rangeEnd","forward","cursor","cursorByChar","moveByChar","ltrAtCursor","textDirectionAt","head","Direction","LTR","cursorCharLeft","cursorCharRight","cursorCharForward","cursorCharBackward","cursorByGroup","moveByGroup","cursorGroupLeft","cursorGroupRight","cursorGroupForward","cursorGroupBackward","segmenter","Intl","Segmenter","granularity","moveBySubword","categorize","charCategorizer","cat","CharCategory","Space","steps","sawUpper","sawLower","step","next","ahead","nextCat","Word","charCodeAt","toLowerCase","end","skipped","segments","Array","segment","index","cursorBySubword","cursorSubwordForward","cursorSubwordBackward","interestingNode","node","bracketProp","type","prop","len","firstChild","moveBySyntax","match","newPos","syntaxTree","resolveInner","NodeProp","closedBy","openedBy","at","childAfter","childBefore","matchBrackets","matched","cursorSyntaxLeft","cursorSyntaxRight","cursorByLine","moved","moveVertically","moveToLineBoundary","cursorLineUp","cursorLineDown","pageInfo","height","selfScroll","scrollDOM","clientHeight","scrollHeight","marginTop","marginBottom","source","scrollMargins","margins","top","bottom","dom","ownerDocument","defaultView","window","innerHeight","defaultLineHeight","cursorByPage","effect","page","startPos","coordsAtPos","scrollRect","getBoundingClientRect","scrollTop","scrollBottom","y","yMargin","cursorPageUp","cursorPageDown","moveByLineBoundary","lineBlockAt","space","cursorLineBoundaryForward","cursorLineBoundaryBackward","cursorLineBoundaryLeft","cursorLineBoundaryRight","cursorLineStart","cursorLineEnd","toMatchingBracket","extend","found","matching","anchor","cursorMatchingBracket","selectMatchingBracket","extendSel","goalColumn","bidiLevel","selectByChar","selectCharLeft","selectCharRight","selectCharForward","selectCharBackward","selectByGroup","selectGroupLeft","selectGroupRight","selectGroupForward","selectGroupBackward","selectBySubword","selectSubwordForward","selectSubwordBackward","selectSyntaxLeft","selectSyntaxRight","selectByLine","selectLineUp","selectLineDown","selectByPage","selectPageUp","selectPageDown","selectLineBoundaryForward","selectLineBoundaryBackward","selectLineBoundaryLeft","selectLineBoundaryRight","selectLineStart","selectLineEnd","cursorDocStart","cursorDocEnd","selectDocStart","selectDocEnd","selectAll","selectLine","selectedLineBlocks","selectParentSyntax","cur","resolveStack","parent","simplifySelection","deleteBy","changeByRange","towards","skipAtomic","announce","phrase","atomicRanges","between","deleteByChar","byIndentUnit","targetPos","drop","countColumn","tabSize","getIndentUnit","findClusterBreak","number","deleteCharBackward","deleteCharBackwardStrict","deleteCharForward","deleteByGroup","nextChar","deleteGroupBackward","deleteGroupForward","deleteToLineEnd","lineEnd","deleteToLineStart","lineStart","deleteLineBoundaryBackward","deleteLineBoundaryForward","deleteTrailingWhitespace","prev","iter","lineBreak","trailing","search","splitLine","Text","transposeChars","append","blocks","upto","startLine","endLine","moveLine","nextLine","size","moveLineUp","moveLineDown","copyLine","copyLineUp","copyLineDown","deleteLine","dist","lineWrapping","assoc","documentTop","insertNewline","replaceSelection","insertNewlineKeepIndent","insertNewlineAndIndent","newlineAndIndent","insertBlankLine","atEof","explode","context","indexOf","name","isBetweenBrackets","cx","IndentContext","simulateBreak","simulateDoubleBreak","getIndentation","indentString","lineIndent","changeBySelectedLine","atLine","mapPos","indentSelection","updated","Object","overrideIndentation","norm","indentMore","indentUnit","indentLess","col","keep","insertTab","emacsStyleKeymap","shift","standardKeymap","defaultKeymap","indentWithTab"],"mappings":"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","x_google_ignoreList":[0]} |