我在 Mac 上使用 zsh,经过一些bindkey
小技巧,我设法让 left/right/delete/backspace 在 zsh (和 bash) 上工作。git --interactive
但在 中,这不能正常工作。
当我尝试在交互模式下提交内容时,只有退格键有效。当我按左键、右键、删除键时,我会获得这些键的 ANSI 转义序列:^[[D ^[[C ^[[3~
。当我在 bindkey 列表中查找这些时,它们似乎配置正确:
% bindkey | \grep -F "^[[D"
"^[[D" backward-char
% bindkey | \grep -F "^[[C"
"^[[C" forward-char
% bindkey | \grep -F "^[[3~"
"^[[3~" delete-char
在我使用 bash 和 zsh 时都会发生这种情况。当我使用 X11 而xterm
不是 Terminal.app 时也会发生这种情况。我发现很多帖子都提到了 zsh 本身存在的这些问题(例如本论坛,这个帖子或SU 本身),但它们都与 git 无关。
简而言之:左/右/删除键做在我的 shell 中可以工作,但在 中却不行git --interactive
。我该如何修复这个问题?
答案1
首先,特殊键由程序本身处理,而不是由 tty 设备处理。当您按下 时Left,Terminal.app 会发送ESC [D
到狂欢,而解释它取决于狂欢的 Readline 图书馆。
唯一的例外是列出的键stty -a
– 当 tty 处于“cooked”模式时,它本身会将这些按键解释为 Backspace。(Bash 和 Zsh 实际上自己使用“raw”模式,但在运行程序之前会暂时切换到“cooked”。)
其次,贝壳git --interactive
和完全地不相关的程序。运行 时git
,shell 被暂停。所有程序都可以直接访问 tty 设备,并且每个程序都使用自己的库与其交互 –狂欢使用 Readline,嘚使用自己的 ZLE,git --interactive
直接从终端读取。绑定在嘚仅适用于嘚, 不是git,正在从终端读取。
正如我所说,git --interactive
直接从终端读取,这意味着您不能使用 Zshbindkey
或 Readline ~/.inputrc
。您必须修改程序才能使用 Readline 或类似的库。(由于git-add--interactive
是 Perl 脚本,您可以重写其中的部分内容以使用 Term::ReadLine,但我不希望它被上游接受。)