Merge pull request 'Add shortcut for navigating through labels!' (#1807) from jade/dollar_shortcut into main
Reviewed-on: https://codeberg.org/uzu/strudel/pulls/1807
This commit is contained in:
commit
d642c0e12f
2 changed files with 40 additions and 0 deletions
|
|
@ -24,6 +24,7 @@ import { sliderPlugin, updateSliderWidgets } from './slider.mjs';
|
||||||
import { activateTheme, initTheme, theme } from './themes.mjs';
|
import { activateTheme, initTheme, theme } from './themes.mjs';
|
||||||
import { isTooltipEnabled } from './tooltip.mjs';
|
import { isTooltipEnabled } from './tooltip.mjs';
|
||||||
import { updateWidgets, widgetPlugin } from './widget.mjs';
|
import { updateWidgets, widgetPlugin } from './widget.mjs';
|
||||||
|
import { jumpToCharacter } from './labelJump.mjs';
|
||||||
|
|
||||||
export { toggleBlockComment, toggleBlockCommentByLine, toggleComment, toggleLineComment } from '@codemirror/commands';
|
export { toggleBlockComment, toggleBlockCommentByLine, toggleComment, toggleLineComment } from '@codemirror/commands';
|
||||||
|
|
||||||
|
|
@ -119,6 +120,14 @@ export function initEditor({ initialCode = '', onChange, onEvaluate, onStop, roo
|
||||||
preventDefault: true,
|
preventDefault: true,
|
||||||
run: () => onStop?.(),
|
run: () => onStop?.(),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: 'Alt-w',
|
||||||
|
run: (view) => jumpToCharacter(view, '$', 1),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'Alt-q',
|
||||||
|
run: (view) => jumpToCharacter(view, '$', -1),
|
||||||
|
},
|
||||||
/* {
|
/* {
|
||||||
key: 'Ctrl-Shift-.',
|
key: 'Ctrl-Shift-.',
|
||||||
run: () => (onPanic ? onPanic() : onStop?.()),
|
run: () => (onPanic ? onPanic() : onStop?.()),
|
||||||
|
|
|
||||||
31
packages/codemirror/labelJump.mjs
Normal file
31
packages/codemirror/labelJump.mjs
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
import { EditorSelection } from '@codemirror/state';
|
||||||
|
import { SearchCursor } from '@codemirror/search';
|
||||||
|
|
||||||
|
export function jumpToCharacter(view, character, direction = 1) {
|
||||||
|
const { state, dispatch } = view;
|
||||||
|
const pos = state.selection.main.head;
|
||||||
|
const cursor = new SearchCursor(state.doc, character);
|
||||||
|
|
||||||
|
let characterPositions = [];
|
||||||
|
let jumpPos;
|
||||||
|
while (!cursor.next().done) {
|
||||||
|
characterPositions.push(cursor.value.to);
|
||||||
|
}
|
||||||
|
if (!characterPositions.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (direction > 0) {
|
||||||
|
jumpPos = characterPositions.find((x) => x > pos + 1) ?? characterPositions.at(0); // Loop back around for convenience
|
||||||
|
} else {
|
||||||
|
jumpPos = characterPositions.reverse().find((x) => x < pos + 1) ?? characterPositions.at(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jumpPos == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
dispatch({
|
||||||
|
selection: EditorSelection.cursor(jumpPos - 1),
|
||||||
|
scrollIntoView: true,
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue