您如何在Vim中的缓冲区之间切换?


Answers:


23

我已经使用Wincent Colaiuta的Command-T vim插件几个月了。Wincent编写了需要在C中快速运行的部分,我必须说是!而且,我认为它的文件模式匹配逻辑甚至比Textmate的Command-T更好。查看截屏视频

用于VIM的Command-T插件提供了一种非常快速,直观的机制,可以以最少的击键次数打开文件。之所以命名为“ Command-T”,是因为它受到TextMate中绑定到Command-T的“转到文件”窗口的启发。

通过键入出现在文件路径中的字符来选择文件,并通过一种算法对文件进行排序,该算法知道出现在某些位置(例如,紧接在路径分隔符之后)的字符应被赋予更大的权重。

更容易的缓冲区切换包含许多有用的技巧。我已经对.vimrc进行了以下修改,它执行缓冲区名称自动补全,将最有用的缓冲区切换命令映射到我的<Leader>和左侧的主行键,并在状态行中显示当前缓冲区号:

"" 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,它在其自己的水平拆分顶部中提供了每个列出的缓冲区的紧凑列表。


73

我曾经使用过选项卡和多个gvim实例的组合,在每个实例中将相关文件组作为选项卡。只要我在一个实例中没有出现太多标签,标签栏就一眼就能显示正在编辑的每个文件的名称。

然后,我阅读了Jamis Buck的帖子,内容涉及他如何从TextMate切换回vim,并学到了一些很棒的技巧:

  • Ctrl-w和Ctrl-w v拆分当前窗口
  • Ctrl-6在同一窗口中的两个缓冲区之间来回切换。
  • 很棒的Fuzzyfinder.vim,可让您自动完成对当前目录中文件或当前打开的缓冲区的搜索
  • 贾米斯( Jamis)自己的Fuzzy_file_finderFuzzyfinder_textmate,它们稍微修改了Fuzzyfinder的工作方式,使其更像TextMate中的类似功能(据我所知,区别在于它在文件名中的任何地方匹配,而不仅仅是从头开始)。观看此视频以观看实际操作。

现在,我只有一个最大化的gvim实例,并将其拆分为多个窗口,这样我就可以一次看到多个文件。我将Ctrl-F绑定到Fuzzyfinder_textmate,所以现在如果我输入(例如)Ctrl-F,mod/usob它将打开app / models / user_observer.rb。我几乎再也不会打扰标签了。

更新2010/08/07

正如Casey在评论中指出的那样,虽然Fuzzyfinder_textmate仍然很棒,但不再保留它。另外,在处理大型项目(大量目录或文件)时,它(和/或Fuzzyfinder.vim)会变得缓慢且不稳定,因此我一直在寻找替代方案。

幸运的是,Wincent ColaiutaCommand-T插件形式似乎是一个非常不错的选择。它的行为与Fuzzyfinder_textmate非常相似(如果不是更好的话),但是明显更快。它还具有不错的功能,例如能够以拆分或垂直拆分打开找到的文件。感谢(并赞扬!)David Rivers指出了这一点。


是的,Fuzzyfinder非常适合我想要的东西。
阿列克谢罗曼诺夫

Jamis的Fuzzyfinder_textmate完成了vim。它确实应该成为核心功能!
csexton

贾米(Jami)似乎已停止从事这个项目。也许原作者会提供这些功能? weblog.jamisbuck.org/2009/1/28/…– cmcginty
2009年

山姆,谢谢你给我的道具(在我生日那天!):D
David Rivers

14
尝试使用ctrlp vim插件(kien.github.com/ctrlp.vim),该插件实现了Fuzzyfinder但具有许多更有用的功能:)
Philip

33

我使用基础知识-' :ls'+' :bn'/' :bp'+' :b <part-of-name>'


8
:-)我从没想过我会在同一句话中看到“简单”和“':ls'+':bn'/':bp'+':b <部分名称>'”。
paxdiablo

16
Pax,我仍然看不到。:-)
csexton

加号:map <c-n> :bn<cr>:map <c-p> :bp<cr>,因为C-nC-p可以快速键入,并且如果您反复按它们,则允许在缓冲区之间循环。(我从来没有将它们用于其原始目的。)这就像在浏览器选项卡之间使用C-PgUpC-PgDn或浏览器具有的任何快捷方式循环之间。
Tobia

Ctrl + N是大多数其他编辑器中“新文件”的标准,而Ctrl + P是粘贴命令,因此对于大多数人而言,这些操作确实令人困惑。蒂姆·波普(Tim Pope)的vim不成对为您[b提供了上一个缓冲区和]b下一个缓冲区。加上大量其他商品,它们使用“ ]下一个”和[“上一个” 的概念。
icc97

31

我喜欢“ ctrl-w s”和“ ctlr-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的<Cw>将切换窗口-不需要箭头键。
graywh

4
<CS-Tab>要求提供RSI。我已将<SJ> :bp和<SK> 映射到:bn
puk 2012年

3
在普通模式下,重新映射<SJ>似乎是一个糟糕的选择,因为这是常用的(用于连接线)。
Michael Percy

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

没有人提到不错的插件ctrlp.vim。使用此插件,您可以按名称搜索缓冲区。


我喜欢那个映射!灵巧而灵活。
ivan 2013年


5
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 2013年

5

我最近变得更加简约。

要循环使用我使用的缓冲区]b[b从未损坏的缓冲区:https : //github.com/tpope/vim-unimpaired

要直接跳转到打开的缓冲区,只需使用Vim的制表符补全:b。只需几个字母就可以使用一个或两个制表符到达任何打开的缓冲区。

与打开缓冲区类似,我使用:e相对路径和制表符完成。

我还:ls偶尔使用来查看我打开了哪些缓冲区(并检查它们的修改状态)。

为了摆脱缓冲区,我使用:bw了擦除缓冲区。我通常会临时拆分并更改缓冲区以保留我的布局,尽管这:bw也会关闭活动窗口。

我尝试过的所有minibuf东西最终都使我烦恼,并且我不希望有任何智能匹配的东西为我打开随机文件。如果确实需要浏览某些内容,请使用NERDtree(:e .)。

IDK,最近我也放弃了Yankring(因为它拧紧了xp)并开始使用寄存器,最近我决定f/ t动作是有史以来最伟大的事情...


这都是很好的建议。我已映射<leader>ll:ls。此外,它是非常有用的,以确保你有set wildmenu.vimrc的,那么你得到的是与所有出现的替代一个小菜单:b
icc97

2

出色的Buffer Explorer,其强大的记忆力使我发现自己希望自己可以在其他应用程序中使用它。我发现在主动编辑两个以上文件时,它的速度非常快。


2

我已经花了很长时间构建.vimrc来与这个HTML :: Mason项目一起工作了四年,所以我混合使用了选项卡和拆分窗口。为了您的观赏享受:

map ;o :Sex <CR>
map <C-J> <C-W>j
map <C-K> <C-W>k
map <C-l> <C-W>l
map <C-h> <C-W>h
map ;] :tabnext<CR>
map ;[ :tabprev<CR>
map <C-t> :tabe +"browse ."<CR>
map <C-O> :NERDTreeToggle ~/curr/trunk/<CR>

2

我使用tselectbuffer。这确实非常快,而且与bufexplorer不会在您的窗口中占用空间。它还有一个增量搜索。我尝试了minibufexplorer,但发现缓冲区中的导航有点困难。


感谢您的指针,现在我同时使用两者。对于BufExplorer默认值是,be,bs,bv,所以我映射TSelectBuffer来,bb
Brady Trainor 2014年

2

要列出并在缓冲区之间切换,我使用:

nnoremap <Leader>l :ls<CR>:b<space>

要在缓冲区之间切换:

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

2

我已经映射<S-J>,并<S-K>:bp:bn,虽然我承认我不使用它作为文件的数量大于10。然后我制订<C-J><C-K>于Gnome终端的前面和后面的标签,我通常运行的vim的4个实例为每我从事的4个不同项目。我仍然非常希望下一个和上一个缓冲区将进入我一直在使用的缓冲区的历史记录,而不是进入缓冲区列表的顺序。


2

我使用tselectbuffer。这确实非常快,而且与bufexplorer不会在您的窗口中占用空间。它还有一个增量搜索。我尝试了minibufexplorer,但发现缓冲区中的导航有点困难。


0

我使用带有^ W + w / ^ W + r的简单:vsplit和带有Ctrl + Alt + PgUp / PgDown组合键的:tabnew。


1
我必须同意Zathrus 在这里所说的话。Vim中的选项卡(或带有TabBar的Emacs)根本无法像通常的选项卡式界面中那样工作。
阿列克谢·罗曼诺夫

0

当Vim会话中有多个缓冲区打开时,很难跟踪缓冲区及其各自的缓冲区编号。在这种情况下,使用简单的映射可以更轻松地切换到其他文件:

:nnoremap(F5):缓冲区(CR):缓冲区(空格)

vim.wikia.com

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.