进一步阅读

进一步阅读

我已经寻找这个OhMyZSH!问题的解决方案几天了,但找不到解决方案。诚然,我不明白到底是如何zle工作的,对于bindkey.终端仿真器发送“控制序列”的方式以及“终端类型”的含义(xterm、 与xterm-256-color等)也是如此。与“应用程序模式”相同

设置

我有 2 台机器安装了最新版本的 OhMyZSH,提交c3b072

  • 机器 A:SLES 11 SP4,正在运行zsh 4.3.6 (x86_64-suse-linux-gnu)
  • 机器B:Ubuntu 16.04,正在运行zsh 5.1.1 (x86_64-ubuntu-linux-gnu)

我使用在 Windows 上运行的 Putty 连接到任一计算机,终端类型为xterm,并且处于 UTF-8 转换模式。

我的zshrc文件几乎都是普通OhMyZSH模板,我刚刚将提示更改为dieter在机器 A 上,并且powerlevel-9k[https://github.com/bhilburn/powerlevel9k]在机器 B 上。

我在机器 A(又名“坏”机器)上观察到的情况

当我编辑命令行时,LeftRight光标键会移动一整个单词(而不是 1 个单个字符)。

HomeEnd键,按预期将光标带到行的开头和结尾。

所描述的行为适用于emacs模式 ( bindkey -e) 中。

当我进入vim模式 ( bindkey -v) 时,LeftRight箭头会移动 1 个字符,但HomeEnd键不会将光标移动到行首和行尾。相反,它们会切换光标下字符的大小写。

我在机器 B(又名“好”机器)上观察到的情况

LeftRight键将光标移动一个字符。 Home 和 end 键分别将光标移动到行的开头和结尾。Ctrl+ACtrl+E组合将我的光标分别带到开头和结尾。

这是我希望所有 shell 都具有的行为。

到目前为止我发现了什么

我认为这是一个bindkey问题。但我对此几乎一无所知,而且我很难找到有关此zsh内置的任何文档。

尽管文件相似,但在登录时在两台计算机上运行zsh -v会产生截然不同的结果。.zshrc

有人可以向我解释一下是什么导致这两台机器的行为如此不同,以及我如何更改我的配置以便恢复一致性,并且我所有的 shell 都像在机器 B(又名“好”机器)上一样?

我确信如果您需要更多我不知道的信息,您会让我知道。

非常感谢

答案1

您必须将终端类型配置为putty,putty-256color, 或者putty-sco使用 PuTTY 时。它们是唯一在 terminfo 数据库中有条目的终端类型正确描述 PuTTY

这是一种广泛传播的不正确假设终端仿真器都与 XTerm 兼容,并且terminfo 数据库中的xterm和条目正确地描述了它们。xterm-256color

这种错误的想法在 Thomas Dickey 的 XTerm 常见问题解答中被提及值得注意的是,xtermxterm-256color条目甚至没有描述 XTerm 的所有版本,更不用说其他终端仿真器了。

PuTTY 的 doco,例如 M. Dickey 超链接的页面,即使在今天putty自该条目添加到 terminfo以来已有 16 年,不幸的是促进了这种终端类型的误用xterm,但它确实是误用,而且这正是发生的应用程序不当行为。

比较 terminfo 数据库条目xterm-256color和揭示您的和键putty-256color发生了什么:⇱ Home⇲ End

% infocmp xterm-256color putty-256color|grep -F kend
    kend: '\EOF', '\E[4~'。
% infocmp xterm-256color putty-256color|grep -F khome
    khome: '\EOH', '\E[1~'。
%

正如您所看到的,被告知正在处理 XTerm 的应用程序期望接收(从终端)按键␛OH的控制序列和按键的⇱ Home控制序列。但 PuTTY 实际上(分别)发送控制序列和。␛OF⇲ End␛[1~␛[4~

您的应用程序 Z shell 需要 XTerm 键盘控制序列(因为您错误地告诉它您的终端具有类型xterm),但无法识别 PuTTY 控制序列,并且实际上将它们分解为vi-mode 命令来退出插入模式 ( ) 并交换当前字符的大小写 ( ~)。

进一步阅读

答案2

正如 JdeBP 善意指出的那样,我的TERM设置错误。

我终于能够按照以下步骤使一切保持一致:

  1. 将 Putty 中的终端类型设置为putty
  2. 在 Putty 中停用光标和键盘的应用程序模式
  3. 将以下行添加到我的.tmux.conf文件 中
    • set -g default-terminal "$TERM"防止 tmuxscreen默认使用
    • set -g terminal-overrides "putty*:kLFT5=\eOD:kRIT5=\eOC:kUP5=\eOA:kDN5=\eOB:smkx@:rmkx@"LeftRight键移动一个字符,而不是一个单词

相关内容