我在 Linux 服务器中有 zsh shell,并从不同计算机的屏幕会话连接到服务器。我正在尝试让控制键(例如 home 和 end)正常工作。
由于 zsh 不使用 GNU Readline 库,因此我需要负责将终端序列映射到 zsh 命令。首先,我使用 zkbd 找出每个击键发送的序列,然后将它们映射到正确的命令。这是我在 .zshrc 中的内容:
autoload zkbd
[ ! -f "${ZDOTDIR:-$HOME}/.zkbd/$TERM-${DISPLAY:-$VENDOR-$OSTYPE}" ] && zkbd
source "${ZDOTDIR:-$HOME}/.zkbd/$TERM-${DISPLAY:-$VENDOR-$OSTYPE}"
[ -n "${key[Backspace]}" ] && bindkey "${key[Backspace]}" backward-delete-char
[ -n "${key[Home]}" ] && bindkey "${key[Home]}" beginning-of-line
...
现在我有两个问题:
- 通常当我连接到服务器时, $DISPLAY 环境变量中的序列号会获得新值。因此,zkbd 开始运行,我必须按下所有控制键。按键序列是否有必要依赖于 $DISPLAY?
- 当我从屏幕会话连接到服务器时, $TERM 环境变量将设置为
screen
.不过,根据我连接的计算机的不同,某些键的顺序会有所不同(例如,F1 是^[[11~
或^[OP
)。我应该如何命名 zkbd 文件以便区分不同的映射?
答案1
TERM=screen
屏幕程序有一个功能,您可以使用它来设置,而不是简单地使用。不同的的值TERM
。这假设您已经安装了完整的 ncurses 终端数据库,并使用TERM
外部与实际终端对应的屏幕。
对于给定的TERM
,如果终端数据库中有相应的“screen.$TERM”条目,则 screen 将使用那。 ncurses 终端数据库有几个这样的,以匹配设置的终端的实际行为TERM=xterm
,例如,
屏幕.Eterm,
屏幕侏儒,
屏幕控制台,
screen.konsole-256color,
屏幕.linux,
筛选.mlterm,
screen.mlterm-256color,
屏幕.mrxvt,
屏幕腻子,
screen.putty-256color,
屏幕.rxvt,
屏幕.teraterm,
屏幕.vte,
屏幕.vte-256color,
screen.xterm-256color,
screen.xterm-新,
screen.xterm-r6,
screen.xterm-xfree86。
一旦您设置好使用终端数据库的内容,就不需要您自己的特殊/神奇的配置文件。此外,您如何告诉服务器使用哪个文件?真实的信息在您的客户上,您可以在其中知道您实际使用的是哪个终端模拟器。
zsh
让您可以直接在数组中使用此信息$terminfo
。
进一步阅读:
- 为什么不直接使用 TERM 设置为“xterm”?
- 键绑定(参见讨论
$terminfo[]
)