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


103

我了解将自己限制在普通Vim(不使用插件)会限制编辑器的功能,但是当我频繁在不同的机器之间切换时,将环境移动到任何地方通常会很麻烦。我只想留在香草Vim中。

使我退缩的是能够在文件之间快速切换的能力。我(相信至少)有一个很好的理解缓冲区窗口标签,以及NETRW( ,VexEx等)。

但是,在Sublime Text之类的编辑器中,我只能键入ctrl- p立即进入该文件。

我知道我可以使用shell了,但是我想知道是否还有其他“隐藏的”秘密可以根据文件名而不是文件名在Vim中的文件之间进行快速切换。


2
这不会回答您的问题,但是可能会说服您考虑使用插件:dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood

我个人将设置与Dropbox同步。它很笨拙,但它或多或少地起作用而无需考虑它。我使用并知道的一个插件可以很好地用于您想要的Command-T(github.com/wincent/Command-T)。Ctrl-P可以替代(vim.org/scripts/script.php?script_id=3736)。
FX

1
您看过danielmiessler.com/study/vim吗?他非常聪明地将Vimrc +他需要的所有插件放到Github中……在他到的地方,他可以克隆它,瞧,Vim就是他喜欢的。辉煌
bobox

6
@bobox,成千上万的人这样做;没有什么特别的。
romainl 2014年

Answers:


236

与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选件功能非常强大。上面的值.,**- 对我有用但是我使用的语言没有标准库。在正确的价值完全取决于你的需求。


玩弄缓冲区

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()

是的,模糊匹配会让人上瘾,但如果没有它,您可能会同样高效。而且只花很少的钱。


更多编辑

一些其他提示/技巧…


Wildmenu选项

启用的“ 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缓冲区。太棒了


2
+1。我不知道结合使用“任何子目录”,:e但从现在开始我将大量使用它。我对Ctrl-P的工作感到惊讶,可以从中学到很多东西,但是对我来说不起作用。我发现它有点呆板,因此在工作时打断了我的思路(可能是我的系统,我的设置,我自己,但我没有调查)
Lieven Keersmaekers 2013年

2
**确实很棒。
romainl

1
我想再次投票推荐这张gb地图。另外一个我会用很多。我尝试过的所有缓冲区插件(CtrlP,bufExplorer等)都没有达到这个速度(当然,它们提供了更多功能,但不足以让我继续使用它们)
Lieven Keersmaekers 2013年

2
@LievenKeersmaekers,是我从那里得到的,是愚蠢的图片来自的地方。拜拜瑞!
romainl

4
这可能是有史以来最大的答案。
craigp 2015年

5

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

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

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


4
可能值得一提的是ctags,cscope,gtags,id和朋友。我发现使用大写标记非常有帮助。使用mA存储标记A和````A```返回。在了解了哪些返回给资源管理器之后,我发现netrw有用得多:Rex:b:e和其他许多人都可以使用通配符,如***。该:b命令可以使用部分文件名。将其与<c-d>或wildmenu 结合使用,您将获得更远的收益。至于插件,您可以使用特定于域的东西(例如rail.vim),它提供特定于Rails的导航命令,或者使用更通用的东西(例如CtrlP)。
彼得·林克

@PeterRincker:+1提及商标。我建议用标记构造答案。
Helbreder

<C-^>和[N] <Cw> <Cw>是什么意思?
Josh Desmond

5

有时依次浏览文件列表也很方便(例如,如果您想vim *.php一次打开多个文件)。然后你可以使用:n[ext](以及:prev[ious]:fir[st]:la[st])导航(除了什么在其他答案建议)。


4

您可以在命令行中完成通配符制表符,而无需任何插件。例如

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

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

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

:b foo<tab>

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

wildmode=longest:full
wildmenu

在我的.vimrc中。


2

如果您使用的是文件名,并且想跳到该文件,gf将为您完成。我也喜欢使用ctags,它不是一个插件。您只需构建标签即可轻松地在代码库中跳转。


1

如果要在vim编辑器中切换文件,请参见以下答案

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

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

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

如果要转到上一个文件,只需键入:e#切换到上一个文件路径的开关即可。


0

我对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
还有更多技巧,建议您观看。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.