如何让VSCode使用同一组快捷键在拆分终端与拆分编辑器窗格间统一导航?
如何让VSCode使用同一组快捷键在拆分终端与拆分编辑器窗格间统一导航?
作为同样从Vi/Vim过渡到VSCode的用户,太懂你想要统一快捷键操作的那种爽感了!你的现有配置已经解决了编辑器组和终端面板之间的导航问题,现在就差搞定终端内部拆分窗格的统一操作,咱们来一步步完善它。
首先先确认你的现有配置没问题,先把它们规整成可直接复制的代码块:
现有settings.json配置(需要补充终端内部导航命令)
"terminal.integrated.commandsToSkipShell": [ "workbench.action.focusRightGroup", "workbench.action.focusLeftGroup", "workbench.action.focusAboveGroup", "workbench.action.focusBelowGroup" ],
现有keybindings.json配置(需要添加终端内部导航的优先级绑定)
// ### Mimic some vi-bindings when in a terminal { "key": "ctrl+w ctrl+l", "command": "workbench.action.focusRightGroup", "when": "terminalFocus" }, { "key": "ctrl+w ctrl+h", "command": "workbench.action.focusLeftGroup", "when": "terminalFocus" }, { "key": "ctrl+w ctrl+k", "command": "workbench.action.focusAboveGroup", "when": "terminalFocus" }, { "key": "ctrl+w ctrl+j", "command": "workbench.action.focusBelowGroup", "when": "terminalFocus" }
问题根源
你遇到的核心问题是:workbench.action.focusXXXGroup这类命令只能在编辑器组和终端面板整体之间切换,无法识别终端内部的拆分窗格。当你在拆分的终端里用这些命令时,VSCode会默认把焦点切回编辑器组,而不是在终端内部的拆分窗格间跳转。
解决方案:添加上下文判断的优先级绑定
VSCode提供了terminalSplitActive这个上下文变量,用来判断当前终端是否处于拆分状态。我们可以利用它给快捷键设置优先级:当终端处于拆分状态时,触发终端内部的导航命令;否则继续使用原来的编辑器组切换命令。
1. 更新settings.json
把终端内部导航的命令也加入「跳过shell拦截」的列表,避免终端shell捕获这些快捷键:
"terminal.integrated.commandsToSkipShell": [ "workbench.action.focusRightGroup", "workbench.action.focusLeftGroup", "workbench.action.focusAboveGroup", "workbench.action.focusBelowGroup", "workbench.action.terminal.focusPaneRight", "workbench.action.terminal.focusPaneLeft", "workbench.action.terminal.focusPaneUp", "workbench.action.terminal.focusPaneDown" ],
2. 更新keybindings.json
替换原来的终端绑定,添加带上下文判断的优先级配置:
// 优先处理终端内部拆分窗格的导航 { "key": "ctrl+w ctrl+l", "command": "workbench.action.terminal.focusPaneRight", "when": "terminalFocus && terminalSplitActive" }, { "key": "ctrl+w ctrl+h", "command": "workbench.action.terminal.focusPaneLeft", "when": "terminalFocus && terminalSplitActive" }, { "key": "ctrl+w ctrl+k", "command": "workbench.action.terminal.focusPaneUp", "when": "terminalFocus && terminalSplitActive" }, { "key": "ctrl+w ctrl+j", "command": "workbench.action.terminal.focusPaneDown", "when": "terminalFocus && terminalSplitActive" }, // 终端未拆分时,切换到编辑器组 { "key": "ctrl+w ctrl+l", "command": "workbench.action.focusRightGroup", "when": "terminalFocus && !terminalSplitActive" }, { "key": "ctrl+w ctrl+h", "command": "workbench.action.focusLeftGroup", "when": "terminalFocus && !terminalSplitActive" }, { "key": "ctrl+w ctrl+k", "command": "workbench.action.focusAboveGroup", "when": "terminalFocus && !terminalSplitActive" }, { "key": "ctrl+w ctrl+j", "command": "workbench.action.focusBelowGroup", "when": "terminalFocus && !terminalSplitActive" }
效果验证
配置完成后,你就能用同一组Ctrl+W+Ctrl+H/J/K/L快捷键完成所有导航操作:
- 在编辑器拆分窗格之间跳转
- 在终端面板和编辑器组之间切换
- 在终端内部的拆分窗格之间导航
不管终端是放在底部面板还是侧边栏,不管是单终端还是多拆分终端,操作逻辑完全统一,完美贴合Vi的操作习惯!
备注:内容来源于stack exchange,提问作者ELLIOTTCABLE
相关产品推荐
相关产品推荐

