2023-04-13 04:21:25 -04:00
|
|
|
import { EditorSelection } from '@codemirror/state'
|
|
|
|
import { getIndentUnit, indentString, indentUnit } from '@codemirror/language'
|
|
|
|
import { EditorView } from '@codemirror/view'
|
|
|
|
|
|
|
|
export const indentMore = (view: EditorView) => {
|
2023-04-24 05:34:00 -04:00
|
|
|
if (view.state.readOnly) {
|
|
|
|
return false
|
|
|
|
}
|
2023-04-13 04:21:25 -04:00
|
|
|
view.dispatch(
|
|
|
|
view.state.changeByRange(range => {
|
|
|
|
const doc = view.state.doc
|
|
|
|
|
|
|
|
const changes = []
|
|
|
|
|
|
|
|
if (range.empty) {
|
|
|
|
// insert space(s) at the cursor
|
|
|
|
const line = doc.lineAt(range.from)
|
|
|
|
const unit = getIndentUnit(view.state)
|
|
|
|
const offset = range.from - line.from
|
|
|
|
const cols = unit - (offset % unit)
|
|
|
|
const insert = indentString(view.state, cols)
|
|
|
|
|
|
|
|
changes.push({ from: range.from, insert })
|
|
|
|
} else {
|
|
|
|
// indent selected lines
|
|
|
|
const insert = view.state.facet(indentUnit)
|
|
|
|
let previousLineNumber = -1
|
|
|
|
for (let pos = range.from; pos <= range.to; pos++) {
|
|
|
|
const line = doc.lineAt(pos)
|
|
|
|
if (previousLineNumber === line.number) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
changes.push({ from: line.from, insert })
|
|
|
|
previousLineNumber = line.number
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const changeSet = view.state.changes(changes)
|
|
|
|
|
|
|
|
return {
|
|
|
|
changes: changeSet,
|
|
|
|
range: EditorSelection.range(
|
|
|
|
changeSet.mapPos(range.anchor, 1),
|
|
|
|
changeSet.mapPos(range.head, 1)
|
|
|
|
),
|
|
|
|
}
|
|
|
|
})
|
|
|
|
)
|
|
|
|
return true
|
|
|
|
}
|