在终端中定义自定义转义序列

在终端中定义自定义转义序列

我想更改终端中某些键使用的转义序列。我的目标是在 Vim(终端版本)中定义自定义映射。

下面我使用 shift-space 作为例子,但我更希望提出的解决方案是通用的。

我当前的终端 (gnome-terminal) 使用简单的空格作为 shift-space 的转义序列,输入 ctrl-v shift-space 即可看到。使用真正的 xterm 快速检查显示相同的行为。我希望 shift-space 组合键生成另一个转义序列(例如 shift-F30 的转义序列,否则我永远不会使用它)。

那么,我该怎么做呢?这真的是个好主意吗?如果有更好的选择,请告诉我...

注意:我知道这只是问题的一部分:在终端为我的键发送正确的转义序列后,我仍然需要告诉 Vim 它的含义。但我想我知道如何处理这个问题。

答案1

我开始回答这个问题,试图给你一个只针对 Vim 部分的解决方案。读完这篇文章后堆栈溢出页面,看来 Vim 的 curses 终端实现没有办法区分spaceshift-space除非 curses 获得libtermkey支持并且你的终端支持正确的<CSI>序列。

通常情况下,根据具体情况,可以在文件中输入如下内容~/.vimrc来获取映射:

nmap <S-space> :SomeValidVimCommandHere<CR>

或者

inoremap <S-space> <S-F30>

我没有测试过 curses 是否获得了所需的支持,因此您可以尝试进行映射,看看它是否有效。我不知道这是否合理,但我想指出,某些映射会产生未定义的行为。一个例子是 Esc 键。几年前,我尝试取消定义 Esc 键,以便不再使用它,这是因为我想强迫自己停止使用该escape键,而是使用jk组合键来获得相同的结果。这为我创建了一种我无法理解的“随机”行为。据我所知,这是因为 Esc 键深深嵌入到 Vims 的做事方式中。这可能适用于您建议进行的映射,但我没有证据证明情况确实如此。

我希望这能为您的问题提供一些帮助。

相关内容