2024-06-30 14:30:44 -07:00
|
|
|
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(
|
2024-07-03 19:28:46 -07:00
|
|
|
keymap.of(lspAutocompleteKeymap)
|
2024-06-30 14:30:44 -07:00
|
|
|
)
|