@@ -12,6 +12,7 @@ import { WebLinksAddon } from "@xterm/addon-web-links";
1212import { WebglAddon } from "@xterm/addon-webgl" ;
1313import { Terminal as Xterm } from "@xterm/xterm" ;
1414import {
15+ executeCommand ,
1516 getResolvedKeyBindings ,
1617 getResolvedKeyBindingsVersion ,
1718} from "cm/commandRegistry" ;
@@ -347,7 +348,7 @@ export default class TerminalComponent {
347348
348349 const parsedBindings = [ ] ;
349350
350- Object . values ( getResolvedKeyBindings ( ) ) . forEach ( ( binding ) => {
351+ Object . entries ( getResolvedKeyBindings ( ) ) . forEach ( ( [ name , binding ] ) => {
351352 if ( ! binding . key ) return ;
352353
353354 // Skip editor-only keybindings in terminal
@@ -357,8 +358,11 @@ export default class TerminalComponent {
357358 const keys = binding . key . split ( "|" ) ;
358359
359360 keys . forEach ( ( keyCombo ) => {
360- const parts = keyCombo . split ( "-" ) ;
361+ const parts = keyCombo . endsWith ( "-" )
362+ ? [ ...keyCombo . slice ( 0 , - 1 ) . split ( "-" ) . filter ( Boolean ) , "-" ]
363+ : keyCombo . split ( "-" ) ;
361364 const parsed = {
365+ name,
362366 ctrl : false ,
363367 shift : false ,
364368 alt : false ,
@@ -414,62 +418,54 @@ export default class TerminalComponent {
414418 return false ;
415419 }
416420
417- // Check for Ctrl+= or Ctrl++ (increase font size)
418- if ( event . ctrlKey && ( event . key === "+" || event . key === "=" ) ) {
421+ // Keep terminal font zoom local. Shift variants are handled by app keybindings below.
422+ if (
423+ event . ctrlKey &&
424+ ! event . shiftKey &&
425+ ! event . altKey &&
426+ ! event . metaKey &&
427+ ( event . key === "+" || event . key === "=" )
428+ ) {
419429 event . preventDefault ( ) ;
420430 this . increaseFontSize ( ) ;
421431 return false ;
422432 }
423433
424- // Check for Ctrl+- (decrease font size)
425- if ( event . ctrlKey && event . key === "-" ) {
434+ if (
435+ event . ctrlKey &&
436+ ! event . shiftKey &&
437+ ! event . altKey &&
438+ ! event . metaKey &&
439+ event . key === "-"
440+ ) {
426441 event . preventDefault ( ) ;
427442 this . decreaseFontSize ( ) ;
428443 return false ;
429444 }
430445
431- // Only intercept specific app-wide keybindings, let terminal handle the rest
432446 if ( event . ctrlKey || event . altKey || event . metaKey ) {
433- // Skip modifier-only keys
434447 if ( [ "Control" , "Alt" , "Meta" , "Shift" ] . includes ( event . key ) ) {
435448 return true ;
436449 }
437450
438- // Get parsed app keybindings
439451 const appKeybindings = this . parseAppKeybindings ( ) ;
440-
441- // Check if this is an app-specific keybinding
442- const isAppKeybinding = appKeybindings . some (
452+ const eventKey = event . key === "_" ? "-" : event . key . toLowerCase ( ) ;
453+ const binding = appKeybindings . find (
443454 ( binding ) =>
444455 binding . ctrl === event . ctrlKey &&
445456 binding . shift === event . shiftKey &&
446457 binding . alt === event . altKey &&
447458 binding . meta === event . metaKey &&
448- binding . key === event . key . toLowerCase ( ) ,
459+ binding . key === eventKey ,
449460 ) ;
450461
451- if ( isAppKeybinding ) {
452- const appEvent = new KeyboardEvent ( "keydown" , {
453- key : event . key ,
454- ctrlKey : event . ctrlKey ,
455- shiftKey : event . shiftKey ,
456- altKey : event . altKey ,
457- metaKey : event . metaKey ,
458- bubbles : true ,
459- cancelable : true ,
460- } ) ;
461-
462- // Dispatch to document so it gets picked up by the app's keyboard handler
463- document . dispatchEvent ( appEvent ) ;
464-
465- // Return false to prevent terminal from processing this key
462+ if ( binding && executeCommand ( binding . name ) ) {
466463 return false ;
467464 }
468-
469- // For all other modifier combinations, let the terminal handle them
470- return true ;
471465 }
472466
467+ if ( event . ctrlKey || event . altKey || event . metaKey ) return true ;
468+
473469 // Return true to allow normal processing for other keys
474470 return true ;
475471 } ) ;
0 commit comments