275

In gnome-terminal, I can just press Alt + (1, 2, 3, etc.) to switch to specific tabs. I can also use Ctrl + (PgUp / PgDn) to cycle through tabs (admittedly less convenient, but it can be remapped).

If I want to use vim tabs instead of gnome-terminal tabs, typing :tabn and :tabp is quite cumbersome. I could map them to keyboard shortcuts, but that is still a lot less convenient than jumping directly to tab 4 with Alt + 4.

Is there a faster way to switch between tabs in vim?

1
  • I'm using Cygwin's Gvim, and Ctrll+PgUp/PgDown works. Unfortunately, Ctrl+PgUp seems to be ignored a lot of the time unless I Alt+Tab to another application and Alt+Tab back. Commented Apr 13, 2023 at 22:49

9 Answers 9

424

Next tab: gt

Prior tab: gT

Numbered tab: nnngt

4
  • 4
    I know that I could type nnn g t, but I want to do it quickly, i.e. Alt + nnn or Ctrl + nnn. But Alt + n is already taken by gnome-terminal, and binding to Ctrl + n doesn't seem to have any effect.
    – Matthew
    Commented Apr 11, 2012 at 2:46
  • 12
    What about mapping function keys to nnn g t? E.g., :map <F2> 2gt. There is the problem that <F1> is often mapped by GNOME to its help facility. Or you could choose some key you don't use often in normal mode, say the comma, and map it like this: :map , gt. Then 1, will take you to tab 1, 2, to tab 2, and so on.
    – garyjohn
    Commented Apr 11, 2012 at 5:00
  • 4
    I found it very convenient to use '<' and '>' Commented Feb 22, 2016 at 16:14
  • 3
    Last tab: :tabl command (full form: :tablast).
    – Ruslan
    Commented May 25, 2020 at 17:06
84

Why not make use of your leader (my leader is mapped to Space):

" Go to tab by number
noremap <leader>1 1gt
noremap <leader>2 2gt
noremap <leader>3 3gt
noremap <leader>4 4gt
noremap <leader>5 5gt
noremap <leader>6 6gt
noremap <leader>7 7gt
noremap <leader>8 8gt
noremap <leader>9 9gt
noremap <leader>0 :tablast<cr>

You can use the settings below to toggle between the current and last active tab (here it is mapped to Ctrl+L, i.e., <c-l>):

" Go to last active tab

au TabLeave * let g:lasttab = tabpagenr()
nnoremap <silent> <c-l> :exe "tabn ".g:lasttab<cr>
vnoremap <silent> <c-l> :exe "tabn ".g:lasttab<cr>
4
  • 2
    You need au TabLeave * let g:lasttab = tabpagenr() for c-l to work: stackoverflow.com/questions/2119754/… Commented Oct 16, 2014 at 12:31
  • 2
    I'd add <leader>h/l for gT and gt
    – Brenden
    Commented Apr 7, 2016 at 20:13
  • I think this answer is the most appropriate regarding the OP needs expressed.
    – Adrien
    Commented Feb 20, 2020 at 11:56
  • Here is a lua equivalent for the last active tab. Sorry about the formatting: local lastTab = vim.api.nvim_create_augroup("LastTab", { clear = true }) vim.api.nvim_create_autocmd("TabLeave", { pattern = "*", command = "let g:lasttab = tabpagenr()", group = lastTab } ) vim.api.nvim_set_keymap('n', 'da', ':exe "tabn ".g:lasttab<CR>', {noremap = true, silent = true}) vim.api.nvim_set_keymap('v', 'da', ':exe "tabn ".g:lasttab<CR>', {noremap = true, silent = true})
    – Fonnae
    Commented Dec 4, 2023 at 19:10
45

This is the easiest way that I found, to switch between tabs faster and simple.
Add next lines to your .vimrc and enjoy it, more tricks about vim tabs here.

nnoremap <C-Left> :tabprevious<CR>
nnoremap <C-Right> :tabnext<CR>

Now you can use Ctrl to go left and Ctrl to go right.

Or just use:
1gt to go to tab one,
2gt to go to tab two,
3gt to go to tab three, etc... now you have the idea.

9
  • I think this is the best answer here. Very convenient to have. I just disabled those system keybindings in OS X for making them system independent. Commented May 14, 2016 at 5:47
  • 3
    Use arrow keys will slow you down. I have them disabled Commented Jul 19, 2016 at 5:03
  • Yup... Best answer! Commented Sep 9, 2016 at 18:08
  • Sadly "Ctrl" gave me problems in vmplayer, so I changed to keys "Backspace" and "Enter". Commented Jul 13, 2017 at 11:30
  • Mac users: you may need to disable the default Mission Control spaces keyboard shortcuts: stackoverflow.com/questions/15719135/…
    – 4Z4T4R
    Commented Aug 29, 2017 at 22:52
37

As I am on a Mac and not using MacVim (but plain vim within a terminal) I have had some difficulty with key combinations not being sent through to the terminal.

The most-compatible (and for me most comfortable) way to switch tabs quickly comes from the Vim Wikia site.

Place in your .vimrc file:

nnoremap H gT
nnoremap L gt

Now Shift-h (capital H) and Shift-l (capital L) will switch you quickly between tabs, and follows the convention that h and l correspond to left and right in vim on a regular qwerty keyboard.

4
  • 2
    I love this solution, intuitive and vim-like. No arrow keys needed. Commented Apr 11, 2019 at 12:34
  • 2
    I agree. A very nice solution
    – j sad
    Commented Jul 16, 2019 at 18:14
  • 2
    this is really an intuitive solution. Thank you! Commented Oct 11, 2019 at 1:41
  • Normal mode H/L is bound to vim's "move cursor to top/bottom" of the page fyi.
    – Ryan
    Commented Nov 4, 2023 at 3:12
5

(Unfortunately) vim also uses CtrlPgDn/PgUp to cycle through tabs. You'll need to use map to map tabn/tabp to something usable.

2
  • This matches Excel's hotkeys for switching tabs. Those are already in my muscle memory so perfect for me! Commented Nov 21, 2023 at 13:18
  • I noticed this behavior but couldn't find any place inside the help explaining this. Do you know if there's any?
    – awvalenti
    Commented Mar 20 at 20:48
4

Add these to .vimrc to enable tab navigation hot keys:

<ctrl-l> toggle between 2 most recent tabs;

<ctrl-j/k> goto the last/next tab;

<ctrl-t> open a new tab.

" tab navigation: Alt or Ctrl+Shift may not work in terminal:
" http://vim.wikia.com/wiki/Alternative_tab_navigation
" Tab navigation like Firefox: only 'open new tab' works in terminal
nnoremap <C-t>     :tabnew<CR>
inoremap <C-t>     <Esc>:tabnew<CR>
" move to the previous/next tabpage.
nnoremap <C-j> gT
nnoremap <C-k> gt
" Go to last active tab 
au TabLeave * let g:lasttab = tabpagenr()
nnoremap <silent> <c-l> :exe "tabn ".g:lasttab<cr>
vnoremap <silent> <c-l> :exe "tabn ".g:lasttab<cr>
1
  • Is it possible to map <Ctrl>-<Tab> to the last toggle tab function. I've tried nnoremap <silent> <C-Tab> :exe "tabn ".g:lasttab<cr> and vnoremap <silent> <C-Tab> :exe "tabn ".g:lasttab<cr> without luck.
    – zzeroo
    Commented Sep 18, 2019 at 9:16
3

If you're using gvim or similar (i.e., something outside of the terminal), you can imitate the gnome-terminal behaviour you describe with:

" Map alt-x keys to jump to a tab
for i in range(1, 8)
  execute "nmap \<M-" . i . "> " . i . "gt"
endfor
nmap <M-9> :tablast<CR>

So alt-1 jumps to the first tab, etc. But alt-9 jumps to the last tab (as in Chrome).

You might want to wrap this in if has("gui_running") (although this doesn't seem to work with Neovim), or put this in .gvimrc.

2
  • Lol I don't know why Although This is the Only answer that satisfies the question Yet the least up-voted one
    – Susano
    Commented Mar 31, 2021 at 19:20
  • 1
    @MahmoudSalah - it's likely b/c this Q&A comes up 1st on google and most ppl looking for this solution aren't on Linux.
    – slm
    Commented May 29, 2021 at 12:40
2

I like to switch windows/tabs with fzf-vim. It is fast and

For instance you can make a bindkey <leader>w which calls Windows or Buffers. Also Jumps and Changes are useful tools for fast switching.

Buffers:

enter image description here

Windows :

enter image description here

Here some maps for fzf I am using frequently:

nnoremap <silent><Leader>f :Files<CR>
nnoremap <silent><leader>j :Jumps<CR>
nnoremap <silent><leader>c :Changes<CR>
nnoremap <silent><Leader>m :Marks<CR>
nnoremap <silent><Leader>w :Windows<CR>
nnoremap <silent><Leader>h :Helptags<CR>
nnoremap <silent><Leader>b :Buffers<CR>
nnoremap <silent><Leader>bl :BLines<CR>
1
  • 1
    :Windows (or :W) worked for me. Thanks! Fun fact: I have been accidentally pressing :W for years and immediately backing out without ever looking at what it actually did! 😁
    – Max Coplan
    Commented Jun 8, 2023 at 15:17
1

I encountered this problem the same as you,
but later I find out what I really need might be a Marker.
Especially when using uppercase characters like mA ,
It will take you to your marked tab by using "`A" as fast as it can.
Hope it can help.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .