我知道将自己限制在 vanilla Vim(不使用插件)会限制编辑器的功能,但是由于我经常在不同的机器之间切换,所以到处移动我的环境通常太麻烦了。我只想留在香草 Vim 中。
让我退缩的是能够在文件之间快速切换。我(至少相信)对 buffers、windows、tabs 以及 netrw(Vex
、Ex
, ETC)。
但在 Sublime Text 等编辑器中,我只需键入 ctrl-p 即可立即进入文件。
我知道我可以下拉到 shell,但我想知道是否还有其他“隐藏”的秘密可以在 Vim 中基于文件名之外的文件之间快速切换。
与 ST2 的 Ctrl+P 最接近的等价物(“最接近”,而不是“精确”)是一个名为的插件,请准备好... CtrlP。还有其他类似的插件,例如 Command-T 或 FuzzyFinder。
我使用 CtrlP 并且我喜欢它,但我全心全意地支持您选择“无插件”的决定。这不是最简单的方法,但从长远来看它会得到回报。
打开文件
打开文件的最基本方法是 :e /path/to/filename
。幸运的是,您获得了制表符补全和通配符:经典的 *
和一个特殊的 **
,它代表“任何子目录”。
结合所有这些,您可以执行以下操作:
: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:
https://2.bp.blogspot.com/-d1GaUBk-Y10/TyFhskmCYRI/AAAAAAAAARQ/CIEx1V7FLqg/s1600/vim-and-vigor-004-flying_is_faster_than_cycling.png
Vim 也有 <C-^>
(或某些键盘上的 <C-6>
)——相当于 :b#
的正常模式——在当前缓冲区和前一个缓冲区之间跳转。如果您经常在两个缓冲区之间交替使用它。
阅读 :help buffers
中有关缓冲区的所有内容。
前往申报
在文件中,您可以使用 gd
或 gD
。
在项目中,Vim 的“标签”功能是您的朋友,但您需要一个外部代码索引器,如 ctags 或 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 *
只要您正确地set path
,:find
就是一个非常棒的命令。使用我的设置,,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
选项非常强大。上面的值 - .,**
- 对我来说,作为默认的后备值。在现实世界中,选项的确切值会因项目/语言/框架/工作流程而异,因项目/语言/框架/工作流程而异,因此 正确 值完全取决于您的 em> 需要。不要盲目地复制那一行,并期望它能解决你所有的问题。
玩弄缓冲区
set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>
上面的映射列出了“wildmenu”中可用的缓冲区,提示为空,允许我使用 <Tab>
导航菜单或键入几个字母并再次 <Tab>
以缩小列表范围。就像上面的文件映射一样,这个过程很快而且几乎没有摩擦。
nnoremap <PageUp> :bprevious<CR>
nnoremap <PageDown> :bnext<CR>
这些映射不言自明。
玩弄标签
nnoremap <leader>j :tjump /
此映射使用正则表达式搜索而不是整个单词搜索,因此我可以执行 ,jba<Tab>
来查找标记 foobarbaz()
。
是的,模糊匹配会让人上瘾,但没有它你也可以同样高效。并且只需一小部分成本。
更多编辑
一些额外的提示/技巧……
野菜单选项
使用 set wildmenu
启用的“wildmenu”使文件/缓冲区导航更容易。它的行为受一系列值得研究的选项控制:
wildmode
告诉 Vim 你希望“wildmenu”如何表现:
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 缓冲区。惊人的。
答案在很大程度上取决于您的偏好和情况。一些例子:
如果它主要是两个文件(例如 C 头文件和实现文件),
如果你使用一个大的编辑器窗口,window :splits 将定位缓冲区的问题从定位窗口(一旦你打开了所有的缓冲区)。您可以使用 [N]
如果你能记住(几个)缓冲区编号,:[N]b[uffer] 和 :[N]sb[uffer] 命令非常方便; :ls 告诉你数字。
插件(或至少是自定义映射)可以大大改善事情,vim.org 上关于此主题的内容多种多样。有多种机制可以分发您的配置(Pathogen + GitHub、Dropbox、...),或者您可以通过 Vim 附带的 netrw 插件远程编辑服务器文件。
mA
存储标记 A
和 ````A``` 以返回。在了解了返回资源管理器的 :Rex
之后,我发现 netrw 更加有用。 :b
、:e
和许多其他可以使用通配符,如 *
和 **
。 :b
命令可以采用部分文件名。将它与 <c-d>
或 Wildmenu 结合起来,您可以走得更远。至于插件,你可以使用特定领域的东西,比如 rail.vim,它提供特定于 Rails 的导航命令,或者更通用的东西,比如 CtrlP。
有时,按顺序浏览文件列表也很方便(例如,如果您执行 vim *.php
之类的操作来一次打开多个文件)。然后,您可以使用 :n[ext]
(以及 :prev[ious]
、:fir[st]
和 :la[st]
)进行导航(除了其他答案中建议的内容)。
您可以在没有任何插件的情况下在命令行上完成通配符选项卡。例如
:e src/**/foo*<tab>
将让您循环浏览 ./src 下目录树中以 'foo' 开头的所有文件,然后选择要编辑的文件。
如果您已经编辑了文件并且它仍在缓冲区中,那么您可以使用以下命令切换到它:
:b foo<tab>
这将循环遍历路径中带有 'foo' 的所有缓冲区。您可能需要设置 wildmode 和 wildmenu 选项以获得您想要的行为。我有
wildmode=longest:full
wildmenu
在我的 .vimrc 中。
如果您想在 vim 编辑器中切换文件,请参阅下面的答案
首先按 Esc
键退出编辑模式。
然后键入 :e
以检查当前文件路径。
如果您想转到另一个文件,然后使用此输入 :e /path-of-file.txt/
您可以切换。
如果要转到上一个文件,只需键入 :e#
即可切换到上一个文件路径。
我对 Vim 也有同样的问题。
我想要的最后一件事是依赖插件来完成像文件切换这样平凡的任务。
我将以下行添加到 .vimrc
set path+=**
set wildmenu
还有 BAM!我现在可以:find any/filename/in/any/folder/
,只要 vim 在项目的根目录中。 选项卡完成工作。通配符有效!
一旦文件已经打开,并且后台有大量缓冲区(您可以使用 :ls
查看所有缓冲区),运行 :b any/file <TAB>
将模糊搜索所有缓冲区并跳转到所需文件。如果它不是唯一的,将有一个 wildmenu 选项卡(因此是 .vimrc 中的第二行),可以使用选项卡进行选择。
我的答案来自这个很棒的视频
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
里面有更多技巧,我建议观看它。
:e
结合使用的“任何子目录”,但从现在开始我会大量使用它。我对 Ctrl-P 所做的工作感到惊讶,并且可以从中学到很多东西,但它对我没有用。我发现它有点迟钝,因此在工作时打断了我的思路(可能是我的系统,我的设置,我自己,但我没有调查)gb
地图投票。另一个我会经常使用。我尝试过的所有缓冲区插件 (CtrlP, bufExplorer, ...) 都没有这个 快(当然,它们提供了更多功能,但不足以让我继续使用它们)< /i>。vim *.php
之类的操作来一次打开多个文件)。然后您可以使用:n[ext]
(以及:prev[ious]
、:fir[st]
和:la[st]
)。