zsh中的Home / End键不适用于腻子
我在Ubuntu盒子上将zsh作为默认外壳程序运行,并且使用gnome-terminal(据我所知模拟xterm),一切正常。当我通过ssh和putty(也模仿xterm)从Windows框登录时,home / end键突然失效了。
我已经能够解决将这些行添加到我的zshrc文件中的问题...
bindkey '\e[1~' beginning-of-line bindkey '\e[4~' end-of-line
...但是我仍然想知道这里出了什么问题。任何的想法?
解决方案
这些绑定似乎根本不是emacs模式下设置的默认绑定的一部分。
在运行" bindkey -e"后,在我的默认zsh安装上执行" where-is-of-line-of-line"表明它仅绑定到^ a。也许我们应该问zsh开发人员为什么:-)
看起来很油腻。 Gnome终端分别发送Home和End的代码^^ [OH]和^^ OF,而腻子发送代码^ [[1〜]和^ [[4〜]。腻子中有一个选项可以将Home / End键从标准模式更改为rxvt模式,这似乎可以修复Home键,但不能修复End键(现在发送^ [Ow
)。猜猜是时候在某个地方提交错误报告了... :-)
我发现这是一个组合:
一
ZSH开发人员认为ZSH不应定义" Home"," End"," Del",...键的动作。
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作为终端类型发送到远程主机。但是在某个地方搞砸了,并且没有发送人们希望从xterm中得到的正确的控制代码,例如Home,End和End。或者不希望xterm
终端发送那些信息或者其他任何信息((如果在ZSH中配置它,Del
键在xterm
中有效)。还要注意,Numpad键在Vim中表现得很有趣,例如,带有xterm
终端。
解决方案是将Putty配置为发送另一种终端类型。我已经尝试过xterm-color
和linux
。 xterm-color解决了Home / End问题,但是数字键盘仍然很有趣。将其设置为linux可以解决这两个问题。
我们可以在"连接"->"数据"下的"腻子"中设置终端类型。不要试图用export TERM = linux在.zshrc中设置终端类型,这是错误的。终端类型应由终端应用指定。这样,例如,如果我们从Mac机与Mac SSH客户端连接,则可以设置自己的终端类型。
注意,TERM指定终端类型,并且与我们要连接的主机无关。我可以在Putty中将终端类型设置为linux
并连接到FreeBSD服务器,而不会出现问题。
所以,解决这两个问题,你应该没问题:)
在" PuTTY配置"对话框上,连接之前,转到"连接"->"数据",然后在"终端类型"字符串中键入linux。