Vim文件导航


90

在最近几年使用TextMate之后,我正在努力学习vim。

我已经开始将一些文件内导航提交到内存,但是我正努力在多个文件之间导航。

在我的工作流程中,我经常会定期在几个文件之间切换(足够多的文件,以至于拆分窗格的窗口变得太小)。

我目前正在使用NERDTree,但发现钻取到目录很麻烦,并且经常使用CTRL+ W h/ CTRL+W l来回跳动。

我认为我可以在选项卡之间做得更好,因为我可以轻松地在这些选项卡之间进行切换,但是也许我需要使用其他工作流程。

我还想要一个“转到文件...”快捷键,例如TextMate中的CMD+ T。我已经找到了,fuzzy_file_finder但是它要求vim必须使用Ruby绑定来构建,而不是我从事的本机安装。

尽管我可以重建,但我想切换到vim的主要原因是,我可以拥有一个可以轻松在任何平台上工作的编辑器环境。

那里的选择不胜枚举,不胜感激!


1
我还没有找到一种非常令人满意的导航文件和缓冲区的方法,根本没有使用任何外部工具。内置的东西非常糟糕(我是说,要根据其编号更改为缓冲区?谁会记住临时缓冲区编号...)
Svend

1
@svend:您可以通过名称和编号来引用缓冲区-请参阅下面的答案
Dave Kirby 2010年

Answers:


92

:e考虑到制表符补全的合理配置,我发现通过普通的旧方法钻入子目录并不麻烦。

查看'wildmenu'选项,使Vim在命令行上方的Modeline中显示补全列表(文件名)。您可以更改'wildmode'选项以进一步配置Vim将使用的制表符完成类型。

我个人使用:set wildmode=full

我的工作流程是这样的:

  1. :cd 进入我项目的顶层目录。
  2. 打开文件foo/bar/baz

    • 最简单的情况:输入:e f<tab>b<tab>b<tab><enter>

    • 如果b在这些目录中的一个目录中有多个文件开头,那么您可能需要在键盘上进行一个<left><right>多个操作<tab>才能在它们之间跳转(或输入更多字母来消除歧义)。

    • 最坏的情况是,文件和目录共享一个名称,您需要深入查看该目录。在这种情况下,使用Tab键填写目录名称,然后键入*<tab>以进行向下钻取。

  3. 打开2或3个窗口,并根据需要在所有窗口中打开文件。
  4. 在缓冲区中打开文件后,请勿终止缓冲区。打开新文件时,使其在后台保持打开状态。:e在同一窗口中只是一个新文件。
  5. 然后,用于:b <tab>循环浏览后台已打开的缓冲区。如果键入:b foo<tab>,它将仅与匹配的当前打开文件匹配foo

我还使用这些映射使打开新窗口和在它们之间跳转变得更加容易,因为我经常这样做。

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

打开Vim,设置一些窗口并在其中打开一些文件只需要几秒钟的时间。就我个人而言,我从未发现任何第三方文件浏览脚本都非常有用。


4
尖顶帽子,非常棒。您已经必须要理解技巧,才能熟练掌握skillz ++。
鲍丹先生2014年

256

浏览文件系统的一种简单方法是以下命令:

:Sex

我没有弥补:)


14
从帮助中我发现:Vex也很棒。
jrwren 2012年

15
共有69个投票。我不认为我有改变的心。
AlbeyAmakiir 2014年

3
:Vex如果你想水平垂直,而不是分割屏幕
sreenivas

1
哇,这些都不知道。我发现:Vex更实用,但:Sex让我过得很愉快。
威廉·罗伯逊,

2
作为记录,:Se也可以使用(与Ve, Te变体相同)。无需使其变得怪异:)
towc

46

:Sex:Vex:Tex:Ex对于前所有有用的命令(ploring)系统上的文件,如果你想使用的东西不同:e

(其中S/V/TSplit / Vertical / Tab的缩写)


7

如果尚未找到它们,则可能要签出:

  • 原始的模糊查找器插件-IIRC没有Ruby绑定问题
  • 项目插件-类似于NERDTree
  • 缓冲区资源管理器插件-显示打开的缓冲区列表

还请记住,您可以在.vimrc中重新映射按键快捷方式,以减少繁琐的操作。我确实经常使用分割窗口。我发现以下内容使处理它们变得更加容易:

" set your own personal modifier key to something handy
let mapleader = "," 

" use ,v to make a new vertical split, ,s for horiz, ,x to close a split
noremap <leader>v <c-w>v<c-w>l
noremap <leader>s <c-w>s<c-w>j
noremap <leader>x <c-w>c

" use ctrl-h/j/k/l to switch between splits
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h

5

我想我可以轻松地在选项卡之间切换来做得更好,但是也许我需要使用其他工作流程。

您知道Vim的标签吗?不知道您是在指的是Vim自己的标签,还是在钉住TextMate的标签。目前还不清楚您使用的是哪个Vim版本,但是至少从7.0起它就带有选项卡(我最近看过的地方似乎都安装了该选项卡),而且它们很棒。

:tabe打开一个新标签(“标签编辑”的缩写,例如:tabe,空白或:tabe path/to/file在新标签中打开文件),您可以使用gt/在相邻标签之间移动gT,并且还有很多其他与标签相关的nav命令,例如您可能会对Vim(:help tabs)有所期待

我在大型项目中的工作流程往往涉及很多选项卡,每个选项卡具有1至3个窗口,具体取决于我需要的上下文类型。如果我有一个双倍宽的终端窗口,这会更好,因为我可以用垂直拆分:vs,因此一个选项卡可以轻松地一次为我显示4个文件,每个文件都有足够的空间。

最后提示:我有时会使用“切换缓冲区”命令(:sb <partial_buf_name>),有点像TM的模糊查找,因为它工作得很好,但仅适用于已打开的缓冲区。当我一次打开多个文件时,还是很棒的。(注意,我需要:set switchbuf=usetab在vimrc中使它跨选项卡工作,但是一旦设置好,就很棒了。)


1
我的标签的理解是,它更是一个布局保护者,而不是真的有在每个标签一个缓冲区中打开(看看布拉姆Molenaars自己的看法上的视频标签“7个习惯有效的文本编辑”的方法。
斯文·

然后,一旦找到适合您的命令,就可以将它们绑定到键上。我有打开缓冲区之间的控制选项卡翻转(la firefox),但是您可以改为切换选项卡。
乔纳森·哈特利2009年

vim-titlecase带有gt / gT映射的螺钉,但是有一种解决方法
naught101 '18

5

我发现LustyExplorer是迄今为止最好的。

您可以通过仅键入文件名称的一部分来打开文件。

您可以从当前文件的目录或currentpwd或缓冲区列表中打开文件。

如果从缓冲区列表中打开文件,则不必在目录树中导航,尽管不幸的是,对于其他两种模式,仍必须在树中导航。好消息是您不必从第一个字符开始。

如果你有:

dir_a/
    ...
dir_b/
    file.js
    file.html

而您想打开dir_b/file.html,通常可以通过键入b<Tab>h


我对这个很棒的插件做了一些扩展。svendtofte.com/wp-content/uploads/2009/08/…svendtofte.com/other/vim-stuff 基本上 ,我可以输入最近使用过的文件的名称,无论是否已加载都无关紧要。这意味着您仅在首次打开文件时才需要浏览FS。
Svend

4

令人惊讶的是,:find在任何答案中都没有提到命令。我通常在Rails项目中工作,需要深入到目录层次结构中。因此,对于一个文件application.cssapp/assets/stylesheets/我只需要输入is :find applica,然后按Tab键自动完成并输入即可打开。


3

出插件ctrlp来替代Command-T插件。比它更好的是,它是一个“本机”的Vim脚本,并且不需要运行ruby(或其他支持)来编译Vim,而它却运行非常迅速且不引人注目。


2

如果所需文件已经加载到缓冲区中(如果您定期在几个文件之间进行切换,则很有可能),则可以使用:b[uffer]命令快速切换到缓冲区。

:b可以将缓冲区号作为参数,或者(更有用的是)与路径/文件名的一部分匹配的字符串。如果有多个匹配项,则可以使用Tab键在它们之间循环。

如果要拆分窗口并在新窗口中打开缓冲区,请使用 :sb name

如果要在新选项卡中打开缓冲区,请使用 :tab b name

您也可以使用该:ls命令查看当前已加载缓冲区的列表。


1

我使用此功能在子目录中查找文件,尽管我没有写。来自vim Wiki

功能!查找(姓名)
    让l:list = system(“ find。-name'..a:name。”'| grep -v \“。svn / \” | perl -ne'print \“ $。\\ t $ _ \”' ”) 
    让l:num = strlen(substitute(l:list,“ [^ \ n]”,“”,“ g”)) 
    如果l:num 0 
            回声“不是数字” 
            返回 
        万一 
        如果l:inputl:num 
            回声“超出范围” 
            返回 
        万一 
        让l:line = matchstr(“ \ n” .l:list,“ \ n” .l:input。“ \ t [^ \ n] *”) 
    其他 
      让l:line = l:list 
    万一 
    让l:line = substitute(l:line,“ ^ [^ \ t] * \ t。/”,“”,“”) 
    执行“:e” .l:line 
终端功能 

命令!-nargs = 1查找:call查找(“”)

我喜欢的一件事是它支持通配符(*)。多场比赛表现也不错。


1

除了wildmenu答案外,我还使用BufExplorer插件和以下映射来快速跳转缓冲区:

nmap <A-1> :b 1<CR>
nmap <A-2> :b 2<CR>
nmap <A-3> :b 3<CR>
...
nmap <A-0> :b 10<CR>
nmap <A-=> \bs

或者,您可以仅使用:ls命令替换缓冲区浏览器,该命令基本上显示相同的内容。

最后一个映射到Alt-=以显示缓冲区浏览器。

我使用的不是Windows,因为我通常只有一个或两个窗口。

我还修改了,statusline以包含缓冲区号%2n,这样我就始终知道正在编辑哪个缓冲区。看到:h statusline




0

这是我坚持的一项相当琐碎的事情.vimrc。它将从任何子目录加载文件。

" load from an unspecified subdirectory 
function! LoadFromSubdirectory(filespec) 
  let filename = glob("`find . -name '" . a:filespec . "' -print`") 
  exe ':e '.filename 
endfunction 
:command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 

所以我只能说:

:Er Main.java

它将搜索子目录,找到Main.java并加载它。对于同名的多个文件,它的行为不太好,但是它既快速又简单。

我使用的另一个工具是VTreeExplorer,它提供了一个基于树的文件/目录窗口,并且不需要VIM的任何特殊构建选项(即,它是一个香草插件)。


我希望能够从子目录加载,但是多文件问题对我来说是个大问题。我是一个Django开发人员,所以我通常有一堆子目录,它们有一个models.pyviews.py
皮特

0

我查找文件的工作流程是wildmenu,autocwd和:e

相关部分.vimrc

set wildmenu
set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
set wildmode=list:full
set autochdir
let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'

以及如何使用它:

:e myf^D

这样就给出了当前目录中所有以myf开头的文件。您也可以<Tab>通过它们。使用return打开:)

^D将始终为您提供所有匹配项。因为autocmd总是转到当前文件的文件夹,所以使用起来很容易。如果您进入foo/bar.py并且只想去,foo/baz.py那么:e baz.py您就在那里。这也适用于缓冲区(:b foo^D列出以foo开头的所有缓冲区)


如何进入其他目录?例如,我经常在我的Python视图,HTML模板和JavaScript文件之间工作,这些文件都位于不同的子目录中?在TextMate中,我开始输入文件名,然后显示“项目”(aka cwd)中的所有匹配项。
皮特

它不会递归到子文件夹中,不会。但是我为此调整了工作流程。同样,一旦我打开文件,我就可以提及缓冲区的名称了。您可以告诉Vim记住打开的缓冲区,那么通常根本不需要该功能。
Armin Ronacher
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.