我已经通过将以下几行代码添加到我的zshrc文件中解决了这个问题...
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
...但我仍然想知道这里出了什么问题。有任何想法吗?
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
我发现这是一个组合结果:
第一点
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等功能。或者不希望xterm
终端发送这些内容... (但在ZSH中配置后,Del键可以正常使用)。此外请注意,使用xterm
终端时,您的数字小键盘在Vim中也会表现出奇怪的行为。
解决方法是配置Putty发送另一种终端类型。我尝试过xterm-color
和linux
。使用xterm-color
解决了Home/End问题,但数字小键盘仍然不正常。将其设置为linux
可以解决这两个问题。
你可以在Putty中的连接->数据中设置终端类型。不要试图在你的.zshrc
文件中使用export TERM=linux
来设置终端类型,那是错误的。终端类型应该由你的终端应用程序指定。因此,例如,如果你从具有Mac SSH客户端的Mac主机连接,则它可以设置自己的终端类型。
请注意,TERM指定你的终端类型,与你连接的主机无关。我可以在Putty中将我的终端类型设置为linux
并连接到FreeBSD服务器而没有任何问题。
因此,修复这两个问题,你应该就没问题了 :)
putty
。https://invisible-island.net/ncurses/terminfo.ti.html#tic-putty - JdeBPmc -x
启动它。 - Melebius距离这个问题首次发布已经将近11年了。当时,一些 distro 中确实提供了 putty
的 terminfo 条目,但是效果一般。多年以来,情况得到了改善,并且过去十年所需的 hack 已不再需要。PuTTY 仍然默认将 TERM
设置为 xterm
以确保兼容性,但如果你连接的是现代、最新的系统,你很可能会尝试覆盖此设置并将其设置为 putty-256color
:
putty-256color
的终端信息条目:toe -a | grep -F putty
putty-256color
。COLORTERM
truecolor
/etc/ssh/sshd_config
并将COLORTERM
添加到AcceptEnv
行。TERM
后运行exec zsh
。zsh在运行时不会响应对TERM
的更改。TERM
实际上设置为你想要的值:echo $TERM
screen
或tmux
?那是另一个大问题。首先测试排除问题所在。在tmux中尝试设置TERM=tmux-256color
。在screen中尝试TERM=screen-256color
。这对我很有效
bindkey -v
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
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
正常工作,zkbd
文件必须位于您的 fpath 数组中命名的某个目录中(请参阅 zshparam(1))。如果您使用的是标准 zsh 安装,则应该已经满足这一条件;如果不是,请将 Functions/Misc/zkbd 复制到适当的目录中。man -P "less -p 'keyboard definition'" zshcontrib
,或搜索 meta-manpage zshall
。看起来是一个Putty的问题。Gnome终端发送代码^[OH
和^[OF
分别代表Home和End,而Putty发送^[[1~
和^[[4~
。在Putty中有一个选项可以将Home/End键从标准模式更改为rxvt模式,这似乎修复了Home键,但未修复End键(现在发送^[Ow
)。猜想现在是时候在某个地方提交错误报告了... :-)
这对我有用。
将这些行添加到~/.zshrc文件中
bindkey "\e[1;5D" backward-word
bindkey "\e[1;5C" forward-word
# ctrl-bs and ctrl-del
bindkey "\e[3;5~" kill-word
bindkey "\C-_" backward-kill-word
# del, home and end
bindkey "\e[3~" delete-char
bindkey "\e[H" beginning-of-line
bindkey "\e[F" end-of-line
# alt-bs
bindkey "\e\d" undo
这些绑定似乎并不是 Emacs 模式下默认绑定集的一部分。
在运行“bindkey -e”后,在我的默认 zsh 安装上执行“where-is beginning-of-line”仅显示它绑定到 ^a。也许你应该问问 zsh 开发者为什么会这样 :-)
bindkey '^[OH' beginning-of-line
和bindkey '^[OF' end-of-line
。 - codeman48