我已经寻找这个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(又名“坏”机器)上观察到的情况
当我编辑命令行时,Left和Right光标键会移动一整个单词(而不是 1 个单个字符)。
Home和End键,按预期将光标带到行的开头和结尾。
所描述的行为适用于emacs
模式 ( bindkey -e
) 中。
当我进入vim
模式 ( bindkey -v
) 时,Left和Right箭头会移动 1 个字符,但Home和End键不会将光标移动到行首和行尾。相反,它们会切换光标下字符的大小写。
我在机器 B(又名“好”机器)上观察到的情况
Left和Right键将光标移动一个字符。 Home 和 end 键分别将光标移动到行的开头和结尾。Ctrl+A和Ctrl+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 常见问题解答中被提及值得注意的是,xterm
和xterm-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
设置错误。
我终于能够按照以下步骤使一切保持一致:
- 将 Putty 中的终端类型设置为
putty
- 在 Putty 中停用光标和键盘的应用程序模式
- 将以下行添加到我的
.tmux.conf
文件 中set -g default-terminal "$TERM"
防止 tmuxscreen
默认使用set -g terminal-overrides "putty*:kLFT5=\eOD:kRIT5=\eOC:kUP5=\eOA:kDN5=\eOB:smkx@:rmkx@"
让Left和Right键移动一个字符,而不是一个单词