用vim 编辑怎样才能比 IDE 更快
发布网友
发布时间:2022-04-25 22:04
我来回答
共1个回答
热心网友
时间:2022-04-15 02:22
很多使用过 IDE 的朋友在开始使用 Vim 时都会觉得 Vim 缺少 IDE 中的功能。而在提问过程中遭遇 Vim 熟练使用者们的抨击。
这里需要澄清的一点是,即使你再怎么去调节你的Vim,或为他书写插件,Vim始终是一个静态文本编辑器,他在增量解析上因为访问编辑器内存的局限性和其设计原则,使得他效率上有所缺失,并且不支持 shell-window (关于为什么不支持 shell-window, 请阅读 :help shell-window 更详细地了解)。由于这些问题的存在,Vim 并不能像 IDE 一样成为一个强大的,动态的编程环境。但是,这并不能妨碍我们使用Vim编程,当我们认可了Vim是一个静态文本编辑环境后,我们所要做的事情,就是尽可能地利用静态分析工具打造一个适合静态文本编辑的编程环境。
对于喜欢使用Vim并且掌握Vim的人们,都有一套自己的配置来让他们处理IDE 相关的操作。以下我就说一说我自己是如何来打造这样一个环境:
我们假设你要编辑的项目为: ~/foo/bar/foobar/ 这个project
1. 定义,声明的跳转
在编程中,最常使用的是定义跳转 ( define, declaration jumping ),这方面需要你借助一个Vim中常用的外部工具叫做 cTags 来实现。很少有人会告诉你 cTags 怎么使用。但是当你开启一个项目后,一般你会通过:
~/foo/bar/foobar/: ctags -R .
生成你想要的 tags。完成这个操作后,你的 ~/foo/bar/foobar/ 目录下会出现一个叫做 tags 的文件。在你的 .vimrc 中设置:
let tags+=./tags
即可将上面的文件加入到 vim中。这个时候,如果你可以试着将光标挪动到某个定义单词下,按下 ctrl+] 就会跳转到这个单词的定义中。你也可以通过 :ts <your_word> 直接列出<your_word> 相关的单词定义。
2. 文件浏览
相信喜欢 Vim 的朋友都有自己的文件浏览插件。最常被大家使用的是 NERDTree: https://github.com/scrooloose/nerdtree 。这个插件可以帮助你列出你当前项目下的文件。并且他提供了 file filter pattern。这样你可以通过设置 g:NERDTreeIgnore 这个变量来忽略那些你不想要的文件。
但是,我个人喜欢使用的是我自己开发的一个插件叫做 ex-project: https://github.com/exvim/ex-project 。这个插件和NERDTree 的功能类似,不过他是专门为单独 Project 设计的,有更好的 folder, file filter 选项。同时他也是 exVim 插件体系的一部分。
如果说 Vim 的文件浏览有什么比 IDE 有优势的地方,莫过于因为Vim是一个静态文本编辑器,所以他的所有东西皆文本,所以你可以用任何文本操作的方式来游走于文件浏览插件中,比如 search /,比如单词跳转等等。对了,你还可以用 regular expression。是不是很cool呢。
3. 全局搜索
我相信不少人为此困扰过。Vim 社区里确实太缺少这个东西了。你说 grep? NO,NO,NO!对于大型项目,grep 的recursively搜索即使配合file filter pattern也是慢如狗。为此我个人特地开发了一个专门为 global search 做优化的插件 ex-gsearch: https://github.com/exvim/ex-gsearch 。同样的,ex-gsearch 也是 exVim 插件体系的一部分。
ex-gsearch 实际上是一个引用外部搜索引擎的搜索结构到 Vim 插件窗口中的插件。他能够很好的引用 grep, id-utils 的搜索结构。而我这里要重点介绍的就是除了 grep 外更适合作为项目内全局搜索的工具 id-utils。和 ctags 一样,id-utils 也是一个预先帮助你解析项目文件,然后生成索引列表文件提供给Vim使用的外部工具。他的使用方法:
~/foo/bar/foobar:mkid
然后你会生成一份 ID 文件。在项目中,通过:
~/foo/bar/foobar:lid --result=grep -f"ID" your_search_word
即可全局搜索你想要的文字。因为 mkid 是预先将项目文件索引起来,所以搜索非常的快。并且他有各种指令可以帮助你 filter 你不想要搜索的 folders, files。这些通过 -p 和 id-lang-map 设置即可。
4. 文件快速跳转
相信不少朋友都被 sublime text 的 ctrl+p 文件快速搜索功能给深深地吸引。其实 Vim 中也有一个类似的插件做相同的事情,他就是 ctrlp: https://github.com/kien/ctrlp.vim。这里我就不多说了。同类的Vim插件还有 lookupfile, unite 等等。他们做的同样出色。
5. 代码补齐
这类型的 Vim插件也是非常的多的,我按照我目前喜欢的按排名列举:
vim-autocomplpop
neocomplcache
neocomplete
YouCompleteMe
supertab
我喜欢 autocomplpop 是因为他纯 Vim 脚本编写,速度上是测试的几个纯 Vim 编写的插件中最快的。如果你不拘泥于纯粹Vim脚本这件事情, neocomplete, YouCompleteMe 会是更好的选择。
总结,关于 exVim
以上几点已经可以将Vim打造成不错的IDE了。说了那么多,其实只是想告诉题主,Vim只是一个静态文本编辑工具,他不是IDE,但是借助外部工具可以做很多类似IDE的事情,甚至有些时候做的更好。
不过耐心看到这里的朋友应该发现了,我上面的列举有个很大的问题,这些外部工具在项目里运行,需要一些精心的调配,比如 file filter, folder filter。不同的插件语法不同,总不能我每次开个项目,都要设置这些东西吧,很烦。
所以,我写这篇文章的目的,并不是让你们用上面的方法来使用Vim编程IDE,而是推荐大家使用 exVim 这个我精心配置过的 Vim 编程环境。exVim 将项目中用到的 file filter, folder filter, 插件配置,外部工具等等东西都通过 .exvim 这个文件进行统一配置,当你开始一个项目的时候,你只需要在项目工程下创建 foobar.exvim 这个文件,并且用 Vim 编辑他,他就会自动的将配置信息转化到 Vim 中,并且帮你启动你需要的插件和脚本。也就是说,他做了上面的我说的那些操作,让你不用去二次学习那些外部工具的命令语法和其他一些选配功能。