如何从 Zsh 中的 terminfo 获取 Ctrl+Left 的控制字符

art*_*bot 5 terminal zsh ncurses zshrc terminfo

我用来terminfo找出终端中左(右,...)键的控制序列,以便我可以将其映射到我的有用的东西(向左移动),如下所示zshrc

typeset -A key
left=${terminfo[kcub1]}
bindkey "$left" backward-char
Run Code Online (Sandbox Code Playgroud)

(还有其他一些事情可以让它发挥作用,请参阅来源)。这很有帮助,因为我使用多个终端仿真器并且这些控制序列会发生变化。例如,我在 Ubuntu 上使用 Gnome 终端连接到 Debian 盒子,然后在其中ssh使用...tmux

但是我如何从 terminfo 找到 CTRL+LEFT(和 RIGHT...)的关键代码?我想将它们映射到单词左/右。

Tho*_*key 3

controlleft-arrow不是标准 terminfo 功能。ncurses 提供这些扩展(请参阅终端数据库中的讨论),知道如何使用扩展的应用程序可以获取它们。

zsh 的源代码暗示它将使用 terminfo 库的,例如 forstrnames如果可用,但 ncurses 在单独的内存区域中实现扩展名称。(terminfo 数据可以追溯到 2005 年左右;扩展本身可以追溯到1999 年的ncurses 5.0)。

然而,实现(截至 2018 年)不完整,因为 zsh 不使用扩展信息来查找名称。ZSH for 循环数组变量问题中给出的示例,例如,

for key val in ${(kv)terminfo}; do
    echo "$key -> $val"
done
Run Code Online (Sandbox Code Playgroud)

仅给出预定义的名称。

zsh 用于tigetstr检索字符串功能。如果您碰巧知道该名称(或在列表中看到它infocmpx则可以将其用作其数组的索引terminfo[]

扩展名称基于 xterm 的修饰符代码,该代码列在xterm+pcfkeys终端数据库条目上方的注释中:

  • controlleft-arrow"kLFT5"
  • controlright-arrow"kRIT5"