Ctrl+TAB 在 gnome-terminal 的 vim 中不起作用

Ctrl+TAB 在 gnome-terminal 的 vim 中不起作用

我有一个严重的问题。通常,我使用的编辑器是 vim,尽管我无法映射 ctrl+tab 操作。我想用 ctrl+tab(ctrl + shift + tab)切换选项卡。在 xterm 中,此映射已启用,并且将使用该操作。但是在 gnome-terminal 中,tab 是转义序列。请告诉我如何使用 gnome-terminal 在 vi​​m 中切换选项卡。

答案1

由于键盘输入的内部处理方式,遗憾的是,即使在 GVIM 中,这在今天也普遍无法实现。某些组合键(如Ctrl+ 非字母)无法映射,并且无法区分Ctrl+ 字母和Ctrl+ Shift+ 字母。(除非您的终端发送不同的术语表代码,大多数人没有。)在插入或命令行模式下,尝试输入组合键。如果没有任何反应 / 插入,则无法使用该组合键。这也适用于<Tab>/ <C-I><CR>/ <C-M>/ <Esc>/<C-[>等。(唯一的例外是<BS>/ <C-H>。)这是一个已知的痛点,也是 vim_dev 和 #vim IRC 频道上各种讨论的主题。

有些人(首先是 Paul LeoNerd Evans)想要修复这个问题(即使对于支持该功能的终端中的控制台 Vim),并提出了各种建议,cp。http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

但截至今天,还没有任何补丁或志愿者提出,尽管许多人表示希望在未来的 Vim 8 主要版本中拥有这一点。

答案2

问题在于,在终端中,一个Tab字符是^I( Control- I)。这意味着按下 tab 键的同时按下 control 键,终端根本不会将这个动作传递给 Vim。[1]它只会发送一个普通的制表符。

GVim 可以支持这一点,因为它不必依赖终端来告诉它以何种组合按下了哪些键——它可以更直接地访问键盘事件,因此它可以轻松地看到被修改的特殊键。

我建议您找到一个不同的键来映射,以便保持一致性。

[1] 据我所知,对于“现代”终端仿真器来说,这不再是事实,但它曾是这种情况持续了很长时间,以至于存在一个巨大的遗留障碍需要克服,因为 Vim 使用的终端库 (Ncurses) 甚至无法处理此事件,因此即使终端在技术上可能支持它,但 Vim 无法支持它,因为它依赖的库 API 无法支持。大约每年一次,Vim 开发人员列表中都会进行一次严肃的讨论,讨论如何通过各种方式解决这个问题,包括切换到更强大的 API,但没有任何结果。

答案3

对此我最接近的答案是创建Leader+TabLeader++ShiftTab

map <leader><Tab> :bnext<cr>
map <leader><S-Tab> :bprevious<cr>

我已将我的映射Leader,(逗号),因此输入,+Tab

但是它们的效果并不好。您无法Leader按住并不断点击Tab来滚动浏览标签。这也不属于 MRU(最近使用)行为。

为了澄清起见,我使用“缓冲区”而不是“标签页”,因为我发现它们更符合其他编辑器使用标签的概念。

除此以外,您可以尝试以下操作:

map <leader><Tab> :b<Space>

这将打开 ex 命令,然后您可以按Tab开始滚动缓冲区。然后您还可以使用来回切换。

通过这种方法,您还可以开始输入打开缓冲区的部分,然后按下Tab将循环浏览经过筛选的打开缓冲区列表。

但就我个人而言,我只是映射Leader+Tab来提供基本的 MRU 行为:

map <leader><Tab> :b#<cr>

相关内容