热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

YouCompleteMe中容易忽略的配置

YCM版本演进很快,以前是半异步(偶尔会卡),2017年中进化成全异步(完全无等待了),网上很多针对老版本的配置方法也都是有问题的,并不能发挥出YCM的最佳水平,下面列举额一些容易

YCM 版本演进很快,以前是半异步(偶尔会卡),2017年中进化成全异步(完全无等待了),网上很多针对老版本的配置方法也都是有问题的,并不能发挥出 YCM 的最佳水平,下面列举额一些容易被忽略的配置问题:

语义补全自动触发

大家都知道 YCM 有语义补全,但默认语义补全是要你输入 . 或者 -> 或者 :: 后才会弹出:

《YouCompleteMe 中容易忽略的配置》
《YouCompleteMe 中容易忽略的配置》

上图中 time 后面输入了点以后才会弹出基于语义的补全,而默认状态下即便你设置了:

let g:ycm_min_num_identifier_candidate_chars = 2

两个字符以后自动弹出的是基于符号的补全(当前所有 buffer 中收集到的符号),不是基于语义的补全,所以前面没有输入过 printf 的话,接下来输入了 pri 也不能自动语义补全为 printf:

《YouCompleteMe 中容易忽略的配置》
《YouCompleteMe 中容易忽略的配置》

其实 YCM 里触发语义补全有一个快捷键:

let g:ycm_key_invoke_completion = ''

默认是用 CTRL+SPACE 来触发补全的,中文操作系统下,CTRL+SPACE被系统劫持用作输入法切换,无法正确传到终端,所以一般要改成 CTRL+Z:

let g:ycm_key_invoke_completion = ''

好了,那么我们输入到 pri 的时候按下 CTRL+Z,语义补全就弹出了:

《YouCompleteMe 中容易忽略的配置》
《YouCompleteMe 中容易忽略的配置》

前面设置基于符号的补全,只需要输入两个字符,就会自动弹出,但它相对语义补全有三个不足:

  1. YCM需要在所有打开的文件中收集符号,除非前面写过 printf,或者同时打开的文件里有 printf,YCM才能正确进行符号补全,否则首次出现的东西 YCM不知道该怎么办。
  2. 编码时首次出现的符号才是我们最需要补全的东西,前面都写过了,还要你符号补全作甚?如果你第一次写了printf 的头三个字母,没有语义补全的话 YCM 就傻了。
  3. 符号补全只有一个符号名,不能像语义补全一样给出参数格式,返回值等丰富信息。

所以符号补全就是傻瓜猜测,语义补全才是我们最想要的东西,那为啥 YCM必须要输入了:. 或者 -> 或者 :: 才能弹出语义补全呢?对于顶层符号(比如 printf)的语义补全为啥必须要我按一个快捷键(上面设置的 CTRL+Z)呢?

因为 2017年 8月之前 YCM 还是半异步模式,符号补全很快,默认基本都可以自动弹出,而语义补全经常卡半天。所以为了避免用户每敲个字母就等待半天的尴尬,YCM 的语义补全一直使用被动触发(输入 ->或 . 或 ::,或者按 CTRL+SPACE/Z),这种方式解决了输入不流畅问题,但也带来了操作麻烦问题。

而 2017年 8月后的版本,请求发送过去,使用 timer 轮询结果,有结果才弹出,没返回也不影响输入,从这个版本开始 YCM 才进入了全异步时代,体验基本赶上 emacs 补全(emacs很早就有异步机制)和各种 IDE。

既然 YCM 进入了全异步模式,语义补全不会卡到用户输入了,那么可不可以不需要用户主动触发就自动弹出呢?在你的配置中加上这个语义触发的条件即可,默认的语义补全触发条件是 ycm_semantic_trigger :

let g:ycm_semantic_triggers = { \ 'c' : ['->', '.'], \ 'objc' : ['->', '.', 're!\[[_a-zA-Z]+\w*\s', 're!^\s*[^\W\d]\w*\s', \ 're!\[.*\]\s'], \ 'ocaml' : ['.', '#'], \ 'cpp,objcpp' : ['->', '.', '::'], \ 'perl' : ['->'], \ 'php' : ['->', '::'], \ 'cs,java,Javascript,typescript,d,python,perl6,scala,vb,elixir,go' : ['.'], \ 'ruby' : ['.', '::'], \ 'lua' : ['.', ':'], \ 'erlang' : [':'], \ }

代表在 C/C++ 下面,用户除了手工 CTRL+SPACE/C 外,写代码的时候必须输入:. 或 -> 或 :: 才能弹出语义补全,下面我们在自己的 vimrc 中加入如下额外设置:

let g:ycm_semantic_triggers = { \ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'], \ 'cs,lua,Javascript': ['re!\w{2}'], \ }

vimrc 中定义了 g:ycm_semantic_triggers 以后,默认的 . / -> / :: 是不会被覆盖的,只会追加成新的 trigger,这里我们追加了一个正则表达式,代表相关语言的源文件中,用户只需要输入符号的两个字母,即可自动弹出语义补全:

['re!\w{2}']

就是上面这个,括号里面的数字可以修改,这里我们默认输入两个字母才弹出。好了,接下来重启 Vim ,跑到刚才我们的小程序那里,输入 pr 后不用按任何键就自动弹出语义补全了:

《YouCompleteMe 中容易忽略的配置》
《YouCompleteMe 中容易忽略的配置》

全异步机制的 YCM 搭配 g:ycm_semantic_triggers 设置,终于让 YCM 的补全效果如丝般顺滑了,自动语义补全使整个编码的工作流顺畅不少。

注意升级你的 VIM 为 8.0 以后,YCM到最新版。Windows 下的32位版本 YCM 你不用自己编译,我一直在维护更新,可以到这里下载:

韦易笑:如何在 Windows 下使用 Vim 的 YouCompleteMe 插件?

而 Linux 下面的 YCM 安装相对比较自动化一点,直接跑 install.py 即可。

补全对话框的颜色修改

不少人觉得 Vim 自动补全的弹出窗口默认配色很丑:

《YouCompleteMe 中容易忽略的配置》
《YouCompleteMe 中容易忽略的配置》

如果你和我一样想把它改成上面比较素雅的灰色的话,可以自己定义 highlight:

highlight PMenu ctermfg=0 ctermbg=242 guifg=black guibg=darkgrey highlight PMenuSel ctermfg=242 ctermbg=8 guifg=darkgrey guibg=black

这个配置是我上面的灰色配置,xterm 下的配色见:

Xterm, HEX, RGB, HSL

对照这个表格你还可以改成你喜欢的颜色。

屏蔽一些不喜欢的 YCM 功能

我不喜欢 YCM 自动弹出函数原型预览窗口,它搞乱我的布局,我有其他方法查看函数的原型,如果你和我一样想关闭该功能的话,增加两行配置:

set completeopt=menu,menuone let g:ycm_add_preview_to_completeopt = 0

这样讨厌的预览窗口就不会不经过我同意随便乱弹了。

YCM默认会显示诊断信息,语言标注出来你代码问题,我一般不需要,要分析问题我有其他手段,我更喜欢我原型编译或者静态检查工具以后,你再给我标注出问题来,你如果也想屏蔽 YCM 的诊断信息,你可以设置:

let g:ycm_show_diagnostics_ui = 0

这样你可以用其他插件来完成自动/非自动代码静态检查。

最终配置

好吧,下面是最终的 YCM 配置:

let g:ycm_add_preview_to_completeopt = 0 let g:ycm_show_diagnostics_ui = 0 let g:ycm_server_log_level = 'info' let g:ycm_min_num_identifier_candidate_chars = 2 let g:ycm_collect_identifiers_from_comments_and_strings = 1 let g:ycm_complete_in_strings=1 let g:ycm_key_invoke_completion = '' set completeopt=menu,menuone noremap <c-z> <NOP> let g:ycm_semantic_triggers = { \ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'], \ 'cs,lua,Javascript': ['re!\w{2}'], \ }

最后建议设置一下:g:ycm_filetype_whitelist 这个白名单,避免编辑白名单外的文件类型时 YCM也在那分析半天,比如你打开个 1MB 的 TXT 文件,YCM还要再那里空跑半天就傻了:

let g:ycm_filetype_whitelist = { \ "c":1, \ "cpp":1, \ "objc":1, 。。。。 \ "sh":1, \ "zsh":1, \ "zimbu":1, \ }

好了,祝各位使用愉快。


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
author-avatar
xc15212
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有