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