与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
选件功能非常强大。上面的值.,**
- 对我有用,但是我使用的语言没有标准库。在正确的价值完全取决于你的需求。
玩弄缓冲区
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()
。
是的,模糊匹配会让人上瘾,但如果没有它,您可能会同样高效。而且只花很少的钱。
更多编辑
一些其他提示/技巧…
Wildmenu选项
启用的“ 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缓冲区。太棒了