如何在Vim中将Ctrl-TAB映射到其他功能?

52

我想在Vim中将Ctrl-TAB映射为gt,以便我可以用一个按键切换标签页。

我尝试过...

nmap <C-T> gt
nmap <C-Tab> gt
nmap <C-TAB> gt

那行不通。在Vimese语中怎么说“tab键”?


3
在我看来,Ctrl-Tabgt 一样,都是两个按键。此外,Ctrl-PageDown 也可以用作切换标签页的替代快捷键(与 Ctrl-PageUp 一起)。 - Greg Hewgill
3
花了足够的时间努力让它工作(终端问题),最终我选择了 nmap <C-l> gtnmap <C-h> gT。不知道 Ctrl-PageDown/Up,谢谢 Greg 的提示。 - justin
8个回答

71

在gvim中可以映射它,但终端看不出 <Tab><C-Tab> 之间的区别。


4
这解释了我在MacVim和终端中使用vim时所看到的不同。 - Mark Bolusmjak

25

你不能这样做。Tab键已经是一个控制键,对应的编码是 <C-i>


1
嗯,这个有什么不能用的理由吗?我想要实现的是下一个缓冲区,模拟标签切换,所以我使用了 map <c-i> :bn<CR>,目前它已经实现了我想要的功能。 - John P
2
哦,开个玩笑,我知道你的意思了。Tab键确实是<c-i>,我读错了。 - John P
这也可以在ASCII表上看到:https://en.wikipedia.org/wiki/ASCII#Control_characters - Ciro Santilli OurBigBook.com
在终端会话的上下文中,Tab键生成ASCII代码9,与Control-I相同。然而,GUI程序(例如gvim)可以检测到控制Tab键-请参见YuGiOhJCJ的答案。 - Andy

13

它适用于 gVim。 只需在您的 ~/.gvimrc 文件末尾添加以下内容:

" Add keyboard shortcuts
map <C-Tab> gt
map <C-S-Tab> gT

4
我在Cygwin中使用mintty终端。此终端可以使用ctrl-tab选项在各个cygwing实例之间循环,或者您可以使用它来进入下一个或上一个screen窗口(因此ctrl-tab与ctrl-a + n相同,s-ctrl-tab与ctrl-a + p相同)。我认为最后一种行为非常方便。 请查看:如何在GNU Screen中使用Ctrl + Tab切换会话

这个功能也可以用来在Vim中切换标签页:https://dev59.com/eXI-5IYBdhLWcg3w18V3#54596137。 - Andrew Keeton

2

git-bash (mintty)

首先,在 选项 > 键盘 中禁用 切换窗口 选项。然后你可以使用以下映射。

注意:你不能简单地将这些内容复制粘贴到你的 .vimrc 文件中。相反,在插入模式下,你需要按下 Ctrl-V 键,然后输入 Ctrl-Shift-Tab 来代替 ^[[1;6I。对于 ^[[1;5ICtrl-Tab 同样如此。

nnoremap ^[[1;6I :tabprevious<CR>
nnoremap ^[[1;5I :tabnext<CR>
inoremap ^[[1;6I <Esc>:tabprevious<CR>
inoremap ^[[1;5I <Esc>:tabnext<CR>

1
如何配置Vim将<Esc>[1;5I理解为Ctrl+Tab的值? - Spidey
我也有一个Ctrl+Tab快捷键的问题。它只对Ctrl+Shift+Tab快捷键有效。 - JavaRunner

1
如果您使用的是Mac电脑,那么您可以使用Karabiner来重新映射键。以下是操作步骤:
  1. Open Karabiner preferences > Misc & Uninstall tab, click "open private.xml" to open it in editor of choice
  2. Inside the <root> node add the following configuration

    <item>
      <name>c-tab to s-tab LEFT</name>
      <identifier>private.ctabtostabl</identifier>
      <autogen>
    __KeyToKey__
    KeyCode::TAB, ModifierFlag::CONTROL_L,
    KeyCode::TAB, ModifierFlag::SHIFT_L
      </autogen>
    </item>
    <item>
      <name>c-tab to s-tab RIGHT</name>
      <identifier>private.ctabtostabr</identifier>
      <autogen>
    __KeyToKey__
    KeyCode::TAB, ModifierFlag::CONTROL_R,
    KeyCode::TAB, ModifierFlag::SHIFT_R
      </autogen>
    </item>
    
  3. After saving the xml file, go back to Karabiner preferences, this time to "Change Key" tab, push the "Reload XML" button, and check the newly minted options. Now your control-tab should become shift-tab!

step 3 screenshot


现在karabiner不得不从头开始重做,你会如何用Json编写它? - Benjamin Chausse

0

这个在 MacVim 中对我有效

:map <C-Tab> gt

它在命令模式下工作。但在编辑模式下不起作用。
在我的终端中,它无法在vim中工作。


1
如果你使用imap而不是map,它可以在插入模式下工作。 - rodorgas

0

我已经在Konsole 19.12.3中使用了这个方法。以下是操作步骤:

  1. 菜单栏 -> 设置 -> 配置键盘快捷键
  2. 通过将它们绑定到“无”来删除Ctrl+Shift+Tab和Ctrl+Tab的现有绑定
  3. 菜单栏 -> 设置 -> 档案 -> 编辑 -> 键盘 -> 编辑
  4. Backtab+Ctrl+Ansi(如果您有非ANSI键盘,则可能只需使用Backtab+ Ctrl-Ansi)绑定到\E[27;6;9~。使用测试区域确认该绑定是否有效;它应该回显上面的序列。删除与其冲突的任何绑定。
  5. Tab+Ctrl+Ansi(或非ANSI等效项)绑定到\E[27;5;9~
  6. 在您的.vimrc文件中添加以下格式的绑定:nnoremap <C-Tab> :tabn<CR>nnoremap <C-S-Tab> :tabp<CR>

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