Recently I found out that I'm "using tabs incorrectly" in Vim. I've been trying to just use buffers in Vim since, assisted through MiniBufExplorer, but I find it painful because of how many keystrokes it takes to change buffers from normal mode. With tabs, I can just do gt or gT to hop back and forth between tabs in normal mode, and I can also do NUMBERgt to go to a specific tab.
With buffers, I either have to enter command mode with :bn
, :bp
, or with MiniBufExplorer, use Ctrl + k or Ctrl + Up to hop up to the buffer window, scroll left or right with h and l and then hit Enter to select the buffer I want. Or I can do something involving a leader sequence, but it always requires removing multiple fingers away from home row. That's a real pain.
How can I get something equivalent switching tabs in normal mode to switch buffers in normal mode, so I can do something like gn/gp for :bn
/:bp
and NUMBERgn for :buf NUMBER
?
Add this to your .vimrc
map gn :bn<cr>
map gp :bp<cr>
map gd :bd<cr>
Note that you are remapping gp
and gd
, but maybe you don't care about that (:help gp
, :help gd
).
For more information on how to map key strokes see :help map-overview
and :help map.txt
.
Btw, I personally use <leader>
instead of g
in the mapping. My <leader>
is set to ;
. This puts my <leader>
key on the home row which makes me willing to map all kinds of stuff using <leader>
. :help mapleader
if you want to change your <leader>
key.
The way I usually switch between buffers is to use the :buffer
command with the built-in autocompletion, e.g. :b prof<Tab>
to switch to folder/path/LoginProfileFactory.php
.
You can just start typing any part of the file name of the buffer you need, which is nice.
Less often, I actually remember the numbers of the buffers I want and I use something like :b 3
or :3b
. I see you mention you don't like :buf 3
though, so Rumple Stiltskin has an alternative to the :3b
style that you may prefer.
:b <Tab>
(N.B. don't forget to add a space) and it will start cycling though the buffers you have open. Helpful if you can't even remember the filenames
lastused
in my wildmode
(I use set wildmenu wildmode=lastused:full
) is very convenient as it cycles through matches in most recently used order, making it easy to jump back to a recent buffer.
{count}CTRL-^
switches to the count
numbered buffer.
:buffers
before this or see my answer...
I have the following lines in .vimrc:
nnoremap <silent> <tab> :if &modifiable && !&readonly && &modified <CR> :write<CR> :endif<CR>:bnext<CR>
nnoremap <silent> <s-tab> :if &modifiable && !&readonly && &modified <CR> :write<CR> :endif<CR>:bprevious<CR>
Now a Tab let you go to the next buffer and a Shift-Tab to the previous.
:set hidden
do you need the values of the modifiable, readonly, modified?
This is based on Nick Knowlson's answer, but I wanted to expand on my comment there ...
Type :b
... which gets us closer to the Ctrl + Tab in all the other editors and browsers I use.
It's actually even better in some ways, you can then go backwards and forwards with ← / → arrows. It avoids the thumb + finger fu to type Ctrl + Shift + Tab to go backwards through the tabs in editors and browsers.
N.B. Shift + Tab just does the same as Tab
This is then actually something like Win + Tab in Windows 10, where once you first open up the window and you can then move around using the arrow keys.
Edit: I have two further tricks that I picked up for using buffers:
From this answer I have this in my .vimrc: nnoremap
I use the plugin unimpaired.vim
it defines mappings [b
and ]b
that jump to the previous and next buffer in the list.
For jumping for a specific buffer the best option I know is the one you mentioned: :b<number>
If you go into another buffer you can came back quickly by typing <c-^>
I use LustyExplorer: I hit <leader>b
to open a list of buffers then a couple of letters from the name of the buffer I want to open then enter
. Easy.
But, you are not "using tabs incorrectly", you are using tabs the way you want. If it worked for you why go through the pain of unlearning your way to learn "the right way"?
Expanding on Rumple Stiltskin's answer, if you know that the file you want to get to is in buffer 4
, for example, you can get there quickly with
4Ctrl-^
On my UK keyboard, I can actually do 4Ctrl-6
, as explained in
:help CTRL-^
By the way, you can see the buffer numbers with
:buffers
or
:ls
I use F9 and F10 to move between the previous/next buffer with this mapping:
map <F9> :bprevious<CR>
map <F10> :bnext<CR>
For me this is the fastest way to switch buffers.
fzf.vim is another fast way to changes buffers using fuzzy matching. This plug-in ships with the default command:
:Buffers
which opens the list of all open buffers similar to :ls but a buffer can be (fuzzy) searched and selected. Opening the buffer in the current window is through enter, but can can also be opened in a new split (h or v) or tab using ^X ^V or ^T respectively.
Noteworthy is also:
:Lines
Which allows to search through the content of all open buffers. This can be handy if you forget the name of a buffer but you know what it should contain.
.vimrc
: nnoremap <leader>bb :buffers<cr>:b<space>
it opens the :ls
/ :buffers
command and pre-types the :b
so that you just have to type the buffer number. This is normally enough for me. I also find that the :buffers
command appears instantly where as there is a frustrating delay when opening :Buffers
(at least in GVim on Windows which is where I'm using Vim most).
I make it easier for myself: In .vimrc
:
nnoremap <leader>bf :buffers<CR>:buffer "<- Last spaces is necessary
For example, in normal mode, say your leader key is \
(default it is), type \bf
, then you have a list of opened buffers, type number of buffer you want and hit enter key. NOTE: remember that last spaces
not necessary at all if you wich type it after :D
Jut like that ;)
https://i.stack.imgur.com/VNkZl.png
More detail:
<C-O>
Navigate backward
<C-I>
Navigate forward
So there is no need extra remapping, otherwise you remapped them.
Here is my solution:
" `<leader><Tab>` - next buffer;
nnoremap <silent> <leader><Tab> :bnext<CR>
" `<leader><S-Tab>` - previous buffer;
nnoremap <silent> <leader><S-Tab> :bprevious<CR>
" `_bufferNumber_ + <Tab>` - go exact the buffer number;
nnoremap <silent> <Tab> <C-^>
By the way, I use 'buftabline' plugin and set let g:buftabline_numbers = 1
to spread my buffer on the tabline.
https://i.stack.imgur.com/BIUuB.png
I think bufexplorer is a nice plugin to use. <leader>
be brings up an interactive buffer explorer that lists all open buffers. You could quickly move through the list and Enter puts you in the selected buffer. Unlike LustyExplorer
It has no dependency to ruby.
I prefer navigating between buffers similarly to how I'm navigating between window panes: <alt-h>
and <alt-l>
. This is to straightforward to set on Mac because <alt>/<option>
key binds are bounded to specific characters.
" Buffer navigation
map ˙ :bp<cr>
map ¬ :bn<cr>
map § <c-^>
Here is a good answer that shows how you can see characters maped to <alt-..>
combinations
Success story sharing
<leader>
. Originally I didn't like this because\
is the original leader and was not easy to reach, but of course, the right thing to do was redefine the leader to be something close to home-row, in my case,
, which is easier than;
for Dvorak layout.<leader>d
as a mapping to:bd
I find to be more annoying than worth it. It's quite easy to type<leader>d
by accident and then you have to go and re-open your file again. I find this risk more annoying than typing:bd
each time. But then typically I almost never delete the buffer, I just leave all the buffers open/hidden and then run:%bd
to delete them all once I'm done on a certain piece of work. It's one of the nice things of Vim that you don't really have to care about how many buffers you have open.