52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
![]() |
import {
|
||
|
acceptCompletion,
|
||
|
clearSnippet,
|
||
|
closeCompletion,
|
||
|
hasNextSnippetField,
|
||
|
moveCompletionSelection,
|
||
|
nextSnippetField,
|
||
|
prevSnippetField,
|
||
|
startCompletion,
|
||
|
} from '@codemirror/autocomplete'
|
||
|
import { Prec } from '@codemirror/state'
|
||
|
import { EditorView, keymap, KeyBinding } from '@codemirror/view'
|
||
|
|
||
|
import { CompletionItemKind } from 'vscode-languageserver-protocol'
|
||
|
|
||
|
export const CompletionItemKindMap = Object.fromEntries(
|
||
|
Object.entries(CompletionItemKind).map(([key, value]) => [value, key])
|
||
|
) as Record<CompletionItemKind, string>
|
||
|
|
||
|
const lspAutocompleteKeymap: readonly KeyBinding[] = [
|
||
|
{ key: 'Ctrl-Space', run: startCompletion },
|
||
|
{
|
||
|
key: 'Escape',
|
||
|
run: (view: EditorView): boolean => {
|
||
|
if (clearSnippet(view)) return true
|
||
|
|
||
|
return closeCompletion(view)
|
||
|
},
|
||
|
},
|
||
|
{ key: 'ArrowDown', run: moveCompletionSelection(true) },
|
||
|
{ key: 'ArrowUp', run: moveCompletionSelection(false) },
|
||
|
{ key: 'PageDown', run: moveCompletionSelection(true, 'page') },
|
||
|
{ key: 'PageUp', run: moveCompletionSelection(false, 'page') },
|
||
|
{ key: 'Enter', run: acceptCompletion },
|
||
|
{
|
||
|
key: 'Tab',
|
||
|
run: (view: EditorView): boolean => {
|
||
|
if (hasNextSnippetField(view.state)) {
|
||
|
const result = nextSnippetField(view)
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
return acceptCompletion(view)
|
||
|
},
|
||
|
shift: prevSnippetField,
|
||
|
},
|
||
|
]
|
||
|
|
||
|
export const lspAutocompleteKeymapExt = Prec.highest(
|
||
|
keymap.computeN([], () => [lspAutocompleteKeymap])
|
||
|
)
|