experiments in a post-browser web
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(editor): add vim :set wrap/nowrap, :set number/nonumber, and :q command

+39 -5
+30 -5
extensions/editor/codemirror.js
··· 17 17 // Compartments for runtime-reconfigurable extensions 18 18 const vimCompartment = new Compartment(); 19 19 const themeCompartment = new Compartment(); 20 + const lineWrapCompartment = new Compartment(); 21 + const lineNumberCompartment = new Compartment(); 20 22 21 23 // ============================================================================ 22 24 // Folditall Algorithm Helpers ··· 406 408 // Space toggles fold (like za) - folditall behavior 407 409 Vim.mapCommand('<Space>', 'action', 'toggleFold', {}, { context: 'normal' }); 408 410 411 + // Vim :set wrap / :set nowrap — toggle line wrapping 412 + Vim.defineOption('wrap', false, 'boolean', undefined, (value, cm) => { 413 + if (!cm) return; // called without editor during init 414 + const view = cm.cm6; 415 + if (view) { 416 + view.dispatch({ 417 + effects: lineWrapCompartment.reconfigure(value ? EditorView.lineWrapping : []), 418 + }); 419 + } 420 + }); 421 + 422 + // Vim :set number / :set nonumber — toggle line numbers and fold gutter 423 + Vim.defineOption('number', true, 'boolean', undefined, (value, cm) => { 424 + if (!cm) return; // called without editor during init 425 + const view = cm.cm6; 426 + if (view) { 427 + view.dispatch({ 428 + effects: lineNumberCompartment.reconfigure(value ? [lineNumbers(), foldGutter()] : []), 429 + }); 430 + } 431 + }); 432 + 409 433 /** 410 434 * Create a peek-themed CodeMirror theme using CSS variables 411 435 */ ··· 591 615 // Theming 592 616 themeCompartment.of(peekTheme), 593 617 618 + // Line wrapping (off by default, toggle via :set wrap / :set nowrap) 619 + lineWrapCompartment.of([]), 620 + 594 621 // Vim mode (initially based on setting) 595 622 vimCompartment.of(vimMode ? vim() : []), 623 + 624 + // Line numbers and fold gutter (toggle via :set number / :set nonumber) 625 + lineNumberCompartment.of(showLineNumbers ? [lineNumbers(), foldGutter()] : []), 596 626 597 627 // Update listener for content, selection, and vim mode changes 598 628 EditorView.updateListener.of(update => { ··· 637 667 } 638 668 }), 639 669 ]; 640 - 641 - // Optional line numbers 642 - if (showLineNumbers) { 643 - extensions.push(lineNumbers(), foldGutter()); 644 - } 645 670 646 671 const state = EditorState.create({ 647 672 doc: content,
+9
extensions/editor/home.js
··· 276 276 debug && console.log('[editor:vim] :w — saved'); 277 277 }); 278 278 279 + Vim.defineEx('quit', 'q', () => { 280 + if (api?.window?.close) { 281 + api.window.close(); 282 + } else { 283 + window.close(); 284 + } 285 + debug && console.log('[editor:vim] :q — closing window'); 286 + }); 287 + 279 288 Vim.defineEx('wq', 'wq', async () => { 280 289 if (currentItemId) { 281 290 const content = editorLayout.getContent();