mirror of
https://github.com/heyman/heynote.git
synced 2025-06-20 09:37:50 +02:00
Add Emacs set mark mode (C-Space)
This commit is contained in:
parent
1292c6ced3
commit
0bbdb262e6
@ -2,6 +2,7 @@ import { EditorState, EditorSelection } from "@codemirror/state"
|
|||||||
import { EditorView } from "@codemirror/view"
|
import { EditorView } from "@codemirror/view"
|
||||||
|
|
||||||
import { LANGUAGES } from './languages.js';
|
import { LANGUAGES } from './languages.js';
|
||||||
|
import { setEmacsMarkMode } from "./emacs.js"
|
||||||
|
|
||||||
|
|
||||||
const languageTokensMatcher = LANGUAGES.map(l => l.token).join("|")
|
const languageTokensMatcher = LANGUAGES.map(l => l.token).join("|")
|
||||||
@ -38,6 +39,10 @@ export const heynoteCopyPaste = (editor) => {
|
|||||||
userEvent: "delete.cut"
|
userEvent: "delete.cut"
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if we're in Emacs mode, we want to exit mark mode in case we're in it
|
||||||
|
setEmacsMarkMode(false)
|
||||||
|
|
||||||
// if Editor.deselectOnCopy is set (e.g. we're in Emacs mode), we want to remove the selection after we've copied the text
|
// if Editor.deselectOnCopy is set (e.g. we're in Emacs mode), we want to remove the selection after we've copied the text
|
||||||
if (editor.deselectOnCopy && event.type == "copy") {
|
if (editor.deselectOnCopy && event.type == "copy") {
|
||||||
const newSelection = EditorSelection.create(
|
const newSelection = EditorSelection.create(
|
||||||
|
@ -11,7 +11,8 @@ import { heynoteLang } from "./lang-heynote/heynote.js"
|
|||||||
import { noteBlockExtension, blockLineNumbers } from "./block/block.js"
|
import { noteBlockExtension, blockLineNumbers } from "./block/block.js"
|
||||||
import { changeCurrentBlockLanguage } from "./block/commands.js"
|
import { changeCurrentBlockLanguage } from "./block/commands.js"
|
||||||
import { formatBlockContent } from "./block/format-code.js"
|
import { formatBlockContent } from "./block/format-code.js"
|
||||||
import { heynoteKeymap, emacsKeymap } from "./keymap.js"
|
import { heynoteKeymap } from "./keymap.js"
|
||||||
|
import { emacsKeymap } from "./emacs.js"
|
||||||
import { heynoteCopyPaste } from "./copy-paste"
|
import { heynoteCopyPaste } from "./copy-paste"
|
||||||
import { languageDetection } from "./language-detection/autodetect.js"
|
import { languageDetection } from "./language-detection/autodetect.js"
|
||||||
import { autoSaveContent } from "./save.js"
|
import { autoSaveContent } from "./save.js"
|
||||||
|
101
src/editor/emacs.js
Normal file
101
src/editor/emacs.js
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
import { Direction} from "@codemirror/view"
|
||||||
|
import { EditorSelection, EditorState, Prec } from "@codemirror/state"
|
||||||
|
import {
|
||||||
|
undo, redo,
|
||||||
|
cursorGroupLeft, cursorGroupRight, selectGroupLeft, selectGroupRight,
|
||||||
|
simplifySelection,
|
||||||
|
deleteCharForward, deleteCharBackward, deleteToLineEnd,
|
||||||
|
splitLine,
|
||||||
|
transposeChars,
|
||||||
|
cursorPageDown,
|
||||||
|
cursorCharLeft, selectCharLeft,
|
||||||
|
cursorCharRight, selectCharRight,
|
||||||
|
cursorLineUp, selectLineUp,
|
||||||
|
cursorLineDown, selectLineDown,
|
||||||
|
cursorLineStart, selectLineStart,
|
||||||
|
cursorLineEnd, selectLineEnd,
|
||||||
|
} from "@codemirror/commands"
|
||||||
|
import { heynoteKeymap, keymapFromSpec } from "./keymap.js"
|
||||||
|
|
||||||
|
import {
|
||||||
|
gotoPreviousBlock, gotoNextBlock,
|
||||||
|
selectNextBlock, selectPreviousBlock,
|
||||||
|
gotoPreviousParagraph, gotoNextParagraph,
|
||||||
|
selectNextParagraph, selectPreviousParagraph,
|
||||||
|
selectAll,
|
||||||
|
} from "./block/commands.js"
|
||||||
|
|
||||||
|
|
||||||
|
// if set to true, all keybindings for moving around is changed to their corresponding select commands
|
||||||
|
let emacsMarkMode = false
|
||||||
|
|
||||||
|
export function setEmacsMarkMode(value) {
|
||||||
|
emacsMarkMode = value
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a command that will conditionally execute either the default command or the mark mode command
|
||||||
|
*
|
||||||
|
* @param defaultCmd Default command to execute
|
||||||
|
* @param {*} markModeCmd Command to execute if mark mode is active
|
||||||
|
*/
|
||||||
|
function emacsMoveCommand(defaultCmd, markModeCmd) {
|
||||||
|
return (view) => emacsMarkMode ? markModeCmd(view) : defaultCmd(view)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* C-g command that exits mark mode and simplifies selection
|
||||||
|
*/
|
||||||
|
function emacsCancel(view) {
|
||||||
|
simplifySelection(view)
|
||||||
|
setEmacsMarkMode(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exit mark mode before executing selectAll command
|
||||||
|
*/
|
||||||
|
function emacsSelectAll(view) {
|
||||||
|
setEmacsMarkMode(false)
|
||||||
|
return selectAll(view)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function emacsKeymap(editor) {
|
||||||
|
return [
|
||||||
|
heynoteKeymap(editor),
|
||||||
|
Prec.highest(keymapFromSpec([
|
||||||
|
["Ctrl-Shift--", undo],
|
||||||
|
["Ctrl-.", redo],
|
||||||
|
["Ctrl-g", emacsCancel],
|
||||||
|
{key:"Ctrl-ArrowLeft", run:cursorGroupLeft, shift:selectGroupLeft},
|
||||||
|
{key:"Ctrl-ArrowRight", run:cursorGroupRight, shift:selectGroupRight},
|
||||||
|
["ArrowLeft", emacsMoveCommand(cursorCharLeft, selectCharLeft)],
|
||||||
|
["ArrowRight", emacsMoveCommand(cursorCharRight, selectCharRight)],
|
||||||
|
["ArrowUp", emacsMoveCommand(cursorLineUp, selectLineUp)],
|
||||||
|
["ArrowDown", emacsMoveCommand(cursorLineDown, selectLineDown)],
|
||||||
|
|
||||||
|
["Ctrl-d", deleteCharForward],
|
||||||
|
["Ctrl-h", deleteCharBackward],
|
||||||
|
["Ctrl-k", deleteToLineEnd],
|
||||||
|
["Ctrl-o", splitLine],
|
||||||
|
["Ctrl-t", transposeChars],
|
||||||
|
["Ctrl-v", cursorPageDown],
|
||||||
|
|
||||||
|
{ key: "Ctrl-b", run: emacsMoveCommand(cursorCharLeft, selectCharLeft), shift: selectCharLeft, preventDefault: true },
|
||||||
|
{ key: "Ctrl-f", run: emacsMoveCommand(cursorCharRight, selectCharRight), shift: selectCharRight },
|
||||||
|
{ key: "Ctrl-p", run: emacsMoveCommand(cursorLineUp, selectLineUp), shift: selectLineUp },
|
||||||
|
{ key: "Ctrl-n", run: emacsMoveCommand(cursorLineDown, selectLineDown), shift: selectLineDown },
|
||||||
|
{ key: "Ctrl-a", run: emacsMoveCommand(cursorLineStart, selectLineStart), shift: selectLineStart },
|
||||||
|
{ key: "Ctrl-e", run: emacsMoveCommand(cursorLineEnd, selectLineEnd), shift: selectLineEnd },
|
||||||
|
])),
|
||||||
|
|
||||||
|
Prec.highest(keymapFromSpec([
|
||||||
|
["Ctrl-Space", (view) => { emacsMarkMode = !emacsMarkMode }],
|
||||||
|
["Mod-a", emacsSelectAll],
|
||||||
|
{key:"Mod-ArrowUp", run:emacsMoveCommand(gotoPreviousBlock, selectPreviousBlock), shift:selectPreviousBlock},
|
||||||
|
{key:"Mod-ArrowDown", run:emacsMoveCommand(gotoNextBlock, selectNextBlock), shift:selectNextBlock},
|
||||||
|
{key:"Ctrl-ArrowUp", run:emacsMoveCommand(gotoPreviousParagraph, selectPreviousParagraph), shift:selectPreviousParagraph},
|
||||||
|
{key:"Ctrl-ArrowDown", run:emacsMoveCommand(gotoNextParagraph, selectNextParagraph), shift:selectNextParagraph},
|
||||||
|
])),
|
||||||
|
]
|
||||||
|
}
|
@ -1,20 +1,7 @@
|
|||||||
import { EditorView, keymap } from "@codemirror/view"
|
import { keymap } from "@codemirror/view"
|
||||||
import { EditorSelection } from "@codemirror/state"
|
//import { EditorSelection, EditorState } from "@codemirror/state"
|
||||||
import {
|
import {
|
||||||
indentWithTab, insertTab, indentLess, indentMore,
|
indentLess, indentMore,
|
||||||
undo, redo,
|
|
||||||
cursorGroupLeft, cursorGroupRight, selectGroupLeft, selectGroupRight,
|
|
||||||
simplifySelection,
|
|
||||||
deleteCharForward, deleteCharBackward, deleteToLineEnd,
|
|
||||||
splitLine,
|
|
||||||
transposeChars,
|
|
||||||
cursorPageDown,
|
|
||||||
cursorCharLeft, selectCharLeft,
|
|
||||||
cursorCharRight, selectCharRight,
|
|
||||||
cursorLineUp, selectLineUp,
|
|
||||||
cursorLineDown, selectLineDown,
|
|
||||||
cursorLineStart, selectLineStart,
|
|
||||||
cursorLineEnd, selectLineEnd,
|
|
||||||
} from "@codemirror/commands"
|
} from "@codemirror/commands"
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -31,7 +18,7 @@ import {
|
|||||||
import { formatBlockContent } from "./block/format-code.js"
|
import { formatBlockContent } from "./block/format-code.js"
|
||||||
|
|
||||||
|
|
||||||
function keymapFromSpec(specs) {
|
export function keymapFromSpec(specs) {
|
||||||
return keymap.of(specs.map((spec) => {
|
return keymap.of(specs.map((spec) => {
|
||||||
if (spec.run) {
|
if (spec.run) {
|
||||||
return {...spec, preventDefault: true}
|
return {...spec, preventDefault: true}
|
||||||
@ -63,30 +50,3 @@ export function heynoteKeymap(editor) {
|
|||||||
{key:"Ctrl-ArrowDown", run:gotoNextParagraph, shift:selectNextParagraph},
|
{key:"Ctrl-ArrowDown", run:gotoNextParagraph, shift:selectNextParagraph},
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
export function emacsKeymap(editor) {
|
|
||||||
return [
|
|
||||||
heynoteKeymap(editor),
|
|
||||||
keymapFromSpec([
|
|
||||||
["Ctrl-Shift--", undo],
|
|
||||||
["Ctrl-.", redo],
|
|
||||||
["Ctrl-g", simplifySelection],
|
|
||||||
{key:"Ctrl-ArrowLeft", run:cursorGroupLeft, shift:selectGroupLeft},
|
|
||||||
{key:"Ctrl-ArrowRight", run:cursorGroupRight, shift:selectGroupRight},
|
|
||||||
|
|
||||||
["Ctrl-d", deleteCharForward],
|
|
||||||
["Ctrl-h", deleteCharBackward],
|
|
||||||
["Ctrl-k", deleteToLineEnd],
|
|
||||||
["Ctrl-o", splitLine],
|
|
||||||
["Ctrl-t", transposeChars],
|
|
||||||
["Ctrl-v", cursorPageDown],
|
|
||||||
|
|
||||||
{ key: "Ctrl-b", run: cursorCharLeft, shift: selectCharLeft, preventDefault: true },
|
|
||||||
{ key: "Ctrl-f", run: cursorCharRight, shift: selectCharRight },
|
|
||||||
{ key: "Ctrl-p", run: cursorLineUp, shift: selectLineUp },
|
|
||||||
{ key: "Ctrl-n", run: cursorLineDown, shift: selectLineDown },
|
|
||||||
{ key: "Ctrl-a", run: cursorLineStart, shift: selectLineStart },
|
|
||||||
{ key: "Ctrl-e", run: cursorLineEnd, shift: selectLineEnd },
|
|
||||||
]),
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user