几天来,我一直在寻找解决此OhMyZSH!
问题的方法,但找不到解决方案。诚然,我不明白zle
真正的工作原理,对于bindkey
. 终端仿真器发送“控制序列”的方式以及“终端类型”的含义(xterm
、 vsxterm-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 上的提示,以及机器 B 上的powerlevel-9k
[ https://github.com/bhilburn/powerlevel9k] 。
我在机器 A 上观察到的(又名“坏”机器)
当我编辑命令行时,光标键Left和Right光标键移动一个完整的单词(而不是 1 个单个字符)。
Home和End键,将光标移动到行的开头和结尾,正如预期的那样。
此描述的行为适用于emacs
模式 ( bindkey -e
)。
当我进入vim
模式 ( bindkey -v
) 时,LeftandRight箭头移动 1 个字符,但HomeandEnd键不会将光标移动到行首和行尾。相反,它们会切换光标下字符的大小写。
我在机器 B 上观察到的(又名“好”机器)
Left和Right键将光标移动一个字符。Home 和 end 键将光标分别移动到行首和行尾。Ctrl+A和Ctrl+E组合将我的光标分别带到开头和结尾。
这是我希望所有 shell 的行为。
到目前为止我发现了什么
我认为这是一个bindkey
问题。但我对此几乎一无所知,而且我很难找到关于这个zsh
内置的任何文档。
zsh -v
尽管文件相似,但在登录时在两台机器上运行会产生非常不同的结果.zshrc
。
有人可以向我解释是什么导致这 2 台机器的行为如此不同,以及如何更改我的配置以恢复一致性,并且我所有的 shell 的行为都像机器 B 上的一样(又名“好”的那个)?
如果您需要更多我不知道需要的信息,我相信您会告诉我。
非常感谢
使用 PuTTY 时,您必须将终端类型配置为
putty
、putty-256color
或。putty-sco
它们是 terminfo 数据库中的条目正确描述 PuTTY的唯一终端类型。一个普遍的错误假设是终端仿真器都与 XTerm 兼容,并且 terminfo 数据库中的
xterm
和xterm-256color
条目正确地描述了它们。这种错误想法在 Thomas Dickey 的 XTerm FAQ 中被指出,值得注意的是
xterm
和xterm-256color
条目甚至没有描述 XTerm 的所有版本,更不用说其他终端仿真器了。PuTTY 的文档,例如 M. Dickey 在那里超链接的页面,即使是在将条目添加到 terminfo 16 年后的
putty
今天,不幸的是,它促进了对xterm
终端类型的这种误用,但它是一种误用,这就是那种发生的应用程序不当行为。比较 terminfo 数据库条目
xterm-256color
并putty-256color
揭示您的⇱ Home和⇲ End密钥发生了什么:如您所见,被告知它正在处理 XTerm 的应用程序期望(从终端)接收键的控制序列
␛OH
和键⇱ Home的控制序列␛OF
。⇲ End但 PuTTY 实际上发送控制序列␛[1~
和␛[4~
(分别)代替。您的应用程序 Z shell 期待 XTerm 键盘控制序列(因为您错误地告诉它您的终端具有 type
xterm
),但无法识别 PuTTY 控制序列,实际上将它们分解为vi
-mode 命令以退出插入模式 (␛
) 并交换当前字符的大小写 (~
)。进一步阅读
正如 JdeBP 所指出的那样,我
TERM
的设置错误。我终于能够通过以下步骤使一切工作一致:
putty
.tmux.conf
文件中set -g default-terminal "$TERM"
防止 tmuxscreen
默认使用set -g terminal-overrides "putty*:kLFT5=\eOD:kRIT5=\eOC:kUP5=\eOA:kDN5=\eOB:smkx@:rmkx@"
让LeftandRight键移动一个字符,而不是一个单词