当服务器使用旧版本的 zsh 时,SSH 会中断行或开头搜索

当服务器使用旧版本的 zsh 时,SSH 会中断行或开头搜索

我有

# auto-complete
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search

在我的 .zshrc 中。这可以正常工作,例如,写入 ssh 并按向上箭头将循环浏览历史记录中的所有 ssh 命令。

但是,如果我先 ssh 进入服务器,然后退出回到本地终端,按向上箭头会忽略已写入的内容,并仅循环显示历史记录,即它会显示所有命令;而不是仅以 ssh 开头的命令。只有当我 ssh 进入具有较旧 ZSH 版本的服务器时才会发生这种情况。如果我 ssh 进入具有相同 ZSH 版本的服务器,则一切都会按预期运行。

服务器有一个空的 .zshrc。我的 ZSH 版本是 zsh 5.7.1 (x86_64-debian-linux-gnu)(用于运行 Debian 10 的服务器)和 zsh 5.9 (x86_64-pc-linux-gnu)(用于运行 Arch 的本地计算机)。有什么想法可以解决这个问题吗?

答案1

我遇到了完全相同的问题。问题是,根据“应用程序模式”是否处于活动状态(而不是“正常模式”),终端会针对给定的箭头键按下发送不同的转义序列。对于向上箭头,^[[A在正常模式下序列为 (CSI A),而^[OA在应用程序模式下序列为 (SS3 A)。

这是一个问题,因为这些bindkey线路只捕获 CSI 序列,而不是 SS3 序列——“CSI 序列”是^[[,而“SS3 序列”是^[O。但了解了这一点,修复就很简单了:

# auto-complete
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[OA" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search
bindkey "^[OB" down-line-or-beginning-search
  • 一些进一步的背景信息这里
  • 好的参考关于转义代码等等

相关内容