| import { Vim } from "@replit/codemirror-vim"; |
| import { type EditorView, ViewPlugin } from "@codemirror/view"; |
| import type { Extension } from "@codemirror/state"; |
|
|
| export type VimHandlers = { save: () => void; close: () => void }; |
|
|
| const handlers = new WeakMap<EditorView, VimHandlers>(); |
|
|
| |
| export function vimHandlersExtension(getHandlers: () => VimHandlers): Extension { |
| return ViewPlugin.define((view) => { |
| handlers.set(view, getHandlers()); |
| return { |
| update() { |
| |
| handlers.set(view, getHandlers()); |
| }, |
| destroy() { |
| handlers.delete(view); |
| }, |
| }; |
| }); |
| } |
|
|
| let initialized = false; |
|
|
| export function initVimGlobals(): void { |
| if (initialized) return; |
| initialized = true; |
|
|
| type CmAdapter = { cm6?: EditorView }; |
| const getView = (cm: CmAdapter) => cm.cm6; |
|
|
| Vim.defineEx("write", "w", (cm: CmAdapter) => { |
| const view = getView(cm); |
| if (view) handlers.get(view)?.save(); |
| }); |
|
|
| Vim.defineEx("quit", "q", (cm: CmAdapter) => { |
| const view = getView(cm); |
| if (view) handlers.get(view)?.close(); |
| }); |
|
|
| Vim.defineEx("wq", "wq", (cm: CmAdapter) => { |
| const view = getView(cm); |
| if (!view) return; |
| const h = handlers.get(view); |
| h?.save(); |
| h?.close(); |
| }); |
|
|
| Vim.defineEx("xit", "x", (cm: CmAdapter) => { |
| const view = getView(cm); |
| if (!view) return; |
| const h = handlers.get(view); |
| h?.save(); |
| h?.close(); |
| }); |
|
|
| |
| |
| |
| Vim.map("<Up>", "k", "normal"); |
| Vim.map("<Down>", "j", "normal"); |
| Vim.map("<Left>", "h", "normal"); |
| Vim.map("<Right>", "l", "normal"); |
| Vim.map("<Up>", "k", "visual"); |
| Vim.map("<Down>", "j", "visual"); |
| Vim.map("<Left>", "h", "visual"); |
| Vim.map("<Right>", "l", "visual"); |
| } |
|
|