vim, switching between files rapidly using vanilla Vim (no plugins)

I understand that limiting myself to vanilla Vim (not using plugins) limits the power of the editor, but as I switch between different machines frequently, it is often too much trouble to move my environment around everywhere. I want to just stay in vanilla Vim.

Something that holds me back is the ability to quickly switch between files. I (believe at least) have a good understanding of buffers, windows, tabs, as well as netrw (Vex, Ex, etc).

But in an editor such as Sublime Text, I can just type ctrl-p and instantly I am at the file.

I know that I can drop down to the shell, but I wonder if there are any other "hidden" secrets to rapidly switching between files in Vim based off more than just the filename.

40166 次浏览

答案在很大程度上取决于你的偏好和环境,例如:

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

Plugins (or at least custom mappings) can improve things a lot, and there's a whole variety on this topic on Vim.org. There are various mechanisms to distribute your config (Pathogen + GitHub, Dropbox, ...), or you could remotely edit server files through the 新闻 plugin that ships with Vim.

If you are on a filename and want to jump to that file, gf will do it for you. I also like using ctags, which isn't a plugin; you just build the tags and can easily jump around your codebase.

与 ST2的 Ctrl + P最接近的等价物(“最接近”,而不是“精确”)是一个名为,get ready... CtrlP的插件。还有其他类似的插件,如 命令 TFuzzyFinder

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


打开文件

打开文件最基本的方法是 :e /path/to/filename。值得庆幸的是,您可以获得 tab 补全和通配符: 经典的 *和一个特殊的 **,它代表“任何子目录”。

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

:e **/*foo<Tab>

从工作目录下所有以他们的名字命名的包含 foo的文件中选择或:

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

从所有包含 bar的文件中选择它们名称中的任何子目录中包含 foo的文件,在工作目录下的任何地方。

当然,这也适用于 :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命令向您显示加载的缓冲区列表。不过它有点“特殊”: 缓冲区在创建时被分配了一个数字,因此如果删除缓冲区,您可以拥有一个类似于 1 2 5的列表。这是有点尴尬,是的,这使切换到缓冲区的数字有点麻烦。喜欢通过部分名称,:b foo<Tab>或循环,:bn :bp切换。

无论如何,这里有一个很酷的映射,它列出了所有加载的缓冲区并为您填充提示符,等待您键入缓冲区的数字并按 <enter>:

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

使用这种映射,切换到另一个缓冲区的过程非常简单:

gb
(quickly scanning the list)
3<CR>

或:

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

这个想法来自于这张图片 taken from Bairui's collection of Vim infographics:

Flying vs cycling

Vim 还有 <C-^>(或某些键盘上的 <C-6>)ーー相当于 :b#的普通模式ーー可以在当前缓冲区和前一个缓冲区之间跳转。如果经常在两个缓冲区之间交替使用,请使用它。

阅读 :help buffers中有关缓冲区的所有内容。


进入申报程序

Within a file, you can use gd or gD.

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

值得一提的是,我广泛使用标记导航来在项目中移动(主要使用 CtrlP 的 :CtrlPTag:CtrlPBufTag命令,但也使用内置命令) ,我最喜欢的“通用”缓冲区切换方法是按名称切换。


部署配置

许多 Vim 用户将他们的配置置于版本控制之下,这使得在新机器上安装自己的配置 非常变得又快又容易。好好想想。


剪辑

几个月前,我不得不用一台过时的 Vim 远程机器工作。我本可以安装一个合适的 Vim,并克隆我自己喜欢的配置,但我决定轻装上阵,这一次,为了“磨利锯子”。我迅速构建了一个极简主义的 .vimrc,并重新访问了一些被遗忘了一半的本地特性。在那次演出之后,我认为 CtrlP 没有那么必要,于是我放弃了它: 本地特性和自定义映射没有那么吸引人,但它们可以在没有太多依赖性的情况下完成工作。


整理文件

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

:find是一个真正伟大的命令,只要你 set path正确。使用我的设置,,ffoo<Tab>将递归地在工作目录下找到所有包含 foo的文件。它速度快,直观,重量轻。当然,我受益于与 :edit和朋友相同的完成和通配符。

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

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

警告!path选项是强大的 非常。以上值ーー .,**ーー工程 为了我作为默认的备用值。在现实世界中,这个选项的确切价值因项目/语言/框架/工作流程不同而不同,所以 proper的价值完全取决于 你的的需求。不要盲目地照搬这句话,期望它能解决你所有的问题。


玩弄缓冲

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

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

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

那些地图说明了一切。


用标签玩杂耍

nnoremap <leader>j :tjump /

这个映射使用 regex 搜索而不是整个单词搜索,因此我可以使用 ,jba<Tab>来查找标记 foobarbaz()

是的,模糊匹配会让人上瘾,但是没有它,你也可以一样有效率。而且只花了很少的钱。


更多编辑

还有一些小窍门。


通配菜单选项

The "wildmenu", enabled with set wildmenu, makes file/buffer navigation easier. Its behavior is governed by a bunch of options that are worth investigating:

wildmode告诉 Vim 您希望“通配菜单”如何运行:

set wildmode=list:full

wildignore过滤掉所有的残渣:

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允许你搜索 foo并找到 Foo:

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

我最近在别人的 ~/.vimrc里发现了这个宝石。每当您离开缓冲区时,它都会在光标的确切位置创建一个文件标记,这样,无论您在哪里,'J都会跳转到您编辑的最新 JavaScript 缓冲区。太棒了。

You can do wildcard tab completion on the command line without any plugins. e.g.

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

将让您循环通过所有的文件开始’foo’在目录树下。/src 并选择要编辑的内容。

If you have already edited the file and it is still in a buffer then you can switch to it with:

:b foo<tab>

它将循环访问路径中包含“ foo”的所有缓冲区。 You may need to set the wildmode and wildmenu options to get the behaviour you want. I have

wildmode=longest:full
wildmenu

在我的 Vimrc 里。

有时顺序浏览一个文件列表也很方便(例如,如果您执行类似 vim *.php的操作以便同时打开多个文件)。然后您可以使用 :n[ext](以及 :prev[ious]:fir[st]:la[st])进行导航(除了其他答案中建议的内容之外)。

If you want switch between files in vim editor, please see below answer

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

然后键入 :e检查当前文件路径。

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

如果你想去以前的文件只是键入 :e#切换到以前的文件路径。

我和 Vim 也有同样的问题。

我最不想做的事情就是依赖插件完成像文件切换这样普通的任务。

我在 .vimrc中添加了以下代码行

set path+=**
set wildmenu

现在,只要 vim 在项目的根目录中,我就可以使用 :find any/filename/in/any/folder/

Once files are opened already, and there are a ton of buffers in the background (you could use :ls to see all buffers), running :b any/file <TAB> will fuzzy search for all buffers and jumps to the required file. In case it is not unique there will be a 通配菜单 of tabs (hence the 2nd line in .vimrc) which can be selected using tab.

我的答案来自于这个精彩的视频
Https://www.youtube.com/watch?v=xa2wjjbmmom&feature=youtu.be&t=489
里面有更多的小技巧,我推荐你们去看看。