113

我知道将自己限制在 vanilla Vim(不使用插件)会限制编辑器的功能,但是由于我经常在不同的机器之间切换,所以到处移动我的环境往往太麻烦了。我只想留在香草 Vim 中。

让我退缩的是能够在文件之间快速切换。我(至少相信)对bufferswindowstabs以及 netrw ( Vex,Ex等) 有很好的理解。

但是在诸如Sublime Text之类的编辑器中,我只需键入ctrl-p立即我就在文件中。

我知道我可以下拉到 shell,但我想知道是否还有其他“隐藏”的秘密可以在 Vim 中基于文件名之外的文件之间快速切换。

4

7 回答 7

265

与 ST2 的Ctrl+最接近的等价物(“最接近”,而不是“确切”)P是一个名为的插件,请准备好... CtrlP。还有其他类似的插件,例如Command-TFuzzyFinder

我使用 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>

这个想法来自这张取自 Bairui 收集的 Vim 信息图表的图片:

飞行与骑自行车

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

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


前往申报

在文件中,您可以使用gdgD

在项目中,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 *

: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选项非常强大。上面的值——<code>.,**——对我有用,作为默认的后备值。在现实世界中,选项的确切值会因项目/语言/框架/工作流程而异,因项目/语言/框架/工作流程而异,因此正确的值完全取决于您的需求。不要盲目地复制该行并期望它可以解决您的所有问题。


玩弄缓冲区

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>找到 tag foobarbaz()

是的,模糊匹配会让人上瘾,但没有它你也可以同样高效。并且只需一小部分成本。


更多编辑

一些额外的提示/技巧……</p>


野菜单选项

使用 启用的“wildmenu”set 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 缓冲区。惊人的。

于 2013-04-18T13:29:28.967 回答
5

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

于 2013-04-19T07:12:12.763 回答
5

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

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

插件(或至少自定义映射)可以改善很多事情,在vim.org上有各种各样的主题。有多种机制可以分发你的配置(Pathogen + GitHub,Dropbox,...),或者你可以通过Vim 附带的netrw插件远程编辑服务器文件。

于 2013-04-18T12:49:33.783 回答
4

您可以在没有任何插件的情况下在命令行上完成通配符选项卡。例如

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

将让您循环浏览 ./src 下目录树中以 'foo' 开头的所有文件,然后选择要编辑的文件。

如果您已经编辑了文件并且它仍在缓冲区中,那么您可以使用以下命令切换到它:

:b foo<tab>

这将循环遍历路径中带有 'foo' 的所有缓冲区。您可能需要设置 wildmode 和 wildmenu 选项以获得您想要的行为。我有

wildmode=longest:full
wildmenu

在我的 .vimrc 中。

于 2013-04-18T17:11:51.440 回答
2

如果您在一个文件名上并想跳转到该文件,gf将为您执行此操作。我也喜欢使用ctags,它不是插件;您只需构建标签,就可以轻松地在您的代码库中跳转。

于 2013-04-18T13:01:15.807 回答
1

我对 Vim 也有同样的问题。

我想要的最后一件事是依赖插件来完成像文件切换这样平凡的任务。

我添加了以下几行.vimrc

set path+=**
set wildmenu

还有 BAM!我现在:find any/filename/in/any/folder/只要 vim 在项目的根目录下就可以了。标签完成工作。通配符有效!

一旦文件已经打开,并且后台有大量缓冲区(您可以使用:ls查看所有缓冲区),运行:b any/file <TAB>将模糊搜索所有缓冲区并跳转到所需文件。如果它不是唯一的,将会有一个选项卡的通配菜单(因此是 .vimrc 中的第二行),可以使用选项卡进行选择。

我的答案来自这个很棒的视频
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
还有更多技巧,我建议您观看。

于 2019-09-14T19:21:37.610 回答
1

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

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

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

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

如果要转到上一个文件,只需键入:e#哪个切换到上一个文件路径。

于 2015-11-28T11:47:53.540 回答