28

I want to map ctrl-tab to :tabn, and ctrl-shift-tab to :tabp.

I had it working for gVim in Windows XP, but moved it to my .vimrc in Ubuntu 9.10 and it doesn't work (vim 7.2).

Here's the relevant section of my .vimrc:

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

<C-t> works fine, so mapping the ctrl key doesn't seem to be a problem. I really have no idea where to start! What could be going wrong here, considering it worked fine under Windows?

More info: I'm running Ubuntu 9.10 server, with xorg and fluxbox installed on top. I'm using xterm as my terminal.

Ctrl-tab mapping works in fluxbox: I can map ctrl-tab and ctrl-shift-tab successfully in my window manager; if I start tabbing my xterms, I can cycle through those tabs as expected. I'm not sure what this means, but I think the issue is not a window manager/xorg issue.

The keys don't seem to be mapped to something else, and can be recognised together successfully.

Answer: It's an xterm issue - it doesn't intercept and send a unique keycode for ctrl-tab. See my full answer below for details.

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
nfm
  • 19,689
  • 15
  • 60
  • 90

4 Answers4

36

It's definitely a terminal issue.

Apparently xterm, and lots of other terminal emulators, don't intercept ctrl-tab by default and just send a tab signal. This Vim wiki page states that ctrl-tab doesn't work for xterm, Eterm, and aterm. There's also this Arch linux form post claiming that it's a terminal issue.

The solution can be found by combining the info from this blog post with this vim wiki for mapping keycodes. This gist of it is that you need to configure xterm to intercept and send a unique code for ctrl-tab and ctrl-shift-tab in your .Xresources file, then hack that into your .vimrc with some funky mappings.

Long story short is that it's hard to do (still haven't got it working here) because xterm and vim both need to be tricked into doing it. I'm personally gonna move on and use another mapping... this issue is a serious time sucker and I don't think it's worth pressing on to get it working!

Thanks for the help guys.

nfm
  • 19,689
  • 15
  • 60
  • 90
  • If you want as an interim try the solution in http://superuser.com/questions/410982/in-vim-how-can-i-quickly-switch-between-tabs . This uses the key combination of gt or gT which seems to work through a terminal – Faktor 10 Apr 23 '15 at 10:02
  • 1
    what the alternative terminals could resolve this issue? – wukong Aug 05 '15 at 15:10
  • @wukong that's also what I am thinking, I see that tmux should be configured with `screen-256color` anyway, so can we have this working with some other terminal ? – statquant Apr 29 '16 at 15:04
3

I used the blog and wiki posts from @nfm's answer and solved it:

Put this in your .Xresources file (you can copy-paste in this case):

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~")

Then do cd ; xrdb .Xresources and restart xterm.


Put this in your .vimrc:

!! Important - instead of XXXX you must type CTRL-V and then Esc OR copy-paste the whole text and run %s/\(set <F1[34]>=\)XXXX/\=submatch(1) . "\33"/g which is copy-pastable (insert it with <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

And restart vim.

Done.

MichalH
  • 1,062
  • 9
  • 20
  • @statquant it works perfectly for me. Can you write what part exactly is not working for you? – MichalH Apr 29 '16 at 15:53
  • I can't switch tabs with this, I copied the `.Xresources` file with those tabulations, then `cd; xrdb .Xresources` then updated the `.vimrc` using the change from `XXXX` to `^[` with your line restarted all terminals and vim... that's not working – statquant Apr 29 '16 at 16:03
  • Then I'm sorry, we probably have different versions and something isn't supported at yours, or something interrupts these settings. – MichalH Apr 30 '16 at 17:55
  • 1
    Worked for me, thanks. Except that I needed to map to vim windows navigation. All I had to do was to change the map of F13 and F14 in my .vimrc: map map Hope it helps someone. – Pierre Jun 15 '16 at 10:09
0

If you're using Ubuntu, you probably have something like Compiz enabled.

I can't know for sure, but you should take a look at Compiz extensions and whether on of them defines that shortcut. I had a similar problem once, not with vim, but still.

It could also be the X server that intercepts some keystrokes (example: xbindkeys).

ereOn
  • 53,676
  • 39
  • 161
  • 238
  • More info: I'm running Ubuntu server with xorg installed and fluxbox as my window manager – nfm Apr 23 '10 at 00:55
0

In my case,
I solved on rxvt-unicode (urxvt, v9.22) as below,

terminal (.Xresource)
URxvt.keysym.Control-Tab: \033[27;5;9~ 

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

Good Luck!

choi
  • 1
  • 2