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 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.of(lspAutocompleteKeymap) )