標籤:

如何在 Windows 下使用 Vim 的 YouCompleteMe 插件?

我有時候會有比較短的代碼會在windows下編寫。

我的vim沒有支持lua,所以還沒有用過neocomplete。這貨的前身neocomplcache有點難用,如果你打錯了一個詞,他也會一直記錄著,直到你關掉vim再次打開。

官方給的windows下的youcompleteme的guide太複雜了,我實在是看著頭大,需要裝一大堆東西,而我嘗試著使用Haroogan / Vim YouCompleteMe for Windows,它要求我去下載一個libclang.dll。

我在Haroogan / LLVM for Windows克隆下來,是一個make libclang的py文件,而在download的地方是兩個mingw的鏈接...它上面一段話說的是clang.exe可以代替gcc神馬的,然後說libclang.dll就是mingw編譯出來的,但是就是沒給我一個一步到位的東西啊T T。我下載下來,這裡面也沒有叫做libclang.dll的東西 T T,大嬸們求教啊!


我已經編譯了一個 Windows 32 位版本了,支持 官網 GVIM + python2.7,包含 clang complete。使用時候,解壓到任意位置,vimrc裡面加一句:

set runtimepath+=d:/path-to-youcompleteme

即可,注意安裝:Visual C++ Redistributable for Visual Studio 2015

下載地址:

Visual C++ Redistributable for Visual Studio 2015

------

更新(2016年7月22日):上個版本已經是3個月前的了,今天重新更新編譯了一個:

http://pan.baidu.com/s/1bEY3cq(歡迎試用最新版,如果有問題,請回滾4月21日的舊版)

------

更新(2016年9月5日):繼續更新

http://pan.baidu.com/s/1qY4HLoS (這個版本我用了一周多,沒出過問題)

------

更新(2016年10月24日):繼續更新

http://pan.baidu.com/s/1gffXE6Z

這個版本是10月24日剛編譯的:

1. clang升級3.9.0採用官方編譯的clang,而沒使用自己編譯的clang,因期間clang/ycmd 都改了好幾個assert的bug,應該不會有之前官方版本的 assert了,此官方clang不需要vc2015運行時,

2. Python支持 2.7.12 32位,如今最新的vim32位版本 8.0.46 可以完美和 python2.7.12協作了。

歡迎試用,如果有問題,請回滾9月5日的穩定3.8.0自編譯版本。

-------

更新(2017年4月27日):繼續更新

http://pan.baidu.com/s/1mibnRuw

這次不急著放新版本,而是放一個比較穩定的版本,配合 python 2.7.13 32位,十分穩定,沒有什麼限制,我自己用了幾個月才放出來的。

--------

更新(2017年6月13日):繼續更新

http://pan.baidu.com/s/1o8dUiKi

上次是1月份的版本用了四個月放出來,這次是最新鮮的6月版本,還是 Windows 32 位,這個版本速度比之前版本好不少。

--------

更新(2017年7月5日):大更新

http://pan.baidu.com/s/1eSu00Au

為何不到一個月就更新呢?因為之前 YouCompleteMe 的補全機制有些落後,會導致輸入時少少的不順暢,特別是補全結果沒回來前,你用 numpy import 以後,numpy 後面補全,會覺得延遲,觀察 Emacs 下 jedi 補全的表現並無這樣的感覺,後來我給 YouCompleteMe 提了一種基於 timer的請求應答機制,YouCompleteMe 最近用該方法進行了局部重構,流暢不少了,體驗如絲般順滑。

------

更新(2017年7月7日):完善

http://pan.baidu.com/s/1mhEqSBI

新機制有一個重要的更新,同時增加 Go / JavaScript / TypeScript 支持

------

更新(2017年9月11日):升級

http://pan.baidu.com/s/1jHAvk4A

內部 LLVM 升級到 5.0.0 ,以及其他細節修訂。


-----------------------------------------------------------2017.4.10隨官方更新------------------------------------------------------------

這次把之前編譯的全都放在同一個目錄了,可以看到之前的所有的包。

環境要求依然是 windows x64 , python 3.5.3 x64 vim x64 。

http://pan.baidu.com/s/1eRO7SYI

-----------------------------------------------------------2016.12.9更新------------------------------------------------------------
隨官方更新~
環境要求依然是: python 3.5 x64 vim x64.

作者:竹青葉
鏈接:如何在 Windows 下使用 Vim 的 YouCompleteMe 插件?
來源:知乎
著作權歸作者所有,轉載請聯繫作者獲得授權。
YouCompleteMe-windows-x86-64: http://pan.baidu.com/s/1bpBWvSF
-----------------------------------------------------------2016.9.23更新------------------------------------------------------------
最近由於工作原因同時使用Linux和Windows,之前做的便攜版明顯不夠用了。 所以又自己重新折騰了下vim.
YCM由於官方支持了Windows,所以按照官方教程做幾乎不會出錯。 我遇到的唯一一個大坑是在64位vim中,python2.7.11 x64有BUG,會導致vim找不到Python模塊進而無法使用YCM。 在我手動清理註冊表過後依然不行,最後是通過從源碼編譯vim解決。
共享的是使用python3.5.2 x64 以及VS2015編譯的,使用的時候使用插件管理工具如vundle或者plug.vim管理或者set runtimepath += ycm_path 即可。 注意全套(python3.5 , vim)必須是64位。

YouCompleteMe-windows-x86-64: http://pan.baidu.com/s/1hrSwSNM
-----------------------------------------------------------2016.3.14更新------------------------------------------------------------
之前做的是windows上的便攜版,後面考慮到個人需求(就是沒有便攜的需求,hah)。所以在@Johnny Wu 大神的exVim基礎上加上了自己的一些配置後重新做了個安裝包(必須是64位系統), gvim默認支持lua和python,其他特性沒用到過。
已經集成了youcompleteme, 現在youcompleteme官方支持windows,只不過需要在自己電腦上編譯一下。 安裝好CMake,python2.7, vs2015,7-zip就好了=_=, 教程在 GitHub - Valloric/YouCompleteMe: A code-completion engine for Vim ,安裝過程,很簡單。 注意所有軟體必須是64位(ps: 有人用32位么?)

使用這個安裝包安裝完成後建議閱讀下安裝目錄下的說明文件。 祝使用愉快^_^

http://pan.baidu.com/s/1kUr09CV

-----------------------------------------------------------2014.12.1更新------------------------------------------------------------

(沒粉么~)

這次做了個帶YCM的便攜版本,代碼補全高亮文件樹語法檢查神馬功能的都有。

YCM配置容易掉進的坑:

1. 在XP下使用(本版本的clang經測試不行)。。

2. libclang/python/vim/ycm版本不匹配

3.YCM不支持python

4.MinGW/MinGW64的頭文件路徑不對/字元轉義沒做好/頭文件包含不全

5.YCM的配置文件沒設置對

╮(╯▽╰)╭且行且珍惜╮(╯▽╰)╭

-----------------------------gvim便攜版.7z_免費高速下載---------------------------------------------------------------------

沒圖沒真相:


搞定了一段時間了,用著挺爽的,於是在這裡發一下經驗。

首先你不知道ycm是什麼的自己google一下。

了解了以後你應該知道:在linux和os下這是一個基本上最牛逼的補全了,基於語義對c家族語言進行補全的感覺用了以後就不會再想忍受其他補全插件弱智般的補全(很多是打錯了還會一直記住你打錯的某個變數)

首先我默認你是用vundle管理你的插件,並且vim不要太過時。。7.38+的版本並且要有python支持。

其次我默認你現在在windows下開發並且沒有耐心自己去下載vs神馬的自己編譯ycm。像我一樣懶(我小規模的程序都是在windows下敲了)。並且我默認你已經把python.exe加入到了環境變數里。

那麼你應該看過Windows Installation Guide · Valloric/YouCompleteMe Wiki · GitHub這裡的guide,知道這裡有一個大牛編譯好的Haroogan / Vim YouCompleteMe for Windows。那麼你可以嘗試著點開看看,原來這裡是用的配套的vim和ycm。於是你下載了這裡的vim,然後到Haroogan / LLVM for Windows這裡來下載libclang.dll這個東西。。然後或許你就和我一樣卡住了,下出來的mingw里bin里找不到libclang.dll這貨。那麼你可以到樓上大牛發的網盤地址里去下載。windows上YoucompeleteMe完整包.rar_免費高速下載

你下載完了以後如果折騰過vim應該就會搞了,這裡面有配套的vim和ycm,但是沒有vimfiles這個文件夾和vimrc,你直接在vim目錄下自己創建一個,然后里面繼續創建一堆plugin之類的文件夾,之後你就可以裝上vundle了,在vundle下PluginInstall一下,只用把倉庫信息拷貝下來你就可以終止ycm安裝了,然後把下載到的ycm-for-windows覆蓋進裡面,然後你再把libclang.dll放進python文件夾里和core文件放一起(因為ycmcore文件里有引用libclang.dll來進行實時編譯你的代碼)然後你發現除了頭文件以外都可以補全了,但是頭文件很蛋疼地不能找到怎麼辦??

然後你就想起來在linux下搞ycm的時候為了使ycm更智能,自己去設置了一下補全的查找路徑。這裡果斷去修改.ycm_extra_conf.py文件啊,把裡面-I和-isystem項的目錄改成mingw中你要用到的gcc庫的地址(我是照著當時網上一個教程來改的vim 自動提示、自動補齊插件 YouCompleteMe for windows Gvim 安裝及使用效果但是這裡所有的都沒用轉義,而我在win8下路徑是""我當時沒有加轉義就果斷跪了...然後我按照經驗,應該在字元串前面加r就可以不用轉義,但是一直還是找不到文件,一度讓我遺漏了轉義這個問題,現在還是不解到底為毛r"some string\"這樣就不可以 = =)然後我去mingw里搜了一下stdio.h這個文件,卧槽,好多(其實也就五六個)!然後我當時選了一個以後回到vim里試,擦還是不行,然後我回頭打開那個stdio.h一看,尼瑪你居然引用了其他地方的stdio.h,逗我呢,我一怒之下把所有含stdio.h和iostream的都加了上去,我也分不清到底是-I還是-isystem,我就都加上了,然後回到vim,重新打開以後,乖乖,你總算消停了,至此ycm-for-windows就折騰好了~ 最後粘一下我的.ycm_extra_conf.py,需要的朋友拿去改一下路徑應該就可以用了。

import os
import ycm_core
flags = [
"-std=c++11",
"-stdlib=libc++",
"-Wno-deprecated-declarations",
"-Wno-disabled-macro-expansion",
"-Wno-float-equal",
"-Wno-c++98-compat",
"-Wno-c++98-compat-pedantic",
"-Wno-global-constructors",
"-Wno-exit-time-destructors",
"-Wno-missing-prototypes",
"-Wno-padded",
"-x",
"c++",
"c",
"-I",
".",
"-isystem",
"H:\Apps\TDM-GCC-64\i686-w64-mingw32\include",
"-I",
"H:\Apps\TDM-GCC-64\i686-w64-mingw32\include",
"-isystem",
"H:\Apps\TDM-GCC-64\lib\gcc\i686-w64-mingw32\4.8.1\include\c++",
"-isystem",
"H:Apps\TDM-GCC-64\lib\gcc\i686-w64-mingw32\4.8.1\include\c++\tr1",
"-isystem",
"H:\Apps\TDM-GCC-64\lib\gcc\i686-w64-mingw32\4.8.1\include\c++\i686-w64-mingw32\64",
"-isystem",
"H:\Apps\TDM-GCC-64\lib\gcc\i686-w64-mingw32\4.8.1\include\ssp",
"-isystem",
"H:\Apps\TDM-GCC-64\lib\gcc\i686-w64-mingw32\4.8.1\include\c++\i686-w64-mingw32",
"-I",
"H:\Apps\TDM-GCC-64\lib\gcc\i686-w64-mingw32\4.8.1\include\c++",
"-I",
"H:Apps\TDM-GCC-64\lib\gcc\i686-w64-mingw32\4.8.1\include\c++\tr1",
"-I",
"H:\Apps\TDM-GCC-64\lib\gcc\i686-w64-mingw32\4.8.1\include\c++\i686-w64-mingw32\64",
"-I",
"H:\Apps\TDM-GCC-64\lib\gcc\i686-w64-mingw32\4.8.1\include\ssp",
"-I",
"H:\Apps\TDM-GCC-64\lib\gcc\i686-w64-mingw32\4.8.1\include\c++\i686-w64-mingw32",
]
compilation_database_folder = ""
if compilation_database_folder:
database = ycm_core.CompilationDatabase( compilation_database_folder )
else:
database = None
SOURCE_EXTENSIONS = [ ".cpp", ".cxx", ".cc", ".c", ".m", ".mm" ]
def DirectoryOfThisScript():
return os.path.dirname( os.path.abspath( __file__ ) )
def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
if not working_directory:
return list( flags )
new_flags = []
make_next_absolute = False
path_flags = [ "-isystem", "-I", "-iquote", "--sysroot=" ]
for flag in flags:
new_flag = flag
if make_next_absolute:
make_next_absolute = False
if not flag.startswith( "/" ):
new_flag = os.path.join( working_directory, flag )
for path_flag in path_flags:
if flag == path_flag:
make_next_absolute = True
break
if flag.startswith( path_flag ):
path = flag[ len( path_flag ): ]
new_flag = path_flag + os.path.join( working_directory, path )
break
if new_flag:
new_flags.append( new_flag )
return new_flags
def IsHeaderFile( filename ):
extension = os.path.splitext( filename )[ 1 ]
return extension in [ ".h", ".hxx", ".hpp", ".hh" ]
def GetCompilationInfoForFile( filename ):
if IsHeaderFile( filename ):
basename = os.path.splitext( filename )[ 0 ]
for extension in SOURCE_EXTENSIONS:
replacement_file = basename + extension
if os.path.exists( replacement_file ):
compilation_info = database.GetCompilationInfoForFile( replacement_file )
if compilation_info.compiler_flags_:
return compilation_info
return None
return database.GetCompilationInfoForFile( filename )
def FlagsForFile( filename, **kwargs ):
if database:
compilation_info = GetCompilationInfoForFile( filename )
if not compilation_info:
return None
final_flags = MakeRelativePathsInFlagsAbsolute(
compilation_info.compiler_flags_,
compilation_info.compiler_working_dir_ )
else:
relative_to = DirectoryOfThisScript()
final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
return {
"flags": final_flags,
"do_cache": True
}


目前的 YCM 最新版本,可以在 Windows 上非常順利地編譯。你只要確保電腦上有:

1. Visual Studio 2015

2. CMake

3. Python 2.7 或 3.x

4. 7-zip

然後 clone YCM 的 GitHub 倉庫,直接運行 install.py --clang-completer 就能完成編譯。


認真攻略系列開始, 下面是乾貨

你需要

0. Git for windows

Git for Windows

1. 64位支持python的Vim,用這個tuxproject的

Vim 8.0.0013 builds for Windows

如何判斷是否支持python3,命令符輸入vim --version 看看裡面是否有+python3,如果是-python3則表示不支持

2. 安裝Vundle,具體步驟請看

https://github.com/VundleVim/Vundle.vim

3. 通過Vundle安裝YouCompleteMe

- Plugin Valloric/YouCompleteMe加入vimrc

- 啟動Vim,:e PluginInstall,等待安裝完成

4. 下載python3最新版本安裝,ycm官方推薦python3

Download Python

確認python安裝完成,命令符輸入py,看是否識別,如識別說明安裝成功。此步驟完成可能需要重啟

5. 下載安裝CMake,安裝過程中勾選加入path比較容易

Download | CMake

6. 下載安裝7zip,編譯ycm的時候需要用

Download

7. 下載安裝Visual Studio 2015 Community版本

所有下載 | Visual Studio

8. 打開VS2015,創建一個新C++ Project, 會提示你下載安裝C++ tools,選擇安裝,此過程需要每個盤符4GB空間

把msbuild路徑加入環境變數path

9. 這時你電腦里有以上所有,到YCM的路徑(默認為~/.vim/bundle/YouCompleteMe),運行

install.py (如果需要所有語言包括C系列的支持,換成install.py --all)

ps建議不要用--all,支持每種語言需要的其他軟體或lib,如需特定語言支持要去ycm看需要什麼其他軟體提前安裝。

結束,不好用找我。


Runtime Error!

Program: $VIMgvim.exe

R6034
An application has made an attempt to load the C runtime
library incorrectly.
Please contact the application"s support team for more
information.

可以參照下面這個帖子!

visual c++ - Runtime error R6034 in embedded Python application

最後我發現是syswow64下的msvcr90.dll在作祟!我把syswow64下的這個文件改了後綴名,就不報錯了。


github有已經編譯好的最新版本,親測可用.CuriousFu/YouCompleteMe-for-windows


授人以魚不如授人以漁,以下是我總結win下編譯安裝ycm的鏈接,希望對你有用。http://onetracy.com/2015/08/16/build_ycm_in_windows/


我也在gvim 裡面對這個插件研究了很久,然後發現有一步需要你的gvim支持python,

可以通過vim --version 查看,其中+的表示其支持的, -的表示不支持的。

一般在官網下載的gvim版本都是 -python的,也就是不支持python的

所以需要先下載源碼並修改,然後編譯使gvim支持python。

樓主如果成功了記得通知一下我,thx,我還在一步一步研究。


1,vim現在的版本默認是有python2支持的(gvim74_7.4.280.0.exe)(360下載),原來的Vim版本不支持.(不推薦使用上面完整包里的vim,因為其將顯示英文,直接用這個安裝就好.但是完整包還是要下載的.)

沒有python3支持.但不用重新編譯vim.

要將python2的路徑添加在python3之前.

libclang.dll加進python2裡面.

2,搜索百度網盤:"vim-ycm-733de48-windows-x86(20140904).zip".(重要)

解壓在bundle裡面就可以了.(上面的完整包里的ycm和這個裡面不一樣,我用上面的不行,這個可以),用的是pathogen的bundle.

3,修改ycm_extra_conf.py的配置,即添加幾個路徑.注意斜線問題.(就用上面那個修改一下

,如"-I",

"D:/Program Files/mingw-w64/i686-4.9.2-posix-dwarf-rt_v4-rev2/mingw32/include",

等)

4,在vimrc中設置配置.在csdn裡面搜索.或我的

ycmvimrc配置.txt.我也是小白,可能有不對的地方.請仔細.

5,下載llvm,mingw64(設置路徑CPLUS_INCLUDE_PATH,C_INCLUDE_PATH等).

YCM缺點是目前不能對文件里的中文進行自動補全(個人結果,不知道別人行不行.),

在中文路徑裡面是可以進行英文內容補全的,只能在最外層. 不能在括弧內部自動補全.


vim有兩個優點:

  1. 基本上任何環境中都可以用
  2. 精準地編輯操作,讓你感到對文本的完全控制

但是,這些同時也是vim的缺點,沒有針對桌面環境進行優化,控制權完全交給你,不會替你做決定,增加一堆插件也沒法彌補這些缺點。

如果用vim編輯多個文件,進行一些缺乏挑戰性的編輯操作,你會覺得很繁瑣很累。

所以,如果在桌面環境中寫lua腳本,大部分時間可以使用sublime類的編輯器,當需要精準地編輯操作時,啟動vim.


推薦閱讀:

如何將 Vim 剪貼板裡面的東西粘貼到 Vim 之外的地方?
Sublime Text 會取代 vim 或 emacs 嗎?
有哪些好用到爆的vim插件?
vim有哪些插件管理程序?都有些什麼特點?
如何使 Vim 下開發 Python 調試更方便?

TAG:Vim | Vim插件 |