zsh 中的 Home/End 键不适用于 putty
-
03-07-2019 - |
题
我在 Ubuntu 机器上运行 zsh 作为默认 shell,并且使用 gnome-terminal (据我所知它模拟 xterm)一切正常。当我通过 ssh 和 putty(也模拟 xterm)从 windows 盒子登录时,home/end 键突然不再起作用。
我已经能够解决将这些行添加到我的 zshrc 文件中的问题...
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
...但我仍然想知道这里出了什么问题。任何想法?
解决方案
我发现它是一个组合:
<强>一强>
ZSH开发人员不认为ZSH应该定义 Home , End , Del ,... keys的动作。 / p>
Debian和Ubuntu通过定义普通用户在全局 / etc / zsh / zshrc
文件中期望的正常操作来解决此问题。遵循相关代码(在Debian和Ubuntu上是相同的):
if [[ "$TERM" != emacs ]]; then
[[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M emacs "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M vicmd "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
[[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
[[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
[[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
[[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
[[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
# ncurses fogyatekos
[[ "$terminfo[kcuu1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
[[ "$terminfo[kcud1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
[[ "$terminfo[kcuf1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
[[ "$terminfo[kcub1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
fi
因此,如果您要连接到Debian或Ubuntu框,则无需执行任何操作。一切都应该自动运作(如果没有,见下文)。
但是......如果你要连接到另一个盒子(例如FreeBSD),可能没有用户友好的默认 zshrc
。解决方案当然是将Debian / Ubuntu zshrc
中的行添加到您自己的 .zshrc
。
<强>两个强>
Putty将 xterm
作为终端类型发送到远程主机。但是在某处乱搞并且没有为 Home , End 发送正确的控制代码,......人们会期望从 xterm
。或者 xterm
终端不应该发送那些或其他...( Del 键在 xterm
中工作但是,如果你配置它在ZSH)。另请注意,您的Numpad-keys在Vim中表现得很有趣,例如 xterm
终端。
解决方案是将Putty配置为发送另一种终端类型。我试过 xterm-color
和 linux
。 xterm-color
修复了 Home / End 问题,但是Numpad仍然很有趣。将其设置为 linux
修复了这两个问题。
您可以在连接下的Putty中设置终端类型 - &gt;数据。不要试图用 export TERM = linux
在 .zshrc
中设置终端类型,这是错误的。终端类型应由终端应用程序指定。因此,例如,如果您从Mac机箱与Mac SSH客户端连接,它可以设置它自己的终端类型。
请注意,TERM指定了您的终端类型,与您要连接的主机无关。我可以将我的终端类型设置为Putty中的 linux
并连接到FreeBSD服务器而没有问题。
所以,解决这两件事你应该没问题。)
其他提示
在PuTTY配置对话框中,转到Connection - &gt;数据并在连接前将 linux 键入Terminal类型字符串。
这对我有用
bindkey -v
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
这似乎是一件腻子。 Gnome-terminal分别为Home和End发送代码 ^ [OH
和 ^ [OF
,而putty发送 ^ [[1~
和<代码> ^ [[4〜代码>。 putty中有一个选项可以将Home / End键从标准模式更改为 rxvt 模式,这似乎可以修复Home键,但不能修复End键(现在发送 ^ [Ow
)。猜猜是时候在某处提交错误报告......: - )
应该可移植的适当答案 全部 发行版(不一定是 zsh 的所有版本,这里是 ymmv)是使用 zkbd 的 zkbd 帮助程序实用程序。
键盘定义
键盘、工作站、终端、模拟器和窗口系统的大量可能组合使得 zsh 不可能为每种情况都提供内置的键绑定。Functions/Misc 中的 zkbd 实用程序可以帮助您快速为您的配置创建键绑定。将 zkbd 作为自动加载函数或 shell 脚本运行:
zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
当您运行 zkbd 时,它首先要求您输入终端类型;如果它提供的默认值是正确的,只需按回车键即可。然后它会要求您按多个不同的键来确定您的键盘和终端的特性;ZKBD警告您,如果它找到了与众不同的任何东西,例如delete键既不发送 ^h and ^?。
zkbd 读取的击键记录为名为 key 的关联数组的定义,写入 HOME 或 ZDOTDIR 目录中的子目录 .zkbd 中的文件中。文件的名称由连字符连接的术语,供应商和Ostype参数组成。
您可以将此文件读入您的 .zshrc 或其他启动文件中
source' or
。'命令,然后在bindkey命令中引用密钥参数,如以下:
source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
# etc.
请注意,为了使“autoload zkbd”正常工作,zkdb 文件必须位于 fpath 数组中指定的目录之一中(请参阅 zshparam(1))。如果您有标准的 zsh 安装,情况应该已经如此;如果不是,请将 Functions/Misc/zkbd 复制到适当的目录。
看 man -P "less -p 'keyboard definition'"
zshcontrib,或搜索元联机帮助页 zshall
这些绑定似乎不是emacs模式中设置的默认绑定的一部分。
执行“where-is-line-line”在运行&quot; bindkey -e&quot;之后在我的默认zsh安装上表明它只绑定到^ a。也许你应该问zsh开发人员为什么: - )