在 Vim 正常模式下快速切换缓冲区

最近我发现我是 在 Vim 中“错误地使用制表符”。从那以后,我一直试图在 Vim 中使用缓冲区,通过 MiniBufExplorer进行辅助,但我发现这很痛苦,因为从正常模式更改缓冲区需要多少次击键。对于制表符,我可以只用 gtgT在普通模式下在制表符之间来回跳转,我也可以用 NUMBERgt跳转到特定的制表符。

对于缓冲区,我要么使用 :bn:bp进入命令模式,要么使用 MiniBufExplorer,使用 Ctrl + kCtrl + Up跳到缓冲区窗口,使用 hl向左或向右滚动,然后按 Enter选择我想要的缓冲区。或者我可以做一些涉及领导者序列的事情,但是它总是需要切除多个手指远离主行。真的很痛苦。

我怎样才能得到一些等效的切换标签在正常模式切换缓冲区在正常模式,所以我可以做一些像 gn/gp:bn/:bpNUMBERgn:buf NUMBER

86197 次浏览

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-^>

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.

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"?

{count}CTRL-^ switches to the count numbered buffer.

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.

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.

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.

This is based on Nick Knowlson's answer, but I wanted to expand on my comment there ...

Type :b <Tab> (note the space), then cycle through the open buffers with Tab or / .

... 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:

  1. From this answer I have this in my .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 as you'll see a list with all the buffers and their numbers.

  2. I also have

    nnoremap <leader><tab> :b#<cr>
    

    which toggles between the current and most recently used buffers, it's a bit like doing cd - when switching back and forth between directories

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.

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 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 ;)

switching buffers in vim with above nnoremap

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.

buftabline

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