Vim文件导航

在过去的几年里,使用TextMate之后,我正在努力学习vim。

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

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

我目前使用NERDTree,但发现钻到目录繁琐,以及不断使用CTRL + W h / CTRL + W l来回跳。

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

我还想在TextMate中使用CMD + T这样的“Go to File …”快捷方式。 我发现了fuzzy_file_finder但是它需要使用Ruby绑定来构buildvim,而不是我正在使用的本地安装。

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

那里的选项是压倒一切的想法,非常感谢!

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

查看'wildmenu'选项让Vim在命令行上方的模式行中显示完成列表(文件名)。 你可以改变'wildmode'选项来进一步configurationVim将做的tab完成。

我个人使用:set wildmode=full

我的工作stream程是这样的:

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

    • 最简单的scheme:input:e f<tab>b<tab>b<tab><enter>

    • 如果在这些目录之一中有一个以b开头的文件,则可能需要在键盘上执行<left><right>或另一个<tab>键以在它们之间跳转(或者再input几个字母来消除歧义) 。

    • 最糟糕的情况是有文件和目录共享一个名字,你需要深入目录。 在这种情况下,制表符完成目录名称,然后键入*<tab>进行深入分析。

  3. 打开2或3个窗口,根据需要打开所有文件。
  4. 一旦文件在缓冲区中打开,请不要终止缓冲区。 打开新文件时,请在后台打开它。 只需:e在同一个窗口中新build一个文件。
  5. 然后,使用:b <tab>来循环已经在后台打开的缓冲区。 如果input:b foo<tab>它只会匹配与foo匹配的当前打开的文件。

我也使用这些映射来更容易地打开新窗口并在它们之间跳转,因为这是我经常这样做的。

 " Window movements; I do this often enough to warrant using up M-arrows on this" nnoremap <M-Right> <CW><Right> nnoremap <M-Left> <CW><Left> nnoremap <M-Up> <CW><Up> nnoremap <M-Down> <CW><Down> " Open window below instead of above" nnoremap <CW>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR> " Vertical equivalent of Cwn and CwN" nnoremap <Cw>v :vnew<CR> nnoremap <Cw>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR> " I open new windows to warrant using up CM-arrows on this" nmap <CM-Up> <Cw>n nmap <CM-Down> <Cw>N nmap <CM-Right> <Cw>v nmap <CM-Left> <Cw>V 

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

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

 :Sex 

我没有这样做:)

:Sex:Vex:Tex:Ex是所有有用的命令,用于在您的系统上浏览文件,如果您想使用不同的东西:e

S/V/T是Split / Vertical / Tab的缩写)

如果你还没有find他们,你可能想看看:

  • 原来的模糊发现者插件 – 哪个IIRC没有Ruby绑定问题
  • 项目插件 – 类似于NERDTree
  • 缓冲区资源pipe理器插件 – 显示一个打开的缓冲区列表

另外请记住,您可以在.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 <cw>v<cw>l noremap <leader>s <cw>s<cw>j noremap <leader>x <cw>c " use ctrl-h/j/k/l to switch between splits map <cj> <cw>j map <ck> <cw>k map <cl> <cw>l map <ch> <cw>h 

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

您可以通过只input部分名称来打开文件。

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

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

如果你有:

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

而你想打开dir_b/file.html你一般可以通过inputb<Tab>h来find它

我想我可以更好地使用标签,我可以轻松切换,但也许我需要使用不同的工作stream程。

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

:tabe打开一个新的(tab选项编辑的简称,例如:tabe for empty或:tabe path/to/file file在新选项卡中打开文件),您可以在相邻的选项卡之间移动gt / gT ,还有一些其他与制表符相关的导航命令,就像你可能期望的Vim( :help tabs

我的大型项目工作stream程往往涉及到一堆标签,每个标签都有1到3个窗口,这取决于我需要什么types的上下文。 如果我有一个双倍宽度的terminal窗口,这个效果会更好,因为我可以垂直分割:vs ,所以一个标签可以很容易地显示4个文件,每个文件都有足够的空间。

最后的提示:我有时使用“switch buffer”命令( :sb <partial_buf_name> ),这种命令类似于TM的模糊发现,因为它工作得很好,但只适用于已经打开的缓冲区。 当我一次打开十几个或更多的文件时仍然非常棒。 (注意我需要:set switchbuf=usetab在我的vimrc中:set switchbuf=usetab ,这样可以跨多个标签工作,但是一旦:set switchbuf=usetab了。)

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

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

:b可以将一个缓冲区号作为参数,或者(更有用的)一个匹配部分path/文件名的string。 如果有多个匹配,你可以使用标签来循环。

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

如果你想打开一个新的选项卡中的缓冲区,然后使用:tab b name

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

令人惊讶的是:find命令在任何答案中都没有被提及。 我通常使用rails项目,我需要深入到目录层次结构深入。 因此,对于文件application.css ,位于app/assets/stylesheets/所有我必须键入是:find applica application.css ,然后按Tab键自动完成并进入打开。

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

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

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

我喜欢的一件事是支持通配符(*)。 对于多场比赛也是很好的performance。

除了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命令replace缓冲区资源pipe理器,它基本上显示了相同的内容。

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

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

我还修改了statusline以包含缓冲区号%2n ,这样我总能知道正在编辑哪个缓冲区。 请参阅:h statusline

你知道MacVim应用程序吗? 它是OS X的VIM抛光,其特点之一是支持标签(CMD + T打开新标签),它有抽屉等…(阅读:http: //zerokspot.com/weblog/2008 / 08/03 / macvim-as-textmate-replacement / )

尝试一下!

问候米哈尔

这是一个相当微不足道的,我坚持我的.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

它会search子目录,findMain.java并加载它。 对于同名的多个文件来说,这并不是很好,但它很快捷,简单。

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

我的查找文件的工作stream程是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开头的缓冲区)

NerdTree最适合在vim中进行文件导航。

下面的链接是一个很好的介绍nerdtree。

http://www.catonmat.net/blog/vim-plugins-nerdtree-vim/