我发现这是一个组合:
一个
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 作为终端类型发送到远程主机。但是在某处搞砸了,并且没有为 Home、End 发送正确的控制代码,......这是人们对xterm 的期望。或者xterm 终端不应该发送这些或任何东西......(Del 键在xterm 中确实有效,但是,如果你在 ZSH 中配置它)。另请注意,您的小键盘键在 Vim 中的行为很有趣,例如使用 xterm 终端。
解决方法是配置Putty发送另一种终端类型。我试过xterm-color 和linux。 xterm-color 修复了 Home/End 问题,但小键盘仍然很有趣。将其设置为 linux 解决了这两个问题。
您可以在连接 -> 数据下的 Putty 中设置终端类型。不要试图用export TERM=linux 在.zshrc 中设置终端类型,这是错误的。终端类型应由您的终端应用程序指定。因此,例如,如果您从带有 Mac SSH 客户端的 Mac 机器进行连接,它可以设置自己的终端类型。
请注意,TERM 指定您的终端类型,与您要连接的主机无关。我可以在 Putty 中将终端类型设置为 linux 并毫无问题地连接到 FreeBSD 服务器。
所以,解决这两个问题,你应该会没事的 :)