在我的vimrc中映射<C-Tab>在Ubuntu上失败了

28

我想将ctrl-tab映射到:tabn,将ctrl-shift-tab映射到:tabp。

在Windows XP中,我已经成功地将其应用于gVim,但是在Ubuntu 9.10中将其移植到我的.vimrc中后它就不起作用了(vim 7.2)。

以下是我.vimrc文件的相关部分:

nmap <C-Tab> :tabn<CR>
nmap <C-S-Tab> :tabp<CR>
nmap <C-t> :tabnew<CR>

<C-t> 能正常工作,因此映射 ctrl 键似乎不是问题。我真的不知道从哪里开始!考虑到在 Windows 下正常工作,可能出了什么问题?

更多信息:我正在运行 Ubuntu 9.10 服务器,安装了 xorgfluxbox。我使用 xterm 作为我的终端。

Ctrl-tab 映射在 fluxbox 中工作:我可以在我的窗口管理器中成功地映射 ctrl-tab 和 ctrl-shift-tab;如果我开始在我的 xterms 中按 tab 键,我可以像预期的那样循环浏览这些标签页。我不确定这意味着什么,但我认为这个问题不是一个窗口管理器/xorg 问题。

这些键似乎没有被映射到其他东西,并且可以被正确识别。

回答:这是一个 xterm 问题 - 它不拦截并发送唯一的 keycode 来表示 ctrl-tab。有关详细信息,请参见下面的完整答案。


1
C-Tab可能在您的终端中有特殊含义吗? - Cascabel
可能吧……我会调查一下。我正在运行xterm。 - nfm
有关详细的Xterm解决方案以消除Ctrl-I、Tab、Ctrl-Tab等歧义,请查看https://unix.stackexchange.com/q/631241。 - Quasímodo
4个回答

36

这明显是一个终端问题。

显然,xterm和许多其他终端仿真器默认情况下不拦截ctrl-tab,并只发送一个标签信号。这个Vim维基页面指出,ctrl-tab在xterm、Eterm和aterm上不起作用。这个Arch Linux论坛贴子也声称这是一个终端问题。

解决方案可以通过结合这篇博客文章中的信息和这篇Vim维基文章中的键码映射来实现。简而言之,您需要在.Xresources文件中配置xterm以拦截并发送ctrl-tab和ctrl-shift-tab的唯一代码,然后使用一些特殊的映射将其嵌入.vimrc中。

长话短说,这很难做到(我还没有在这里使它工作),因为xterm和vim都需要被骗来做到这一点。我个人会继续使用另一个映射...这个问题是一个严重的时间消耗者,我认为它不值得继续努力让它工作!

感谢大家的帮助。


如果您想作为临时解决方案,请尝试在http://superuser.com/questions/410982/in-vim-how-can-i-quickly-switch-between-tabs中使用的解决方案。这使用了gt或gT键组合,似乎可以通过终端工作。 - Faktor 10
1
哪些替代终端可以解决这个问题? - wukong
@wukong 这也是我在想的,我看到 tmux 应该配置为 screen-256color,那么我们能否使用其他终端来实现这个功能呢? - statquant

3
我使用了@nfm答案中的博客和维基帖子并解决了问题:
将以下内容放入您的.Xresources文件中(在此情况下,您可以复制粘贴):
xterm*VT100.Translations: #override \
             Ctrl ~Shift <Key>Tab: string(0x1b) string("[27;5;9~") \n\
             Ctrl Shift <Key>Tab: string(0x1b) string("[27;6;9~")

然后执行 cd ; xrdb .Xresources 并重新启动 xterm。


将以下内容放入你的 .vimrc 文件中:

!! 重要提示 - 在 XXXX 的位置,你需要输入 CTRL-V 然后按 Esc或者复制整段文字并执行命令 %s/\(set <F1[34]>=\)XXXX/\=submatch(1) . "\33"/g ,这个命令可以直接复制粘贴(用 <CTRL-R> + 插入)。

set timeout timeoutlen=1000 ttimeoutlen=100
set <F13>=XXXX[27;5;9~
nnoremap <F13> gt
set <F14>=XXXX[27;6;9~
nnoremap <F14> gT

然后重新启动vim。

完成。


@statquant,对我来说它完美地运行。你能写下哪个部分对你来说不起作用吗? - MichalH
我无法使用这个切换选项卡,我复制了带有这些制表符的.Xresources文件,然后执行了cd; xrdb .Xresources,接着使用从XXXX更改为^ [的行更新了.vimrc,重新启动了所有终端和vim...但是它没有起作用。 - statquant
那我很抱歉,我们可能有不同版本,您的某些设置可能不被支持,或者某些东西干扰了这些设置。 - MichalH
1
对我有用,谢谢。除了我需要将<C-Tab>映射到vim窗口导航。我所要做的就是在我的.vimrc中更改F13和F14的映射:map map 希望这能帮助到其他人。 - Pierre

0
在我的情况下, 我是通过以下方式解决的rxvt-unicode (urxvt, v9.22),
terminal (.Xresource)
URxvt.keysym.Control-Tab: \033[27;5;9~ 

vim v8.0 (.vimrc) 
map <Esc>[27;5;9~ :tabnext<CR>

祝你好运!


0

如果你正在使用Ubuntu,你可能已经启用了类似Compiz的东西。

我不能确定,但你应该看一下Compiz扩展以及它们是否定义了这个快捷键。我曾经遇到过类似的问题,不是在vim上,但还是有点相似。

也可能是X服务器拦截了一些按键(例如:xbindkeys)。


更多信息:我正在运行安装了 Xorg 的 Ubuntu 服务器,并使用 Fluxbox 作为窗口管理器。 - nfm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接