键盘在 bash 下的行为有所不同

键盘在 bash 下的行为有所不同

当从 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

相关内容