与 ST2 的Ctrl+最接近的等价物(“最接近”,而不是“确切”)P是一个名为的插件,请准备好... CtrlP。还有其他类似的插件,例如Command-T或FuzzyFinder。
我使用 CtrlP 并且我喜欢它,但我全心全意地支持您选择“无插件”的决定。这不是最简单的方法,但从长远来看它会得到回报。
打开文件
打开文件最基本的方法是:e /path/to/filename
. 值得庆幸的是,您获得了制表符补全和通配符:经典*
的和特殊的**
,代表“任何子目录”。
结合所有这些,您可以执行以下操作:
:e **/*foo<Tab>
foo
从工作目录下名称中包含的所有文件中进行选择,或者:
:e **/*foo/*bar<Tab>
从名称中包含的所有文件中进行选择,该文件bar
位于其名称中包含的任何子目录foo
下,工作目录下的任何位置。
当然,这也适用于:tabe[dit]
,:sp[lit]
和:vs[plit]
。
但是,这些命令仅限于一个文件。用于:next
打开多个文件:
:next **/*.js
看看:help arglist
。
在缓冲区之间跳转
:b[uffer]
是基本的缓冲区切换命令:
:b4 " switch to buffer number 4
:bn " switch to next buffer in the buffer list
:bp " switch to previous buffer in the buffer list
:bf " switch to first buffer in the buffer list
:bl " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b# " switch to the alternate file
请注意,其中许多命令及其相关命令都接受计数。
该:ls
命令向您显示已加载缓冲区的列表。不过,它有点“特殊”:缓冲区在创建时被分配了一个数字,因此您可以拥有一个看起来像1 2 5
删除缓冲区的列表。是的,这有点尴尬,这使得按其编号切换到缓冲区有点太麻烦了。更喜欢按部分名称:b foo<Tab>
或循环切换:bn :bp
。
无论如何,这是一个很酷的映射,它列出了所有加载的缓冲区并为您填充提示,等待您输入缓冲区的编号并按<enter>
:
nnoremap gb :ls<CR>:b<Space>
使用此映射,切换到另一个缓冲区非常简单:
gb
(quickly scanning the list)
3<CR>
或者:
gb
(quickly scanning the list)
foo<tab><CR>
这个想法来自这张取自 Bairui 收集的 Vim 信息图表的图片:
Vim 也有<C-^>
(或<C-6>
在某些键盘上)——相当于普通模式的:b#
——在当前缓冲区和前一个缓冲区之间跳转。如果您经常在两个缓冲区之间交替使用它。
阅读所有关于缓冲区的内容:help buffers
。
前往申报
在文件中,您可以使用gd
或gD
。
在项目中,Vim 的“标签”功能是您的朋友,但您需要一个外部代码索引器,如 ctags 或 cscope。最基本的命令是:tag foo
和<C-]>
将光标放在方法名称上。这两个工具都很好地集成到了 Vim 中:参见:help tags
和。:help ctags
:help cscope
对于它的价值,我广泛使用标签导航在项目中移动(主要使用 CtrlP:CtrlPTag
和:CtrlPBufTag
命令,但也使用内置的),我最喜欢的“通用”缓冲区切换方法是按名称。
部署你的配置
许多 Vim 用户将他们的配置置于版本控制之下,这使得在新机器上安装自己的配置变得非常快速和容易。想想看。
编辑
几个月前,我不得不在一台装有过时 Vim 的远程机器上工作。我本可以安装一个合适的 Vim 并克隆我自己心爱的配置,但这次我决定轻装上阵,以“磨刀”。我很快建立了一个极简主义.vimrc
,并重新审视了几个被遗忘的原生功能。在那次演出之后,我认为 CtrlP 没有那么必要并摆脱了它:本机功能和自定义映射并不那么性感,但它们可以在没有太多依赖的情况下完成工作。
玩弄文件
set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *
:find
只要你set path
正确,这是一个真正伟大的命令。使用我的设置,,ffoo<Tab>
将递归查找foo
当前目录下包含的所有文件。它快速、直观且轻巧。当然,我受益于与:edit
和朋友相同的完成和通配符。
为了使该过程更快,以下映射允许我跳过项目的整个部分并在当前文件的目录下递归查找文件:
nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>
警告!该path
选项非常强大。上面的值——<code>.,**——对我有用,作为默认的后备值。在现实世界中,选项的确切值会因项目/语言/框架/工作流程而异,因项目/语言/框架/工作流程而异,因此正确的值完全取决于您的需求。不要盲目地复制该行并期望它可以解决您的所有问题。
玩弄缓冲区
set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>
上面的映射在“wildmenu”中列出了可用的缓冲区,提示为空,允许我导航菜单<Tab>
或键入几个字母,然后<Tab>
再次缩小列表范围。就像上面的文件映射一样,这个过程很快而且几乎没有摩擦。
nnoremap <PageUp> :bprevious<CR>
nnoremap <PageDown> :bnext<CR>
这些映射不言自明。
玩弄标签
nnoremap <leader>j :tjump /
此映射使用正则表达式搜索而不是整个单词搜索,因此我可以,jba<Tab>
找到 tag foobarbaz()
。
是的,模糊匹配会让人上瘾,但没有它你也可以同样高效。并且只需一小部分成本。
更多编辑
一些额外的提示/技巧……</p>
野菜单选项
使用 启用的“wildmenu”set wildmenu
使文件/缓冲区导航更容易。它的行为受一系列值得研究的选项控制:
wildmode
告诉 Vim 你希望 "wildmenu" 如何表现:
set wildmode=list:full
wildignore
过滤掉所有杂物:
set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*
wildignorecase
允许您搜索foo
和查找Foo
:
set wildignorecase
文件标记
augroup VIMRC
autocmd!
autocmd BufLeave *.css normal! mC
autocmd BufLeave *.html normal! mH
autocmd BufLeave *.js normal! mJ
autocmd BufLeave *.php normal! mP
augroup END
我最近在别人的~/.vimrc
. 每当您离开缓冲区时,它都会在光标的确切位置创建一个文件标记,以便无论您身在何处,都可以'J
跳转到您编辑的最新 JavaScript 缓冲区。惊人的。