按键透传 SecureCRT
背景
我的工作环境是通过 SecureCRT 连接远程 linux 机器,然后使用 vim 进行开发。但是经常会发现一些 SecureCRT 默认的快捷键会与 VIM 的快捷键以及 linux 的控制台快捷键冲突。而且这个还很难取消掉,这个问题让我不胜其烦,因此一直在摸索如何处理掉这个问题。解下来就记录我解决这个问题的方法。
方案描述
按键设置
通过 SecureCRT 的设置 Tools → Keymap Editor
的方式,或者 Options → Session Optionas... → Terminal → Emulation → Mapped Keys → Map a Key
的方式,都可以映射一个快捷键,前者是对应全局,后者是修改本 Session 的按键映射。
下面以 Alt+j
举例,说明如何配置按键。
如上图所示,在 Keymap Editor
编辑界面中勾选需要映射的按键,然后在 Action → Function
的下拉框里面选择 Send String
,并且在右边的输入框中输入
按键码的获取
获取按键的编码需要使用 showkey -a
这个命令。showkey 命令可以检查并显示按下按键的扫描码和键盘码。如果有 wsl 的话,可以从 wsl 中打开控制台,输入 showkey -a
然后会开始监控键盘,直到使用 CTRL-D
终止程序:
# 下面分别按下 Alt+j、Alt+k、Ctrl+A、Ctrl+K、Alt+Backspace
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[j 27 0033 0x1b
106 0152 0x6a
^[k 27 0033 0x1b
107 0153 0x6b
^A 1 0001 0x01
^K 11 0013 0x0b
^[^? 27 0033 0x1b
127 0177 0x7f
可以看到,Alt+j
对应两个八进制码 0033
和 0152
,实际上 0152
就是 j
的 ASCII 码,所以 Alt 对应的八进制键盘码就是 0033
。然后按键 j
的话,仍旧是输入 j
即可,无需改成 0152
。如果组合按键中,有两个转义字符,如 Alt+Backspace
则两个按键都需要使用 + 八进制按键码的方式:
Alt+Backspace = "
注意事项
想通过设置 Disable
的方式,取消 Secure CRT 的默认按键配置,从而想让该按键能传入远程机器的方式是行不通的,这种操作只会让该按键完全无响应。
总结
可以通过 showkey -a
指令获取八进制按键码,然后通过按键映射 Send String
的方式将按键码发送到远端机器,从而实现按键透传到远端机器,解决 SecureCRT 按键与 VIM 按键或者 linux 控制台默认按键冲突的问题。