在过去几年使用 TextMate 之后,我正在努力学习 vim。
我已经开始将一些文件内导航提交到内存,但我在多个文件之间导航时遇到了困难。
在我的工作流程中,我经常在几个文件之间切换是很常见的(足够多的文件,以至于拆分窗格窗口变得太小)。
我目前正在使用 NERDTree,但发现向下钻取目录很麻烦,并且经常使用 CTRL+W h/CTRL+W l 来回跳转。
我认为我可以使用可以轻松切换的选项卡做得更好,但也许我需要使用不同的工作流程。
我还想要一个“转到文件...”快捷方式,例如 TextMate 中的 CMD+T。我找到了 fuzzy_file_finder
,但它需要使用 Ruby 绑定构建 vim,而我从事的本机安装并非如此。
虽然我可以重建我想切换到 vim 的主要原因是我可以拥有一个我知道可以在任何平台上轻松工作的编辑器环境。
caps-lock
映射到 ctrl
?它使 ctrl
的大多数事情变得更好......您可以使用 gnome-tweaks
或 setxkbmap -o ctrl:nocaps
之类的东西
浏览文件系统的一种简单方法是使用以下命令:
:Sex
我不是在编造这个:)
考虑到制表符完成的体面配置,我发现通过普通的旧 :e
深入到子目录不会那么麻烦。
查看 'wildmenu'
选项,让 Vim 在命令行上方的模式行中显示完成列表(文件名)。您可以更改 'wildmode'
选项以进一步配置 Vim 将执行的制表符补全类型。
我个人使用 :set wildmode=full
。
我的工作流程是这样的:
:cd 进入我项目的顶层目录。打开文件 foo/bar/baz: 最简单的场景:输入 :e f
我还使用这些映射来更轻松地打开新窗口并在它们之间跳转,因为这是我经常做的事情。
" 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,设置一些窗口并在其中打开一些文件。就我个人而言,我从未发现任何第三方文件浏览脚本非常有用。
set path+=**
添加到您的配置中,您基本上可以启用模糊搜索,如 here 所述
如果您想使用不同于 :e
的东西,:Sex
、:Vex
、:Tex
和 :Ex
都是用于探索(探索)系统上文件的有用命令
(其中 S/V/T
是 Split/Vertical/Tab 的缩写)
如果您还没有找到它们,您可能需要查看:
原始的模糊查找器插件——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
到目前为止,我发现的用于文件导航的最好和最快的插件是 fzf.vim。您可以非常快速地模糊搜索所有文件、打开的缓冲区甚至文件内容。
由于我们有一个非常大的代码库,我指定了几个我最常使用的目录作为 fzf 搜索的目录。 Fzf 甚至有丰富的 git 集成。因此,您只能搜索跟踪的文件。
https://i.stack.imgur.com/KcwmH.gif
https://i.stack.imgur.com/grGuv.gif
令人惊讶的是,在任何答案中都没有提到 :find
命令。我通常使用需要深入了解目录层次结构的 Rails 项目。因此,对于位于 app/assets/stylesheets/
中的文件 application.css
,我只需键入 :find applica
,然后按 tab 自动完成并按 enter 打开。
我认为我可以使用可以轻松切换的选项卡做得更好,但也许我需要使用不同的工作流程。
你知道 Vim 的标签吗?不确定您是否指的是 Vim 自己的选项卡,或者是 TextMate 的。目前尚不清楚您使用的是什么 Vim 版本,但它至少从 7.0 开始就有标签(我最近看到的地方似乎都安装了它),而且它们很棒。
:tabe
打开一个新文件(“标签编辑”的缩写,例如 :tabe
表示空白或 :tabe path/to/file
表示在新标签中打开文件)您可以使用 gt
/gT
在相邻标签之间移动,并且还有许多其他与选项卡相关的导航命令,正如您对 Vim (:help tabs
) 所期望的那样
我的大型项目工作流程往往涉及一堆选项卡,每个选项卡都有 1 到 3 个窗口,具体取决于我需要的上下文类型。如果我有一个双宽终端窗口,这会更好,因为我可以用 :vs
垂直分割,所以一个标签可以轻松地一次显示 4 个文件,每个文件都有足够的空间。
最后提示:我有时会使用“切换缓冲区”命令 (:sb <partial_buf_name>
),这有点像 TM 的模糊发现,因为它工作得很好,但只适用于已经打开的缓冲区。当我同时打开十几个或更多文件时仍然很棒。 (注意,我需要在我的 vimrc 中使用 :set switchbuf=usetab
才能跨选项卡工作,但一旦设置好它就很棒。)
vim-titlecase
螺丝与 gt/gT 映射,但有一个 work-around。
我发现 LustyExplorer 是迄今为止最好的。
您可以通过仅键入文件名称的一部分来打开文件。
您可以从当前文件的目录、当前 pwd
或缓冲区列表中打开文件。
如果您从缓冲区列表中打开文件,则不必浏览目录树,但不幸的是,对于其他两种模式,您仍然必须浏览目录树。好处是您不必从第一个字符开始。
如果你有:
dir_a/
...
dir_b/
file.js
file.html
如果您想打开 dir_b/file.html
,您通常可以通过键入 b<Tab>h
找到它
如果您想要的文件已经加载到缓冲区中(如果您经常在几个文件之间切换,这很可能),那么您可以使用 :b[uffer]
命令快速切换到缓冲区。
:b
可以将缓冲区编号作为参数,或者(更有用)一个与路径/文件名的 part 匹配的字符串。如果有多个匹配项,您可以使用 tab 循环浏览它们。
如果要拆分窗口并在新窗口中打开缓冲区,请使用 :sb name
如果要在新选项卡中打开缓冲区,请使用 :tab b name
您还可以使用 :ls
命令查看当前加载的缓冲区列表。
我使用这个函数在子目录中查找文件,虽然我没有写它。它来自 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("")
我喜欢的一件事是它支持通配符 (*)。它在多场比赛中也表现良好。
除了 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
你知道 MacVim 应用程序吗?它是为 OS X 优化的 VIM,它的一个功能是支持标签(CMD+T 打开新标签),它有抽屉等等......(阅读:http://zerokspot.com/weblog/2008/08/03/macvim-as-textmate-replacement/)
试试看!
问候米哈尔
NerdTree 最适合在 vim 中进行文件导航。
下面的链接是对 nerdtree 的一个很好的介绍。
http://www.catonmat.net/blog/vim-plugins-nerdtree-vim/
这是我在 .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>)
所以我只能说:
:尔主.java
它会搜索子目录,找到 Main.java
并加载它。对于同名的多个文件,它的表现不佳,但它既快速又简单。
我使用的另一个工具是 VTreeExplorer,它提供了一个基于树的文件/目录窗口,并且不需要来自 VIM 的任何特殊构建选项(即它是一个 vanilla 插件)。
models.py
、views.py
等。
我查找文件的工作流程是 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 开头的缓冲区)
:Vex
如果您想垂直分割屏幕而不是水平分割:Vex
更实用,但:Sex
让我很开心。:Se
也有效(对于Ve, Te
变体也是如此)。没必要让它变得奇怪:)