YouCompleteMe 你,值得拥有!
发布在编辑器2014年1月15日view:42993
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

很久很久以前……

其实写代码需要自动完成都是 Visual Studio 给惯的,不得不说 Visual Studio 是世界上最好的 IDE 没有之一,代码补全不知比 XCode 高到哪里去了(哎?现在不是在说 Vim 么……

想用 Vim 提升逼格的大大们其实看到自动补全心里也是很痒的有木有(笑

你看玉伯大大就用 Intellj IDEA 开发 JavaScript, 那些用编辑器写代码装逼不成反煞笔的例子可以说是要多少有多少。

没有自动语法检查、自动补全、语法提示, 能每次都把代码一次写对(至少,没有语法错误)的人更是少之又少。 (其实蛮多的…… JavaScript 这种语法简单的还好, C++ 首次编译一般都出一两个拼写错误之类的)

废话了这么多不就是为了给大家推荐超便利的 YouCompleteMe 么。

Overview

YouCompleteMe (下文简称 YCM)是 Vim 的终极自动完成插件

YouCompleteMe GIF demo

YCM 不干扰普通编辑行为,在编辑代码的过程中,YCM 如果发现可能的补全项目 则会自动出现候选列表,按 Tab 和 Shift Tab 切换需要补全的短语。

当然,如果补全的目标过多,也可以继续输入来缩小补全的范围, 对正常的文件编辑操作丝毫没有影响。

YCM 能够根据输入,自动匹配 包含 输入字串的项目(不需要是前缀补全呢), 而且还能“智能”判断大小写。举个栗子,

  • 输入 "abc" 能匹配出 "xaybgc"
  • "foo" 能匹配 "Foo""foo"
  • "Foo" 匹配 "Foo""FOO" 但不匹配 "foo" (我整个人都 foo 了……)

最令人感动的是 YCM 提供的语言 语义级别 的补全(像 Visual Studio 那样), 在使用 YCM 之前,我使用的是 clang_complete —— 基于 clang 的 Vim 语义补全插件 (不得不说 clang 真是业界良心,错误提示自带高亮,各种用户友好的提示, 架构上也比 gcc 不知高到哪里去了……),clang_complete 和 YouCompleteMe 都使用了 clang 的语义分析库对 C、C++、Objective C (其实是所有 clang 支持的语言吧!)进行语义补全支持。

Python 的语义补全也植入了 YCM (基于 Jedi),对 Python 死忠来说解决了多年来各种翻文件的难题啊!

最后,你甚至可以使用 YCM 内建的 C# 补全引擎进行 C# 的语义补全!语义补全啊亲!!!

然后你一定发现了, 没有 JavaScript 你让小伙伴看毛线啊!

YCM 提供基于 OmniCompletion 的补全,OmniCompletion 是 Vim 内建的补全协议, 因此,所有基于 OmniCompletion 的补全引擎可以被直接应用于 YCM。

于是……

你只需要安装 tern_for_vim 就可以获得 JavaScript 的语义补全(基于 Tern.js 代码分析器)。 tern_for_vim 输出到 OmniCimpleter 的符号会被 YCM 直接利用出现在 YCM 的自动补完列表中了!感动 cry ……

tern_for_vim

架构上,YCM 采用 C/S 架构,在开启 Vim 的同时会开启 ycmd (Ycm Daemon), ycmd 提取出补全所需要的参数,在需要补全的状态下 Vim 会通过 RPC 接口 访问 ycmd 询问补全结果。这样的架构避免了 clang_complete 那样每次都打开 编译器的开销,在补全体验上得到了巨大的提升(速度快的不是一点半点)

Installation

安装过程需要使用 pathogen

YouCompleteMe

具体的还是参照 官方安装教程 吧……这里只简单说明一下直接使用 GitHub 仓库的方法。

首先你需要 python 和带有 python 支持的 vim。通过 :has(py) 查看 vim 是否支持 python,不支持的话……升级或者编译一个支持 python 的版本就行了。

想使用 clang 自动补全或者 C# 自动补全的同学, 需要安装 cmake、python-dev、build-essentials (Ubuntu 其他发行版……)

第一步

git submodule add https://github.com/Valloric/YouCompleteMe bundle/YouCompleteMe
git submodule update --init --recursive -- bundle/YouCompleteMe

第二步

cd bundle/YouCompleteMe
./install.sh --clang-completer # 如果需要 C 系语言的语义补全(其他参数参照 ./install.sh --help)

如果不需要 clang 和 C# 自动补全可以不执行第二步。

tern_for_vim

首先,你需要安装 npm 和 node.js。

然后

git submodule add https://github.com/marijnh/tern_for_vim.git bundle/tern_for_vim
cd bundle/tern_for_vim
npm install

Configuration

配置项上,YCM 需要配置一些东西

let g:ycm_filetype_blacklist = {
      \ 'tagbar' : 1,
      \ 'qf' : 1,
      \ 'notes' : 1,
      \ 'markdown' : 1,
      \ 'unite' : 1,
      \ 'text' : 1,
      \ 'vimwiki' : 1,
      \ 'gitcommit' : 1,
      \}

上面的代码在这几个文件格式上屏蔽了 YCM (提升效率嘛), 或者你可以设定一个 g:ycm_filetype_whitelist 来配置特定文件格式上启用 YCM。

YCM 对 C/C++/Objective C 的语义补全是需要编译参数的, 我使用 Bear 生成编译数据库文件(compile_commands.json) 供 YCM 读取。

设定

let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py'

并在 ~/.vim/.ycm_extra_conf.py 中加入了递归搜索 compile_commands.json 逻辑, 这样的话就可以让它自动为所有的 C/C++/Objective C 文件搜索编译数据库。

Syntastic

YCM 和 Syntastic 配合可以达到 即时代码错误检查 的效果(就像 Visual Studio 那样,要知道,强类型语言的好处就是编译时能发现 80% 的问题),YCM 官方推荐必属佳品!

结尾 & 碎碎念

为什么你应该拥有 Vim + YouCompleteMe + Syntastic 而不是去安装 Visual Studio?看 VS 那个庞大的体积就知道了 (其实还有启动速度,简直天壤之别好么)

快行动起来,免费获得 YCM 吧。YCM,你,值得拥有~

当然也有人反对把 Vim 当作 IDE 用,认为 Vim 就该是编辑器, 不过也都是个人的观点嘛,社区里什么样的牛都有, 毕竟 Vim 也是那么开放自由过来的。


这是“值得拥有”系列的第一篇文章,今后也继续努力为各位推荐各种好用的工具哦 ( ^ω^)

话说回来,写文章还真是有点累啊,特别是不想放大块的代码, 纯纯码字实在是有点伤。今天从下午开始写了大概 3-4 个小时搞定了这篇, 比起画画来说还是好一点的,上周留下的临摹的坑(线稿画完了,坑在上色…… 就耗费了 16 小时的人参,实在是太惨……) 到现在还没填上,调色搞不定啊 TuT 考虑春节什么时候去填上……。

评论
发表评论
1年前
赞了此文章!
4年前

@a-2cs bear make 就行了,bear 会自动记录 fork 出去的 gcc/clang 进程所访问的源文件和编译参数

4年前

网上查了好久没有查到bear怎么用

4年前

"我使用 Bear 生成编译数据库文件(compile_commands.json) 供 YCM 读取" "并在 ~/.vim/.ycm_extra_conf.py 中加入了递归搜索 compile_commands.json 逻辑" 能否麻烦说一下是怎么做的

4年前

对于包含多个源文件的c工程,比如(main.c , f.c , f.h)。YCM 可以实现在写main.c的时候 检索 f.c中的函数吗?

4年前

@形参码农 擦……泥这么晚才来……

4年前

怒顶室友

4年前

4年前

@听海JamiE 无他,但多写几次耳……

4年前

@羽音篠之 现在自动提示这么高端,有些属性或者方法的词认识,老是忘记写怎么破…

4年前

@听海JamiE 当时我就感动哭了好么……不过说实话,YCM 不方便的地方就是那个配置文件,灵活的地方也在那个配置文件……

4年前

实现这么自动化,真是高大上到家了…

WRITTEN BY
羽音篠之
People die if they do
TA的新浪微博
PUBLISHED IN
编辑器

工欲善其事,必先利其器

我的收藏