vim,使用vanilla Vim快速切换文件(无插件)
我知道,限制自己到香草Vim(不使用插件)限制了编辑的权力,但是当我经常在不同的机器之间切换时,在任何地方移动我的环境往往是太麻烦了。 我想留在香草维姆。
一些阻碍我的是能够快速切换文件。 我(至less相信)对缓冲区 , 窗口 , 选项卡以及netrw( Vex
, Ex
等)有很好的理解。
但是在一个像Sublime Text这样的编辑器中,我只需键入ctrl -p,然后立即在文件中。
我知道我可以下载到shell,但是我想知道是否有任何其他“隐藏的”秘密来快速切换Vim中的文件不仅仅是文件名。
与ST2的Ctrl + P最接近的等效(“最接近”,而不是“确切”)是一个名为“准备就绪…”的插件 。 还有其他类似的插件,如Command-T或FuzzyFinder 。
我使用CtrlP和我喜欢它,但我全心全意地支持你的决定“无插件”。 这并不是最简单的方法,但长远来看,这将会带来回报。
打开文件
打开文件的最基本的方法是:e /path/to/filename
。 谢天谢地,你得到了制表符和通配符:经典*
和一个特殊的**
,代表“任何子目录”。
综合所有这些,你可以做到:
:e **/*foo<Tab>
从工作目录下的名字中select所有包含foo
的文件,或者:
:e **/*foo/*bar<Tab>
在其名称中包含foo
任何子目录下,在工作目录下的任意位置,select名称中包含bar
所有文件。
当然,这适用于: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
命令显示加载的缓冲区列表。 这有点“特殊”,但是:创build缓冲区时会分配一个数字,所以如果您删除缓冲区,您可以拥有一个类似于1 2 5
的列表。 这有点尴尬,是的,这使得切换到一个缓冲区的数量有点太麻烦了。 优先使用部分名称进行切换:b foo<Tab>
或循环, :bn :bp
。
无论如何,这是一个很酷的映射,列出所有加载的缓冲区并为您填充提示符,等待您input缓冲区的编号并按<enter>
:
nnoremap gb :ls<CR>:b<Space>
有了这个映射,切换到另一个缓冲区就像下面这样简单:
gb (quickly scanning the list) 3<CR>
要么:
gb (quickly scanning the list) foo<tab><CR>
这个想法来源于这个来自百瑞Vim图表集合的图像:
Vim在某些键盘上也有<C-^>
(或<C-6>
) – 正常模式相当于:b#
– 在当前缓冲区和前一个缓冲区之间跳转。 如果经常在两个缓冲区之间切换,请使用它。
阅读有关缓冲区的所有信息:help buffers
。
去声明
在一个文件中,你可以使用gd
或gD
。
在一个项目中,Vim的“标签”function是你的朋友,但你需要一个外部代码索引器,如ctags或cscope。 最基本的命令是:tag foo
和<C-]>
光标放在方法名上。 这两个工具都很好地集成到Vim中:请参阅:help tags
:help ctags
和:help cscope
。
为了什么是值得的,我广泛使用标签导航在一个项目中移动(主要使用CtrlP :CtrlPTag
和:CtrlPBufTag
命令,但大多数是内置的),我最喜欢的“通用”缓冲区切换方法是名字。
部署你的configuration
许多Vim用户将他们的configuration放在版本控制之下,这使得在新机器上安装你自己的configuration非常快捷。 想想看。
编辑
几个月前,我不得不使用Vim过时的远程机器。 我可以安装一个合适的Vim并克隆我自己喜欢的configuration,但我决定这次为了“磨锯”而行驶。 我很快build立了一个极简主义的.vimrc
并重新访问了几个被遗忘的原生特征。 在那之后,我决定了CtrlP并没有那么必要,并且摆脱了它:本地特性和自定义映射并不像性感,但是他们完成了这个工作,没有太多依赖。
与文件杂耍
set path=.,** nnoremap <leader>f :find * nnoremap <leader>s :sfind * nnoremap <leader>v :vert sfind * nnoremap <leader>t :tabfind *
:find
只要你正确set path
:find
一个真正伟大的命令。 用我的设置, ,ffoo<Tab>
会recursion地在当前目录下find所有包含foo
的文件。 它快速,直观,轻便。 当然,我可以从:edit
和朋友那里得到相同的完成和通配符。
为了使这个过程更快,下面的映射允许我跳过项目的整个部分,并在当前文件的目录下recursion地查找文件:
nnoremap <leader>F :find <CR>=expand('%:h').'/*'<CR> nnoremap <leader>S :sfind <CR>=expand('%:h').'/*'<CR> nnoremap <leader>V :vert sfind <CR>=expand('%:h').'/*'<CR> nnoremap <leader>T :tabfind <CR>=expand('%:h').'/*'<CR>
警告! path
选项非常强大。 上面的值.,**
– 为我工作,但我使用的语言没有标准的库。 适当的价值完全取决于你的需求。
玩弄缓冲区
set wildcharm=<Cz> nnoremap <leader>b :buffer <Cz><S-Tab> nnoremap <leader>B :sbuffer <Cz><S-Tab>
上面的映射列出了“wildmenu”中的可用缓冲区,提示为空,允许我使用<Tab>
导航菜单或再次键入几个字母和<Tab>
以缩小列表的范围。 就像上面的文件映射一样,这个过程很快,几乎没有摩擦。
nnoremap <PageUp> :bprevious<CR> nnoremap <PageDown> :bnext<CR>
这些映射说明了一切。
与标签杂耍
nnoremap <leader>j :tjump /
这个映射使用正则expression式search,而不是整个词search,所以我可以做,jba<Tab>
find标签foobarbaz()
。
是的,模糊匹配是令人上瘾的,但是如果没有它,你也可以同样高效。 而成本的一小部分。
更多编辑
一些额外的提示/技巧…
Wildmenu选项
使用set wildmenu
启用的“wildmenu”使文件/缓冲区导航更容易。 它的行为受到一系列值得研究的选项的支配:
wildmode
告诉Vim如何让“wildmenu”performance出来:
set wildmode=list:full
wildignore
过滤掉所有的cruft:
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
允许您searchfoo
并findFoo
:
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
find了这个gem。 无论何时离开缓冲区,它都会在游标的确切位置创build文件标记,以便无论您身在何处,都会跳转到您编辑的最新JavaScript缓冲区。 真棒。
答案很大程度上取决于你的喜好和情况。 一些例子:
- 如果主要是两个文件(例如C头文件和实现文件),
<C-^>
非常方便。 一般来说, 备用文件是一个重要的概念。 - 如果你使用一个大的编辑器窗口,那么window
:split
就会导致定位窗口的问题(一旦你打开了所有的缓冲区)。 你可以用[N]<Cw><Cw>
快速切换到它。 - 如果你能记住(less数)缓冲区号,那么
:[N]b[uffer]
和:[N]sb[uffer]
命令是非常方便的。:ls
告诉你数字。
插件(或至less是自定义映射)可以改善很多事情,关于vim.org的这个话题有很多种。 有各种机制来分发你的configuration(Pathogen + GitHub,Dropbox,…),或者你可以通过Vim附带的netrw插件远程编辑服务器文件。
您可以在命令行上完成通配符选项卡的完成,而无需任何插件。 例如
:e src/**/foo*<tab>
将允许您遍历./src下的目录树中以“foo”开头的所有文件,并select要编辑的文件。
如果你已经编辑了文件,它仍然在一个缓冲区,那么你可以切换到它:
:b foo<tab>
它将在path中循环遍历所有的“foo”缓冲区。 您可能需要设置wildmode和wildmenu选项才能获得所需的行为。 我有
wildmode=longest:full wildmenu
在我的.vimrc。
有时,依次浏览一系列文件也是很方便的(例如,如果你做了一些类似vim *.php
文件,一次打开几个文件)。 然后,您可以使用:n[ext]
(以及:prev[ious]
:fir[st]
和:la[st]
)进行导航(除了其他答案中的build议外)。
如果你在一个文件名,并想跳转到该文件, gf
会为你做。 我也喜欢使用ctags ,这不是一个插件; 你只是build立标签,可以轻松地跳过你的代码库。
如果你想在vim编辑器中切换文件,请看下面的答案
首先按Esc
键退出编辑模式。
然后键入:e
来检查当前的文件path。
如果你想去另一个文件,然后input:e /path-of-file.txt/
使用这个,你可以切换。
如果你想去以前的文件,只需input:e#
切换到以前的文件path。