当从 Windows 登录到其他计算机时bash
,Putty 可以正确映射键,但在其他 shell (如sh
或)下zsh
,键(如)的Delete映射不正确(到~
字符)。
设置XTERM
为不同的映射不会改变任何东西。我当前的linux
映射似乎是正确的(删除键功能kdch1
映射到\E[3~
并cat
输出^[[3~
)。
为什么更换 shell 会产生这种奇怪的效果?也许这个键盘映射实际上没有使用,并且有更新的机制?
我没有 ~/.inputrc,/etc/inputrc 有以下内容:
# Tab 补全时不响铃 #设置铃声样式无 设置元标志 设置输入元 设置转换元关闭 设置输出元数据 # 已完成的名称,是指向 # 目录后面附加了一个斜杠。 设置 mark-symlinked-directories $如果模式=emacs # 适用于 Linux 控制台和 RH/Debian xterm "\e[1~":行首 "\e[4~":行尾 "\e[5~": 历史的开始 "\e[6~":历史结束 "\e[3~": 删除字符 "\e[2~": 引用-插入 "\e[5C": 正向词 "\e[5D”:向后单词 "\e[1;5C": 正向词 "\e[1;5D":向后单词 # 对于 rxvt "\e[8~":行尾 # 对于非 RH/Debian xterm,不会对 RH/DEbian xterm 造成影响 "\eOH":行首 "\eOF":行尾 # 对于 freebsd 控制台 "\e[H": 行首 "\e[F": 行尾 $endif
答案1
bash
使用GNU readline
库提供编辑功能。如果你bash
从终端启动不支持 readline 的 shell,你会看到不同:
bash --noediting
sh
它的行为与( dash
) 或您当前的完全相同zsh
。
Zsh 不使用readline
(它不读取inputrc
),但它也有编辑功能,对我来说,当我zsh
第一次启动时选择默认设置时,该功能设置正确。它从系统范围的配置文件中获取键绑定/etc/zsh/zshrc
。如果你没有该文件或它没有设置键绑定,那么你需要在你的 中设置它,就像它写的那样,~/.zshrc
使用bindkey
这里或者直接获取一个合适的系统范围的 zshrc 文件。我的看起来像这样
# /etc/zsh/zshrc: system-wide .zshrc file for zsh(1).
#
# This file is sourced only for interactive shells. It
# should contain commands to set up aliases, functions,
# options, key bindings, etc.
#
# Global Order: zshenv, zprofile, zshrc, zlogin
READNULLCMD=${PAGER:-/usr/bin/pager}
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
zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin \
/usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin
unalias run-help
autoload run-help
# If you don't want compinit called here, place the line
# skip_global_compinit=1
# in your $ZDOTDIR/.zshenv or $ZDOTDIR/.zprofice
if [[ -z "$skip_global_compinit" ]]; then
autoload -U compinit
compinit
fi