在Vim普通模式下快速切换缓冲区


69

最近,我发现我在Vim中“使用标签不正确”。从那时起,我一直在尝试通过Vim在MiniBufExplorer的帮助下使用缓冲区,但是由于从正常模式更改缓冲区需要多少次击键,我感到很痛苦。使用标签页,我可以在正常模式下执行gtgT在标签页之间来回跳动,也可以执行以下NUMBERgt操作:转到特定标签页。

有了缓冲,我要么有进入命令模式:bn:bp或用MiniBufExplorer,使用Ctrl + kCtrl + Up跳到缓冲区窗口,左滚动或向右hl然后打Enter选择缓冲区我想要的。或者,我可以做一些涉及前导序列的操作,但是始终需要从主行移开多个手指。真是痛苦。

如何在正常模式下获得等效的切换选项卡以在正常模式下切换缓冲区,所以我可以执行gn/ gpfor :bn/ for:bpNUMBERgnfor这样的操作:buf NUMBER

Answers:


56

将此添加到您的.vimrc

map gn :bn<cr>
map gp :bp<cr>
map gd :bd<cr>  

请注意,您正在重新映射gpgd,但也许您并不在乎(:help gp:help gd)。

有关如何绘制按键的更多信息,请参见:help map-overview:help map.txt

顺便说一句,我个人使用<leader>而不是g在映射中。我<leader>的设定为;。这将我的<leader>钥匙放在主行上,这使我愿意使用映射所有内容<leader>:help mapleader如果您想更改<leader>密钥。


1
使用的好建议<leader>。我本来不喜欢这样,因为\ 是原来的领导者,不容易达到,但当然,做正确的事情是重新定义领导者要的东西离家近行,于我而言,,这是比更容易;了Dvorak布局。
gotgenes

这可能会影响gn(选择上次搜索的下一个实例),有些可能会与某些宏配合使用并重复执行。
jjisnow

<leader>d一个映射:bd我觉得是值得它更恼人。<leader>d偶然输入很容易,然后必须再次打开文件。我发现这种风险比:bd每次键入都要麻烦。但是通常我几乎从不删除缓冲区,我只是将所有缓冲区保持打开/隐藏状态,然后:%bd在完成某项工作后立即运行以删除所有缓冲区。这是Vim的优点之一,您实际上不必关心您打开了多少缓冲区。
icc97

50

我通常在缓冲区之间切换的方式是使用:buffer带有内置自动补全功能的命令,例如:b prof<Tab>切换到folder/path/LoginProfileFactory.php

您可以开始键入所需缓冲区的文件名的任何部分,这很好。

实际上,我很少记得我想要的缓冲区数量,而我使用的是:b 3:3b。我看到您提到您不喜欢:buf 3,所以Rumple Stiltskin可以替代:3b您喜欢的样式。


7
您甚至不必开始键入文件的任何部分,只需键入:b <Tab>(注意,别忘了添加空格),它将通过您打开的缓冲区开始循环。如果您什至不记得文件名
都会很有帮助


22

我在.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>

现在,一个选项卡可让您转到下一个缓冲区,而Shift-Tab则指向前一个缓冲区。


3
非常好。轻松的最佳解决方案。标签毕竟是导航键。选项卡的ctl-sh-tab和ctl-tab怎么样?
RichieHH

@HörmannHH不幸的是,某些快捷方式无法在Vim中映射,这是<C-Tab>的情况。
Biggybi,

这很棒。我在偷东西
不是

如果有:set hidden,您是否需要可修改,只读,修改的值?
ae0709'9

很棒的答案。
格雷戈里

16

这是基于Nick Knowlson的回答,但是我想在那儿扩大我的评论...

键入:b <Tab>(注意空格),然后使用Tab/在打开的缓冲区中循环

...这使我们更接近我使用的所有其他编辑器和浏览器中的Ctrl+ Tab

实际上在某些方面甚至更好,然后可以使用/箭头前进和后退。它避免了拇指+手指fu键入Ctrl+ Shift+Tab在编辑器和浏览器中的选项卡中向后移动。

NB Shift+Tab的作用与Tab

然后,这实际上类似于Windows 10中的Win+ Tab,在其中您首先打开窗口,然后可以使用箭头键四处移动。

编辑:我有两个使用缓冲区的技巧:

  1. 这个答案,我在我的.vimrc

    nnoremap <leader>bb :buffers<cr>:b<space> 
    

    它会打开:ls/:buffers命令并预输入,:b以便您只需键入缓冲区编号,您将看到一个包含所有缓冲区及其编号的列表。

  2. 我也有

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

    可以在当前缓冲区和最近使用的缓冲区之间切换,就像cd -在目录之间来回切换时一样


14

我使用插件unimpaired.vim

它定义了映射,[b]b跳转到列表中的上一个和下一个缓冲区。

对于跳转到特定缓冲区,我知道的最佳选择是您提到的那个: :b<number>

如果您进入另一个缓冲区,可以通过键入快速返回 <c-^>


7

扩展Rumple Stiltskin的答案,例如,如果您知道要获取的文件位于buffer中4,则可以使用以下命令快速到达该文件

4Ctrl-^

在英国键盘上,我实际上可以做到4Ctrl-6,如

:help CTRL-^

顺便说一句,您可以通过

:buffers

6

我使用LustyExplorer:我先打<leader>b了一个缓冲区列表,然后从要打开的缓冲区名称中输入了几个字母enter。简单。

但是,您并不是在“错误地使用选项卡”,而是在按自己的方式使用选项卡。如果对您有用,为什么要忍受无法学习“正确方法”的痛苦?


1
LustyExplorer看起来很整洁,可能是我最终选择的。在lococast.net/archives/185上有一个大约7分钟的非常好的视频演示。谢谢。
gotgenes

4

我使用F9和F10在此映射的上一个/下一个缓冲区之间移动:

map <F9> :bprevious<CR>
map <F10> :bnext<CR>

对我来说,这是切换缓冲区的最快方法。


3

fzf.vim是使用模糊匹配更改缓冲区的另一种快速方法。该插件附带默认命令:

:Buffers

它会打开所有与:ls类似的打开缓冲区的列表,但是可以(模糊地)搜索和选择一个缓冲区。通过回车在当前窗口中打开缓冲区,但是也可以分别使用^ X ^ V或^ T在新的拆分(h或v)或制表符中打开。

还值得注意的是:

:Lines

它允许搜索所有打开的缓冲区的内容。如果您忘记了缓冲区的名称但知道缓冲区应包含的内容,这将很方便。


FZF通常很棒,当打开不在缓冲区中的文件时,我总是使用它。我在其中.vimrcnnoremap <leader>bb :buffers<cr>:b<space>它打开:ls/:buffers命令并预输入,:b 因此您只需键入缓冲区号。这对我来说通常就足够了。我还发现该:buffers命令会立即出现,因为打开时会有令人沮丧的延迟:Buffers(至少在我最常使用Vim的Windows上的GVim中)。
icc97

2

我使自己更容易:在.vimrc

nnoremap <leader>bf :buffers<CR>:buffer "<- Last spaces is necessary

例如,在正常模式下,假设您的前导键为\(默认值为),键入\bf,则您有一个已打开缓冲区的列表,键入所需缓冲区的数量,然后按Enter键。注意:请记住最后一个空格 如果在:D之后键入它,则根本不需要

那样突出;)

在nnoremap以上的vim中切换缓冲区

更多详情:

<C-O> 向后导航

<C-I> 向前导航

因此,不需要额外的重新映射,否则您将重新映射它们。


1

我认为bufexplorer 是一个不错的插件。<leader>be弹出一个交互式缓冲区浏览器,其中列出了所有打开的缓冲区。您可以快速浏览列表并将其Enter放入选定的缓冲区。不像LustyExplorer它不依赖于红宝石。


0

这是我的解决方案:

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

顺便说一句,我使用“ buftabline”插件并设置let g:buftabline_numbers = 1为在制表行上散布缓冲区。

buftabline

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.