我在 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开发人员为什么: - )

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top