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程是这样的:
-
:cd
到我的项目的顶层目录。 -
打开文件
foo/bar/baz
:-
最简单的scheme:input
:e f<tab>b<tab>b<tab><enter>
。 -
如果在这些目录之一中有一个以
b
开头的文件,则可能需要在键盘上执行<left>
或<right>
或另一个<tab>
键以在它们之间跳转(或者再input几个字母来消除歧义) 。 -
最糟糕的情况是有文件和目录共享一个名字,你需要深入目录。 在这种情况下,制表符完成目录名称,然后键入
*<tab>
进行深入分析。
-
- 打开2或3个窗口,根据需要打开所有文件。
- 一旦文件在缓冲区中打开,请不要终止缓冲区。 打开新文件时,请在后台打开它。 只需
:e
在同一个窗口中新build一个文件。 - 然后,使用
: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。