import { splitListItem, liftListItem, sinkListItem } from 'prosemirror-schema-list'; import type { Schema } from 'prosemirror-model'; import { undo, redo } from 'prosemirror-history'; import { undoInputRule } from 'prosemirror-inputrules'; import type { Command } from 'prosemirror-state'; import { toggleMark, selectParentNode, joinUp, joinDown, chainCommands, newlineInCode, createParagraphNear, liftEmptyBlock, splitBlockKeepMarks, } from 'prosemirror-commands'; export const buildKeymap = (schema: Schema) => { const keys: Record = {}; const bind = (key: string, cmd: Command) => (keys[key] = cmd); bind('Alt-ArrowUp', joinUp); bind('Alt-ArrowDown', joinDown); bind('Mod-z', undo); bind('Mod-y', redo); bind('Backspace', undoInputRule); bind('Escape', selectParentNode); bind('Mod-b', toggleMark(schema.marks.strong)); bind('Mod-i', toggleMark(schema.marks.em)); bind('Mod-u', toggleMark(schema.marks.underline)); bind('Mod-d', toggleMark(schema.marks.strikethrough)); bind('Mod-e', toggleMark(schema.marks.code)); bind('Mod-;', toggleMark(schema.marks.superscript)); bind(`Mod-'`, toggleMark(schema.marks.subscript)); bind( 'Enter', chainCommands( splitListItem(schema.nodes.list_item), newlineInCode, createParagraphNear, liftEmptyBlock, splitBlockKeepMarks, ), ); bind('Mod-[', liftListItem(schema.nodes.list_item)); bind('Mod-]', sinkListItem(schema.nodes.list_item)); bind('Tab', sinkListItem(schema.nodes.list_item)); return keys; };