2009-09-18 82 views
64

过去几年使用TextMate后,我很努力学习vim。Vim文件导航

我已经开始将一些文件内导航提交到内存,但我很难在多个文件之间进行导航。

在我的工作流程中,很常见的是我经常在少量文件之间翻转(足够的文件,例如分割窗格窗口变得太小)。

我目前使用NERDTree却发现向下钻取目录繁琐以及不断利用CTRL +W¯¯^h/CTRL +W¯¯升跳来回。

我认为我会做更好的选项卡我可以轻松切换,但也许我需要使用不同的工作流程。

我还像一个 “转到文件...” 快捷方式一样CMD + 牛逼在TextMate中。我发现了fuzzy_file_finder,但它需要使用Ruby绑定来构建vim,而不是我在其中进行的本地安装。

虽然我可能重建我想切换到vim的主要原因是,我可以有一个编辑器环境,我知道可以很容易地在任何平台上工作。

在那里的选项是压倒性的任何想法非常感谢!

+1

我还没有找到真正令人满意的导航文件和缓冲区的方法,它根本不使用外部辅助。内置的东西是非常糟糕的(我的意思是,通过它的编号更改为缓冲区?谁记得临时缓冲区编号......) – Svend 2009-09-20 14:11:17

+1

@svend:您可以通过名称和编号引用缓冲区 - 请参阅下面的答案 – 2010-03-05 08:11:07

回答

72

我没有发现通过简单的旧:e深入到子目录,因为一个体面的配置为制表符完成繁琐。

查看'wildmenu'选项,让Vim在命令行上方的模式行中显示完成列表(文件名)。您可以更改'wildmode'选项以进一步配置Vim将执行的制表符完成类型。我个人使用:set wildmode=full

我的工作流程是这样的:

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

    • 简单的场景:类型:e f<tab>b<tab>b<tab><enter>

    • 如果有一个以上的文件在这些目录中的一个开始b你可能要做一个<left><right>或其他<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,设立一些窗口并在其中打开几个文件。就我个人而言,我从来没有发现任何第三方文件浏览脚本非常有用。

+2

哦。我的。神。先生;谢谢。 – 2013-02-28 22:51:17

+3

真棒完美的帽子尖端。对于skillz ++来说,你已经需要了解这个补充。 – 2014-06-28 20:34:33

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

这样我就可以说:

:呃Main.java

,它会搜索子目录,找到Main.java并加载它。它对于同名多个文件的表现不佳,但它很快且简单。

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

+0

我希望能够从一个子目录加载,但多个文件问题对我来说会是一个难题。我是一个Django开发人员,所以我通常有一堆子目录,它们都有'models.py','views.py'等。 – Pete 2009-09-18 18:13:51

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>。使用返回打开:)

^D将永远给你所有的比赛。由于autocmd总是进入当前文件的文件夹,因此很容易处理。如果你在foo/bar.py,你想去foo/baz.py你只有:e baz.py,你在那里。这也与缓冲工作(:b foo^D列表以foo开头的所有缓冲区)

+0

如何访问其他目录?例如,我经常在我的Python视图,HTML模板和JavaScript文件之间工作,这些文件都位于不同的子目录中?在TextMate中,我开始输入文件的名称,并在我的“项目”(又名cwd)中显示所有匹配项。 – Pete 2009-09-18 18:12:00

+0

它不递归到子文件夹中,没有。但我已将我的工作流程适应了这一点此外,一旦我打开的文件,我只能提及缓冲区的名称,并很好。您可以告诉Vim记住打开的缓冲区,然后通常根本不需要该功能。 – 2009-09-18 18:29:06

4

我想我会用我的标签可以 轻松之间切换做的更好,但也许我 需要使用不同的工作流程。

您是否知道Vim的选项卡?不知道你是否指的是Vim自己的选项卡,或者是争取TextMate的。目前还不清楚你使用的Vim版本是什么,但它至少有7.0版本(这似乎安装在我最近看的任何地方),而且它们很棒。

:tabe打开一个新的(以下简称“选项卡编辑”,为空的,所以如:tabe:tabe path/to/file在新标签中打开一个文件),你可以用gt/gT相邻标签之间移动,并有一堆其它选项卡相关的导航命令也一样,你可能会在Vim(:help tabs

我的工作流预期的大项目往往涉及一堆标签,每个取决于我需要什么样的背景下的窗口1和3之间。如果我有一个双倍宽度的终端窗口,这可以更好地工作,因为我可以使用:vs进行垂直分割,所以一个标签可以很容易地向我显示4个文件,并且每个文件都有足够的空间。最后的提示:我有时使用“switch buffer”命令(:sb <partial_buf_name>),这种命令类似于TM的模糊发现,因为它工作得很好,但只适用于已经打开的缓冲区。当我一次打开十几个或更多文件时仍然非常棒。 (N.B.我需要:set switchbuf=usetab在我的vimrc中可以跨越标签工作,但是一旦设置好就好了)。

+1

我对标签的理解是,它更像是一个布局保护程序,并不是真正的在每个标签中打开一个缓冲区的方法(查看Bram Molenaars在视频中的标签中自己的看法“7有效文本编辑的习惯”。 – Svend 2009-09-20 14:08:56

+0

然后一次你已经想出了这些适合你的命令,你可以将它们绑定到一个键上,我在打开的缓冲区(la firefox)之间有一个控制选项卡翻转,但是你可以切换选项卡 – 2009-11-07 10:56:00

5

我发现LustyExplorer是目前为止最好的。

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

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

如果你从缓冲区列表中打开一个文件,你不必浏览目录树,但不幸的是对于其他两种模式,你仍然需要浏览树。好的是你不必从第一个角色开始。

如果您有:

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

,并要打开dir_b/file.html你通常可以通过键入

+0

我对此做了一些扩展awesome addon。 http://www.svendtofte.com/wp-content/uploads/2009/08/lusty-explorer-mod.vim http://www.svendtofte.com/other/vim-stuff/ Basicly允许我输入最近使用的文件的名称,不管它已经加载或不加载都不重要。这意味着您只需要在第一次打开文件时浏览FS。 – Svend 2009-09-20 14:07:29

6

找到它,如果你还没有找到它们了,你可能想看看:

  • fuzzy finder插件 - 这就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 
+0

http://github.com/jamis/fuzzyfinder_textmate更好 – aehlke 2010-02-08 21:29:43

1

我用这个函数来查找子目录中的文件,我没有写它。这是从vim wiki

 
function! Find(name) 
    let l:list=system("find . -name '".a:name."' | grep -v \".svn/\" | perl -ne 'print \"$.\\t$_\"'") 
    let l:num=strlen(substitute(l:list, "[^\n]", "", "g")) 
    if l:num 0 
      echo "Not a number" 
      return 
     endif 
     if l:inputl:num 
      echo "Out of range" 
      return 
     endif 
     let l:line=matchstr("\n".l:list, "\n".l:input."\t[^\n]*") 
    else 
     let l:line=l:list 
    endif 
    let l:line=substitute(l:line, "^[^\t]*\t./", "", "") 
    execute ":e ".l:line 
endfunction 

command! -nargs=1 Find :call Find("") 

有一件事我喜欢的是它有支持通配符(*)。对于多场比赛它也表现良好。

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

183

一个简单的方法来浏览文件系统命令:

:Sex 

我不是做这件事:)

+53

+1性别让我的一天! :-) – 2010-03-05 08:18:16

+11

从帮助我看出:Vex也很棒。 – jrwren 2012-03-22 13:06:21

+1

:Sexplore ...哈! – Kasapo 2012-07-06 20:13:45

2

如果你想要的文件已经加载到一个缓冲区中(如果你经常在几个文件之间翻转),那么你可以用:b[uffer]命令快速切换到缓冲区。

:b可以乘坐缓冲器号作为参数,或(更有效)的字符串相匹配的路径/文件名的一部分。如果有多个匹配,您可以使用制表符在它们之间循环。

如果要分割窗口并打开新窗口的缓冲区,然后使用:sb name

如果你想打开一个新的标签缓冲区然后使用:tab b name

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

23

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

(其中S/V/T很短的分流/垂直/制表)

3

检查插件ctrlp作为替代插件Command-T。这比它更好,因为它是一个“原生”的Vim脚本,并且它不需要用ruby(或其他支持)编译Vim,而它运行速度非常快且不显眼。

2

这是令人惊讶地看到,:find命令还没有被任何答案提及。我通常使用rails项目,我需要深入了解目录层次结构。因此,对于文件application.css,位于app/assets/stylesheets/,我只需输入:find applica,然后按选项卡自动完成,并且输入即可打开。