lgweix / blog

5 stars 0 forks source link

玩转vim插件篇-代码补全YouCompleteMe #2

Open lgweix opened 8 years ago

lgweix commented 8 years ago

YouCompleteMe 可谓编程语言补全神器, 支持c, c++, objectc, c#,go,javascript等等, 内置多个补全引擎, 插件自动根据情况先择最优的引擎,或者同时使用多个补全引擎. 针对C语系, 使用clang来实现精确的语义分析.

安装过程参考官方的说明:https://github.com/Valloric/YouCompleteMe#windows 简要记录下windows上ycm的安装. ycm的安装比较麻烦, 需要依赖msvc, clang, python, cmake,7-zip等, 使用的vim版本要支持python, 好在官方安装指引非常详细, 按步骤安装即可. 也可以不不使用msvc, 而使用mingw, 不过需要做一些修改, 比较麻烦 具体在官方github页面的wiki上面有介绍.

这里主要点记录一下遇到的问题:

python版本问题

YCM插件需要vim支持python才行, 执行 vim --version 可以看到 -python 或者+python, -表示不支持, +表示支持. 可以从github上获取编译好的带pyhthon支持的windows版本vim https://github.com/vim/vim/releases

本地的python版本为2.7.11. 按步骤安装好YCM后,打开一个文件,或者输入:python print "hello", 会出现如下的错误提示:

E887:Sorry, this command is disabled, the Python's site module could not be loaded

似乎是找不到本地的python, google了一翻, 据说是python 2.7.11的bug, python 2.7.9则不存在这个问题, 换了python版本后, 问题还在, 提示如下:

 The ycmd server SHUT DOWN (restart with ':YcmRestartSever...library. Run ':YcmToggleLogs stderr' to check the logs.

输入:YcmToggleLogs, 看到完整的栈信息

Traceback (most recent call last):
  File "C:\Python27\lib\logging\__init__.py", line 859, in emit
    msg = self.format(record)
  File "C:\Python27\lib\logging\__init__.py", line 732, in format
    return fmt.format(record)
  File "C:\Python27\lib\logging\__init__.py", line 474, in format
    s = self._fmt % record.__dict__
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb2 in position 20: ordinal not in range(128)
Logged from file server_utils.py, line 107

重新安装编译了下ycm后问题消失.

c/c++编译标志配置文件

打开一个cpp文件,出现错误提示

RuntimeError:Still no compile flags, no completions yet.

这是由于没有设置编译标志造成的, YCM的安装说明文档里有说明, YCM提供了一个示例文件, youcompleteme\third_party\ycmd\cpp\ycm.ycm_extra_conf.py 将这个文件copy到自已的工程, 根据需要修改编译标志,即可.不过这样很麻烦, 可以通过vim选项来设置默认编译标志文件:

let g:ycm_global_ycm_extra_conf = $VIM . '/vimfiles/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'

.ycm_extra_conf.py 文件中的-Wc++98-compat注释掉,否则使用c++11时会报错类似下面的错误:

'auto' type specifier is incompatible with c++98

参考:https://github.com/Valloric/YouCompleteMe/issues/700

YCM错误日志及调试信息.

在vim配置文件中加上下面的选项

let g:ycm_server_keep_logfiles = 1
let g:ycm_server_log_level = 'debug'

几个常用命令:

vs2015与之前的版本有一些区别, 比如char16_t,char32_t作为编译器的内置类型,而clang3.8不认识

  1. 环境变量 INCLUDE值加上下面的路径, 否则有些头文件会找不到
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include;
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A;
  1. 确保ycm安装是clang版本为3.9+

    boost相关

ycm自带的boost缺少部分文件,如asio. 自行下载boost, .ycm_extra_conf.py要作一些修改:

  1. 替换原来的boost路径
  2. 添加系统路径 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A 否则一些头文件找不到,如winsock2.h'
  3. 定义宏'-DBOOST_USE_WINDOWS_H', 否则会有一些冲突

    virtualbox中ubuntu16.04编译ycm出错

g++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,

用free命令可以看到内存及swap都被耗尽 参考:http://vb2005xu.iteye.com/blog/2171295 主要原因大体上是因为内存不足,有点坑. 增大虚拟机内存编译成功了

pimail1501 commented 7 years ago

请问楼主如果编译正常,但是出现如下的错误,怎么弄? Traceback (most recent call last): File "C:\Python27\lib\logging__init.py", line 859, in emit msg = self.format(record) File "C:\Python27\lib\logging__init.py", line 732, in format return fmt.format(record) File "C:\Python27\lib\logging\init__.py", line 474, in format s = self._fmt % record.dict__ UnicodeDecodeError: 'ascii' codec can't decode byte 0xb2 in position 20: ordinal not in range(128) Logged from file server_utils.py, line 107