Zsh 键绑定的 Tmux Terminfo 问题

aef*_*aef 2 keyboard-shortcuts zsh terminal debian tmux

Emacs 编辑模式下的 Zsh 自带默认键绑定ALT+Backspace删除光标右侧的一个单词,ALT+D删除左侧的一个单词。我想另外将后一个函数添加到ALT+ DEL

我尝试使用terminfo数据库为每个$TERM正确的组合键设置转义序列。在man terminfo我读到关于kDC3成为我可能需要用于ALT+的 Capname DEL

我将以下行添加到我的~/.zshrc

bindkey -e `tput kDC3` kill-word
Run Code Online (Sandbox Code Playgroud)

当我直接通过 SSH ( $TERMis xterm)连接到我的机器时,这很好用。但是当我在 Tmux 会话($TERMis screen)中启动 Zsh 时,我收到以下错误消息:

tput: unknown terminfo capability 'kDC3'
Run Code Online (Sandbox Code Playgroud)

这真的意味着不可能在 Tmux 中将任何内容绑定到ALT+DEL吗?还是我只是做错了什么?也许kDC3不是正确的顺序?

我正在运行 Debian Wheezy Beta 4 x86_64。

Chr*_*sen 5

第一个问题是您的terminfo条目screen没有定义kDC3能力;这可能是典型的。您可以将此功能添加到您自己的自定义screen条目中,也可以“硬编码”bindkey命令中的序列。


添加功能可能有助于其他程序了解密钥,但它分散了您的配置(当您手动将配置复制到新机器或用户帐户时,很容易忘记这种自定义)。您可以使用以下命令提取适当的条目infocmp并构建一个新条目tic

{ infocmp -xT screen ; infocmp -x1T xterm | grep -E '^\tkDC[3-8]?=' ; } >/tmp/s
tic -x /tmp/s
Run Code Online (Sandbox Code Playgroud)

如果您以对 terminfo 目录(例如)具有写访问权限的用户身份运行tic/usr/share/terminfo,则新条目将放置在那里(可能会覆盖原始条目);否则,它将被放置在~/.terminfo(或 TERMINFO,如果您设置了该环境变量)下。

为了完整起见,您可能希望在grep模式中使用(UP|DN|RIT|LFT|PRV|NXT|HOM|END|IC|DC)代替来捕获 Up、Down、Right、Left、PageUp、PageDown、Home、End、Insert 和 Delete 的修改版本。DC


如果您不喜欢自定义 terminfo 条目导致的配置分散,那么您可以“硬编码”该值。为了让它更好一点,您可以先检查kDC3

bindkey -e ${$(tput kDC3 2>/dev/null):-'\e[3;3~'} kill-word
Run Code Online (Sandbox Code Playgroud)

将此“硬编码”限制为仅screen基于 TERM 值:

altdel=$(tput kDC3 2>/dev/null)
[[ -z $altdel && $TERM == screen(|-*) ]] && altdel='\e[3;3~'
[[ -n $altdel ]] && bindkey -e $altdel kill-word
unset altdel
Run Code Online (Sandbox Code Playgroud)

只要您的终端模拟器(堆栈)最终为修改后的密钥生成xterm样式的序列,这就会起作用。


一旦有了绑定,您仍然需要xterm-keystmux 中打开该选项,以便它为传递到其窗格中的键生成xterm样式的序列。例如在您的~/.tmux.conf

set-option -wg xterm-keys on
Run Code Online (Sandbox Code Playgroud)