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 ( $TERM
is xterm
)连接到我的机器时,这很好用。但是当我在 Tmux 会话($TERM
is screen
)中启动 Zsh 时,我收到以下错误消息:
tput: unknown terminfo capability 'kDC3'
Run Code Online (Sandbox Code Playgroud)
这真的意味着不可能在 Tmux 中将任何内容绑定到ALT+DEL吗?还是我只是做错了什么?也许kDC3
不是正确的顺序?
我正在运行 Debian Wheezy Beta 4 x86_64。
第一个问题是您的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-keys
在tmux 中打开该选项,以便它为传递到其窗格中的键生成xterm样式的序列。例如在您的~/.tmux.conf
:
set-option -wg xterm-keys on
Run Code Online (Sandbox Code Playgroud)