你在Vim中更喜欢如何切换缓冲区?

98

我曾尝试过MiniBufExplorer,但通常会出现多个窗口显示或完全关闭。我想要的是像LustyJuggler这样带有增量搜索功能的脚本,可以像在Emacs中切换缓冲区那样。肯定有类似的脚本吧?

16个回答

79

我过去常用标签和多个gvim实例的组合,将相关文件作为每个实例中的标签组。只要我不在一个实例中拥有太多标签,标签栏就可以一目了然地显示你正在编辑的每个文件的名称。

后来我读到了Jamis Buck的一篇文章,他从TextMate切换回vim,学到了一些很棒的技巧:

  • 使用Ctrl+w sCtrl+w v 来分割当前窗口。
  • 使用Ctrl+6在同一个窗口中的两个缓冲区之间进行切换。
  • 强大的fuzzyfinder.vim可以自动完成搜索当前目录中的文件或您当前打开的缓冲区。
  • Jamis的fuzzy_file_finderfuzzyfinder_textmate,稍微修改了fuzzyfinder的工作方式,以更像TextMate中的类似功能(据我所知,区别在于它匹配文件名中的任何位置,而不仅仅是从开头)。观看this video以查看其操作。
现在我只有一个最大化的gvim实例,并将其分割成多个窗口,以便可以同时查看多个文件。 我将Ctrl+F绑定到fuzzyfinder_textmate,所以现在如果我键入(比如)Ctrl+Fmod/usob,它会打开app/models/user_observer.rb。 我几乎再也不使用标签了。 更新2010/08/07 虽然fuzzyfinder_textmate仍然很棒,正如Casey在评论中指出的那样,它已经不再维护。 此外,当处理大型项目(许多目录或文件)时,它(和/或fuzzyfinder.vim)会变得有点慢和不稳定,因此我一直在寻找替代方案。
幸运的是,Wincent ColaiutaCommand-T plugin似乎是一个非常好的替代品。 它的行为非常相似(如果不是稍微更好)于fuzzyfinder_textmate,但明显更快; 它还具有一些不错的功能,例如能够在分割或垂直分割中打开找到的文件。 感谢David Rivers的指引(和投票!)。

是的,fuzzyfinder非常接近我想要的。 - Alexey Romanov
Jamis的fuzzyfinder_textmate完成了vim。它真的应该成为核心功能! - csexton
看起来Jami已经停止在这个项目上的工作了。也许原作者会加入这些功能呢? - cmcginty
1
Sam,感谢你在我的生日上给我的支持(:D)! - David Rivers
14
试试ctrlp vim插件(http://kien.github.com/ctrlp.vim/),它实现了模糊查找,但具有更多有用的功能。 :) - Philip
Unite和Ycm一起使用非常棒,将文件标签保留在源代码中也很好。尝试使用“:Unite buffer”或“:Unite file”命令 - Dislexics Untie! - osirisgothra

34

我使用基本功能 - ':ls' + ':bn'/':bp' + ':b <part-of-name>'


8
我从未想过会在同一个句子中看到“简单”、“':ls' + ':bn'/':bp' + ':b <部分名称>'”。 - paxdiablo
16
抱歉,我不确定您想表达什么意思。请提供更多上下文或明确您的问题。 - csexton
这个技巧加上 :map <c-n> :bn<cr>:map <c-p> :bp<cr>,因为 C-nC-p 打起来很快,如果你重复按它们,可以在缓冲区之间循环。 (我从未使用过它们的原始目的。)就像使用 C-PgUpC-PgDn 或浏览器的其他快捷键在选项卡之间循环一样。 - Tobia
1
Ctrl+N是大多数其他编辑器中“新建文件”的标准快捷键,而Ctrl+P则是粘贴命令,因此对于大多数人来说,这些快捷键可能会非常令人困惑。Tim Pope的vim-unimpaired为您提供了[b表示上一个缓冲区,]b表示下一个缓冲区,以及许多其他使用[表示上一个和]表示下一个概念的好东西。 - icc97

33

我喜欢使用 "ctrl-w s" 和 "ctrl-w v" 来分割窗口。然后我将带有 ctrl 的移动键 (h、j、k、l) 映射到在分割窗口之间移动:

" Map ctrl-movement keys to window switching
map <C-k> <C-w><Up>
map <C-j> <C-w><Down>
map <C-l> <C-w><Right>
map <C-h> <C-w><Left>

移动手到箭头键很烦人。

接下来,我设置了ctlr-tab用于在当前窗口中切换缓冲区(像许多其他环境一样):

" Switch to alternate file
map <C-Tab> :bnext<cr>
map <C-S-Tab> :bprevious<cr>

这些东西在过去几年中对我来说表现得相当不错,尽管Vim总是有比你所知道的更多的秘密。


3
你的评论“切换到替代文件”是有误导性的,因为Vim已经有一个替代文件,它就是你之前编辑的文件,而你可以使用Ctrl-6轻松地在当前文件(%)和替代文件(#)之间进行切换。 - graywh
10
另外,使用 hjkl 和 <C-w> 可以切换窗口,无需使用箭头键。 - graywh
4
<C-S-Tab>正在要求RSI。我已经将<S-J>映射为:bp,将<S-K>映射为:bn - puk
4
在正常模式下重新映射<S-J>似乎不是一个好选择,因为它通常用于连接行。 - Michael Percy

24
我已经使用Wincent Colaiuta的Command-T vim插件几个月了。Wincent用C语言编写了它需要快速运行的部分,我必须说它确实非常快!而且,我认为它的文件模式匹配逻辑甚至比Textmate的Command-T更好。看看screencast

Command-T插件为VIM提供了一种极快、直观的机制,可以用最少的按键打开文件。它被命名为"Command-T",因为它受到绑定在TextMate中的"前往文件"窗口的启发。

通过输入路径中出现的字符选择文件,并按照一种算法排序,该算法知道出现在某些位置(例如,在路径分隔符后面)的字符应该给予更高的权重。

更易于缓冲区切换包含许多有用的提示。我已经将以下内容调整到了我的.vimrc文件中,它可以自动完成缓冲区名称,将最有用的缓冲区切换命令映射到我的<Leader>和左侧Home Row键上,并在状态栏中显示当前缓冲区编号:

"" Tab triggers buffer-name auto-completion
set wildchar=<Tab> wildmenu wildmode=full

let mapleader = ","

map <Leader>t :CommandT<Return>
map <Leader>a :bprev<Return>
map <Leader>s :bnext<Return>
map <Leader>d :bd<Return>
map <Leader>f :b 

"" Show the buffer number in the status line.
set laststatus=2 statusline=%02n:%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

我也使用MiniBufExplorer,它可以在顶部水平拆分窗口中提供每个列出的缓冲区的紧凑列表。


18
nmap <Leader>bb :ls<CR>:buffer<Space>

并且没有人提到过很好的插件ctrlp.vim。使用此插件,您可以通过名称搜索缓冲区。


我喜欢那个映射!聪明而灵活。 - ivan

15

我使用

CTRL-J 来切换到下一个缓冲区

CTRL-K 来切换到上一个缓冲区

CTRL-L 来切换到下一个标签页

CTRL-H 来切换到上一个标签页

这是我的 .vimrc 配置:

map <C-J> :bnext<CR>
map <C-K> :bprev<CR>
map <C-L> :tabn<CR>
map <C-H> :tabp<CR>

请查看http://syskall.com/my-biggest-vim-productivity-boost/


6

我最近变得更加简约。

我使用来自unimpaired的]b[b循环缓冲区: https://github.com/tpope/vim-unimpaired

要直接跳转到打开的缓冲区,只需使用Vim的标签完成功能和:b。几个字母就足以用一个或两个标签到达任何打开的缓冲区。

类似于打开缓冲区,我使用具有相对路径和标签完成的:e

我偶尔也会使用:ls查看我的打开缓冲区(并检查它们的修改状态)。

为了摆脱缓冲区,我使用:bw来清除缓冲区。我通常会创建一个临时分割窗口并更改缓冲区以保留我的布局,因为:bw也会关闭活动窗口。

我尝试过所有的minibuf,但最终都让我感到烦恼,而且我不希望一些智能匹配的东西为我打开随机文件。如果我真的需要浏览某些东西,我会使用NERDtree(:e .)。

我也不再使用Yankring(因为它会损坏xp),而是开始使用寄存器,最近我也认为f/t移动是最棒的...


这是非常好的建议。我将 <leader>ll 映射到 :ls。另外,在你的 .vimrc 中确保有 set wildmenu 是非常有用的,因为这样你就可以得到一个小菜单,其中列出了所有 :b 的备选项。 - icc97

6
imap <A-1> <Esc>:tabn 1<CR>i
imap <A-2> <Esc>:tabn 2<CR>i
imap <A-3> <Esc>:tabn 3<CR>i
imap <A-4> <Esc>:tabn 4<CR>i
imap <A-5> <Esc>:tabn 5<CR>i
imap <A-6> <Esc>:tabn 6<CR>i
imap <A-7> <Esc>:tabn 7<CR>i
imap <A-8> <Esc>:tabn 8<CR>i
imap <A-9> <Esc>:tabn 9<CR>i

map <A-1> :tabn 1<CR>
map <A-2> :tabn 2<CR>
map <A-3> :tabn 3<CR>
map <A-4> :tabn 4<CR>
map <A-5> :tabn 5<CR>
map <A-6> :tabn 6<CR>
map <A-7> :tabn 7<CR>
map <A-8> :tabn 8<CR>
map <A-9> :tabn 9<CR>

1
使用 Vim 最有趣的一点是你每天都可以学到新东西! - Luc M
问题是关于缓冲区,而不是标签页...但你可以先使用:tab sball,或者不使用:tabn而改用:buffer - pera
是的!这正是我在寻找的,是否有人正在使用Alt-<num>映射或者它们是否有隐藏的陷阱(就像Ctrl-<num>一样)。我计划还要利用https://vim.fandom.com/wiki/Easier_buffer_switching#Mappings_for_buffer_number中的第二个代码示例(基本上,使用while循环和execute)使其更简洁易用。 - Sundar R

4
为了列出和切换缓冲区,我使用以下命令:
nnoremap <Leader>l :ls<CR>:b<space>

切换缓冲区:

map <Leader>n :bn<CR>
map <Leader>p :bp<CR>

2

优秀的Buffer Explorer已经成为我强大的肌肉记忆,以至于我希望我能在其他应用程序中使用它。当我需要同时编辑两个以上的文件时,我发现它非常快速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接