git –left/right/delete 的交互式键绑定问题

git –left/right/delete 的交互式键绑定问题

我在 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,但我不希望它被上游接受。)

相关内容