vim,使用vanilla Vim快速切换文件(无插件)

我知道,限制自己到香草Vim(不使用插件)限制了编辑的权力,但是当我经常在不同的机器之间切换时,在任何地方移动我的环境往往是太麻烦了。 我想留在香草维姆。

一些阻碍我的是能够快速切换文件。 我(至less相信)对缓冲区窗口选项卡以及netrw( VexEx等)有很好的理解。

但是在一个像Sublime Text这样的编辑器中,我只需键入ctrl -p,然后立即在文件中。

我知道我可以下载到shell,但是我想知道是否有任何其他“隐藏的”秘密来快速切换Vim中的文件不仅仅是文件名。

与ST2的Ctrl + P最接近的等效(“最接近”,而不是“确切”)是一个名为“准备就绪…”的插件 。 还有其他类似的插件,如Command-T或FuzzyFinder 。

我使用CtrlP和我喜欢它,但我全心全意地支持你的决定“无插件”。 这并不是最简单的方法,但长远来看,这将会带来回报。


打开文件

打开文件的最基本的方法是:e /path/to/filename 。 谢天谢地,你得到了制表符和通配符:经典*和一个特殊的** ,代表“任何子目录”。

综合所有这些,你可以做到:

 :e **/*foo<Tab> 

从工作目录下的名字中select所有包含foo的文件,或者:

 :e **/*foo/*bar<Tab> 

在其名称中包含foo任何子目录下,在工作目录下的任意位置,select名称中包含bar所有文件。

当然,这适用于:tabe[dit] :sp[lit]:vs[plit]

但是这些命令仅限于一个文件。 使用:next打开多个文件:

 :next **/*.js 

并看看:help arglist


在缓冲区之间跳转

:b[uffer]是基本的缓冲切换命令:

 :b4 " switch to buffer number 4 :bn " switch to next buffer in the buffer list :bp " switch to previous buffer in the buffer list :bf " switch to first buffer in the buffer list :bl " switch to last buffer in the buffer list :b foo<Tab> " switch by buffer name with tab-completion :b# " switch to the alternate file 

请注意,许多这些命令及其亲属接受一个计数。

:ls命令显示加载的缓冲区列表。 这有点“特殊”,但是:创build缓冲区时会分配一个数字,所以如果您删除缓冲区,您可以拥有一个类似于1 2 5的列表。 这有点尴尬,是的,这使得切换到一个缓冲区的数量有点太麻烦了。 优先使用部分名称进行切换:b foo<Tab>或循环, :bn :bp

无论如何,这是一个很酷的映射,列出所有加载的缓冲区并为您填充提示符,等待您input缓冲区的编号并按<enter>

 nnoremap gb :ls<CR>:b<Space> 

有了这个映射,切换到另一个缓冲区就像下面这样简单:

 gb (quickly scanning the list) 3<CR> 

要么:

 gb (quickly scanning the list) foo<tab><CR> 

这个想法来源于这个来自百瑞Vim图表集合的图像:

飞与骑自行车

Vim在某些键盘上也有<C-^> (或<C-6> ) – 正常模式相当于:b# – 在当前缓冲区和前一个缓冲区之间跳转。 如果经常在两个缓冲区之间切换,请使用它。

阅读有关缓冲区的所有信息:help buffers


去声明

在一个文件中,你可以使用gdgD

在一个项目中,Vim的“标签”function是你的朋友,但你需要一个外部代码索引器,如ctags或cscope。 最基本的命令是:tag foo<C-]>光标放在方法名上。 这两个工具都很好地集成到Vim中:请参阅:help tags :help ctags:help cscope

为了什么是值得的,我广泛使用标签导航在一个项目中移动(主要使用CtrlP :CtrlPTag:CtrlPBufTag命令,但大多数是内置的),我最喜欢的“通用”缓冲区切换方法是名字。


部署你的configuration

许多Vim用户将他们的configuration放在版本控制之下,这使得在新机器上安装你自己的configuration非常快捷。 想想看。


编辑

几个月前,我不得不使用Vim过时的远程机器。 我可以安装一个合适的Vim并克隆我自己喜欢的configuration,但我决定这次为了“磨锯”而行驶。 我很快build立了一个极简主义的.vimrc并重新访问了几个被遗忘的原生特征。 在那之后,我决定了CtrlP并没有那么必要,并且摆脱了它:本地特性和自定义映射并不像性感,但是他们完成了这个工作,没有太多依赖。


与文件杂耍

 set path=.,** nnoremap <leader>f :find * nnoremap <leader>s :sfind * nnoremap <leader>v :vert sfind * nnoremap <leader>t :tabfind * 

:find只要你正确set path :find一个真正伟大的命令。 用我的设置, ,ffoo<Tab>会recursion地在当前目录下find所有包含foo的文件。 它快速,直观,轻便。 当然,我可以从:edit和朋友那里得到相同的完成和通配符。

为了使这个过程更快,下面的映射允许我跳过项目的整个部分,并在当前文件的目录下recursion地查找文件:

 nnoremap <leader>F :find <CR>=expand('%:h').'/*'<CR> nnoremap <leader>S :sfind <CR>=expand('%:h').'/*'<CR> nnoremap <leader>V :vert sfind <CR>=expand('%:h').'/*'<CR> nnoremap <leader>T :tabfind <CR>=expand('%:h').'/*'<CR> 

警告! path选项非常强大。 上面的值.,**为我工作,但我使用的语言没有标准的库。 适当的价值完全取决于你的需求。


玩弄缓冲区

 set wildcharm=<Cz> nnoremap <leader>b :buffer <Cz><S-Tab> nnoremap <leader>B :sbuffer <Cz><S-Tab> 

上面的映射列出了“wildmenu”中的可用缓冲区,提示为空,允许我使用<Tab>导航菜单或再次键入几个字母和<Tab>以缩小列表的范围。 就像上面的文件映射一样,这个过程很快,几乎没有摩擦。

 nnoremap <PageUp> :bprevious<CR> nnoremap <PageDown> :bnext<CR> 

这些映射说明了一切。


与标签杂耍

 nnoremap <leader>j :tjump / 

这个映射使用正则expression式search,而不是整个词search,所以我可以做,jba<Tab>find标签foobarbaz()

是的,模糊匹配是令人上瘾的,但是如果没有它,你也可以同样高效。 而成本的一小部分。


更多编辑

一些额外的提示/技巧…


Wildmenu选项

使用set wildmenu启用的“wildmenu”使文件/缓冲区导航更容易。 它的行为受到一系列值得研究的选项的支配:

wildmode告诉Vim如何让“wildmenu”performance出来:

 set wildmode=list:full 

wildignore过滤掉所有的cruft:

 set wildignore=*.swp,*.bak set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.* set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/* set wildignore+=tags set wildignore+=*.tar.* 

wildignorecase允许您searchfoo并findFoo

 set wildignorecase 

文件标记

 augroup VIMRC autocmd! autocmd BufLeave *.css normal! mC autocmd BufLeave *.html normal! mH autocmd BufLeave *.js normal! mJ autocmd BufLeave *.php normal! mP augroup END 

我最近在其他人的~/.vimrcfind了这个gem。 无论何时离开缓冲区,它都会在游标的确切位置创build文件标记,以便无论您身在何处,都会跳转到您编辑的最新JavaScript缓冲区。 真棒。

答案很大程度上取决于你的喜好和情况。 一些例子:

  • 如果主要是两个文件(例如C头文件和实现文件), <C-^>非常方便。 一般来说, 备用文件是一个重要的概念。
  • 如果你使用一个大的编辑器窗口,那么window :split就会导致定位窗口的问题(一旦你打开了所有的缓冲区)。 你可以用[N]<Cw><Cw>快速切换到它。
  • 如果你能记住(less数)缓冲区号,那么:[N]b[uffer]:[N]sb[uffer]命令是非常方便的。 :ls告诉你数字。

插件(或至less是自定义映射)可以改善很多事情,关于vim.org的这个话题有很多种。 有各种机制来分发你的configuration(Pathogen + GitHub,Dropbox,…),或者你可以通过Vim附带的netrw插件远程编辑服务器文件。

您可以在命令行上完成通配符选项卡的完成,而无需任何插件。 例如

 :e src/**/foo*<tab> 

将允许您遍历./src下的目录树中以“foo”开头的所有文件,并select要编辑的文件。

如果你已经编辑了文件,它仍然在一个缓冲区,那么你可以切换到它:

 :b foo<tab> 

它将在path中循环遍历所有的“foo”缓冲区。 您可能需要设置wildmode和wildmenu选项才能获得所需的行为。 我有

 wildmode=longest:full wildmenu 

在我的.vimrc。

有时,依次浏览一系列文件也是很方便的(例如,如果你做了一些类似vim *.php文件,一次打开几个文件)。 然后,您可以使用:n[ext] (以及:prev[ious] :fir[st]:la[st] )进行导航(除了其他答案中的build议外)。

如果你在一个文件名,并想跳转到该文件, gf会为你做。 我也喜欢使用ctags ,这不是一个插件; 你只是build立标签,可以轻松地跳过你的代码库。

如果你想在vim编辑器中切换文件,请看下面的答案

首先按Esc键退出编辑模式。

然后键入:e来检查当前的文件path。

如果你想去另一个文件,然后input:e /path-of-file.txt/使用这个,你可以切换。

如果你想去以前的文件,只需input:e#切换到以前的文件path。