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

时间:2013-04-18 12:28:58

标签: vim

我明白将自己限制在vanilla Vim(不使用插件)会限制编辑器的功能,但是当我经常在不同的机器之间切换时,在任何地方移动我的环境通常都会很麻烦。我想留在香草Vim。

阻碍我的是能够快速切换文件的能力。 我(至少相信)非常了解缓冲区 windows 标签,以及netrw(Vex,{ {1}}等)。

但是在Sublime Text之类的编辑器中,我只需输入 ctrl - p ,然后立刻就可以找到该文件了。

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

7 个答案:

答案 0 :(得分:205)

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

我使用CtrlP而且我喜欢它,但我全心全意地支持你决定去免费使用#34;。这不是最简单的方法,但从长远来看,它会得到回报。


打开文件

打开文件的最基本方法是: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命令显示已加载缓冲区的列表。它有点&#34;特殊&#34;但是:缓冲区在创建时会被分配一个数字,因此如果删除缓冲区,您可以拥有一个类似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中的所有缓冲区。


转到声明

在文件中,您可以使用gdgD

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

为了它的价值,我广泛使用标签导航在一个项目中移动(主要使用CtrlP&#39; s :CtrlPTag:CtrlPBufTag命令,但是buit-in我和我最喜欢的&#34;泛型&#34;缓冲切换方法是名称。


部署您的配置

许多Vim用户将其配置置于版本控制之下,这使得非常可以快速轻松地在新机器上安装您自己的配置。想一想。


<强> 修改

几个月前,我不得不在一台带有过时Vim的远程机器上工作。我本来可以安装一个合适的Vim并克隆了我自己心爱的配置,但是这次我决定轻装上阵,以便更好地使用锯子#34;。我很快建立了一个极简主义.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选项非常功能强大。上面的值 - .,** - 对我来说 ,但我使用的语言没有标准库。 正确的值完全取决于您的需求。


玩弄缓冲区

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

上面的映射列出了&#34; wildmenu&#34;中的可用缓冲区。如果出现空提示,请允许我使用<Tab>导航菜单,或者再次输入几个字母和<Tab>来缩小列表范围。与上面的文件映射一样,这个过程很快,几乎没有摩擦。

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

这些映射说明一切。


玩弄标签

nnoremap <leader>j :tjump /

此映射使用正则表达式搜索而不是全字搜索,因此我可以,jba<Tab>查找标记foobarbaz()

是的,模糊匹配会让人上瘾,但如果没有它,你就可以提高效率。并且只需花费一小部分费用。


更多编辑

一些额外的提示/技巧......


Wildmenu选项

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

wildmode告诉Vim你想要&#34; wildmenu&#34;表现:

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缓冲区。真棒。

答案 1 :(得分:5)

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

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

插件(或至少是自定义映射)可以改进很多东西,vim.org上有关于此主题的各种内容。有各种机制来分发您的配置(Pathogen + GitHub,Dropbox,...),或者您可以通过Vim附带的 netrw 插件远程编辑服务器文件。

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

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

将允许您循环遍历./src下目录树中以'foo'开头的所有文件,并选择您要编辑的文件。

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

:b foo<tab>

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

wildmode=longest:full
wildmenu

在我的.vimrc中。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

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

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

如果您想要转到另一个文件,请使用此键入:e /path-of-file.txt/,您可以切换。

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

答案 6 :(得分:0)

我对Vim也有同样的问题。

我最后想要做的就是依靠插件来完成像文件切换那样平凡的任务。

我在.vimrc

中添加了以下几行
set path+=**
set wildmenu

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

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

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