Shell 有时无法在转义序列前输出 ESC ^[ 字符

Shell 有时无法在转义序列前输出 ESC ^[ 字符

有时,在 shell 中按箭头键(通常是向上)时,终端或 shell 无法ESC在转义序列之前输出字符,因此如果我按向上箭头尝试查看最后一个命令,它会[A在 bash 和OAzsh 上输出,而不是最后一个命令。下次按箭头键时,它就可以正常工作了。

无论使用什么终端仿真器或 shell,都会发生这种情况(但在使用 zsh 时会使用它OA[A

我无法说出发生这种情况的具体情况,它似乎有点随机,但它通常发生在我使用窗口管理器(i3)切换窗口后按下箭头时。

这并不是因为我切换窗口后按键太快,因为我可以切换窗口,在 shell 中输入文本,然后按箭头键,它仍然会输出[A/ OA

可能与我使用 i3 作为窗口管理器有关。

我能做些什么来修复或调试这个问题?

答案1

我没有足够的声誉来发表评论,所以请不要给我差评,如果您觉得我的回复很愚蠢,请将我的回复移至评论中:

我看到了四种可能的情况(由于缺乏有关驱动程序、内核、分布、键盘型号等的详细信息,所以非常笼统):

  1. 键盘坏了。
  2. 窗口管理器问题。
  3. 驱动程序/内核问题。
  4. 语言环境问题。

可能的解决方案:

  1. 我见过坏掉的键盘有类似的行为,在随机时间发出奇怪的按键信号,特别是(但不仅限于)在按下其他特定键之后(您说您也使用键盘切换窗口)。尝试另一个键盘,看看是否仍然发生这种情况。我在无线键盘上更常看到这种情况,但我在有线键盘上也遇到过一些奇怪的事情。检查在控制台模式下,在未打开窗口管理器的情况下是否有时会发生这种情况。
  2. i3 可能有问题(如果没有更多详细信息,我无法给您更深入的答案)。更新 i3,或者临时安装另一个窗口管理器,看看错误是否再次重现。
  3. 如果您使用键盘切换窗口,则可能与键盘缓冲区无法正确读取有关。尝试更新内核,看看是否能解决队列问题。如果您安装了虚拟化软件,那么在安装键盘挂钩时它可能破坏了您的驱动程序......
  4. 您的键盘区域设置可能存在问题。尽管这种情况不太可能发生,但您可以尝试获取或生成新的语言环境文件。

答案2

如果您确定您没有ESC在终端中按下您看到的那些转义序列,那么听起来您发现了一个错误。

OA我来这里是因为我也对那些看似随机出现的虚假 s 感到恼火,通常是在我AltTab从 gvim 进入终端时。我不确定我是不是无意中按了ESC,因为ESC在终端中按下箭头键(即使几秒钟后)也会导致打印出那些部分转义序列。

作为一种解决方法,我建议将某些内容绑定到终端由于某种原因接收的那些双重转义序列:

bindkey "^[^[OA" up-line-or-beginning-search
bindkey "^[^[OB" down-line-or-beginning-search
bindkey "^[^[OC" forward-char
bindkey "^[^[OD" backward-char

(基于我在 ZSH 上的默认设置。通过bindkey不带任何参数的调用打印所有键绑定。)

另外,也许设置KEYTIMEOUT=1有帮助?虽然它似乎不会影响我的终端。

相关内容