ºìÁªLinuxÃÅ»§
Linux°ïÖú

Vim×Ô¶¯²¹È«²å¼þ----YouCompleteMe°²×°ÓëÅäÖÃ

·¢²¼Ê±¼ä:2014-06-02 15:29:36À´Ô´:ºìÁª×÷Õß:velcbo
ʹÓÃVim±àд³ÌÐòÉÙ²»ÁËʹÓÃ×Ô¶¯²¹È«²å¼þ£¬ÔÚLinuxÏÂÓÐûÓÐÀàËÆVSÖеÄVisual Assist XÕâô·½±ã¿ì½ÝµÄ²¹È«²å¼þÄØ£¿ÒÔǰÓõÄÊÇneocomplcache+code_complete+omnicppcomplete,µ«Ð§¹û»¹ÊDz»ÊǺܺ᣿´µ½ÓÐYCMºóÇ°ÃæµÄ²å¼þ¿ÉÒÔ˵°Ý°ÝÁË¡£

YouCompleteMe:Ò»¸öËæ¼ü¶øÈ«µÄ¡¢Ö§³ÖÄ£ºýËÑË÷µÄ¡¢¸ßËÙ²¹È«µÄ²å¼þ¡£YCM ÓÉ google ¹«Ë¾ËÑË÷ÏîÄ¿×éµÄÈí¼þ¹¤³Ìʦ Strahinja Val Markovic Ëù¿ª·¢,YCM ºó¶Ëµ÷Óà libclang(ÒÔ»ñÈ¡AST,µ±È»»¹ÓÐÆäËûÓïÑÔµÄÓïÒå·ÖÎö¿â)¡¢Ç°¶ËÓÉ C++ ¿ª·¢(ÒÔÌáÉý²¹È«Ð§ ÂÊ)¡¢Íâ²ãÓÉ python ·â×°(ÒÔ³ÉΪ vim ²å¼þ),Ëü¿ÉÄÜÊÇÎÒ¼û¹ý°²×°×Ô vim ²å¼þÁË¡£

YouCompleteMeÒªÇóVim°æ±¾7.3.584+,Ç°ÃæÒѾ­½éÉÜÁ˱àÒë°²×°Vim7.4·½·¨¡£ ͬʱYouCompleteMeÒªÇóclang°æ±¾Îª3.3ÒÔÉÏ¡£Èç¹ûÏë»ñÈ¡×îеÄclang¿ÉÒÔʹÓÃSVN,°´ÕÕÆä¹ÙÍøÉϽéÉܵķ½·¨±àÒë°²×°¡£ÎÒÃÇÕâÀï½éÉÜÔ´Âë±àÒë°²×°clang3.3¡£
Ŀ¼

Vim×Ô¶¯²¹È«²å¼þ----YouCompleteMe°²×°ÓëÅäÖÃ
±àÒë°²×°IIvm-clang3.3
°²×°clang±ê×¼¿â
°²×°ÅäÖÃYouCompleteMe

±àÒë°²×°llvm-clang3.3

ÏÈÏÂÔØÈçÏÂ4¸öÔ´Â룺 llvm-3.3Ô´Âë clang-3.3Ô´Âë clang-tools-extra-3.3Ô´Âë compiler-rt-3.3Ô´Âë ½¨Á¢Ä¿Â¼£º

mkdir ~/llvm-clang

·Ö±ð½âѹÉÏÃæÏÂÔØµÄ4¸öÎļþµ½ÉÏÊöĿ¼

tar -xvzf llvm-3.3.src.tar.gz

tar -xvzf compiler-rt-3.3.src.tar.gz

tar -xvzf clang-tools-extra-3.3.src.tar.gz

tar -xvzf cfe-3.3.src.tar.gz

ÔÙ½«¹¤¾ßÒÆ¶¯µ½llvmµÄÏàӦĿ¼ÏÂ,ʹµÃclang£¬clang-tools-extraºÍcompiler-rt¾Í¿ÉÒÔºÍllvmÒ»Æð±àÒëÁË£º

mv cfe-3.3.src/ llvm-3.3.src/tools/clang/

mv clang-tools-extra-3.3.src/ llvm-3.3.src/tools/clang/extra/

mv compiler-rt-3.3.src/ llvm-3.3.src/projects/compiler-rt/

ÏÂÔØ×îеÄLLVM¡¢clang ¼°¸¨Öú¿âÔ´Âë¿ÉÓÃ:

cd ~/llvm-clang
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../..
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
cd ../../../..
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
cd ..

·µ»Ø~/llvm-clangĿ¼£¬²¢Ð½¨Ò»¸öĿ¼llvm-buildרÃÅÓÃÓÚ±àÒëllvm-clang£¬Ê¹µÃ²»ÎÛȾԴÂë¡£

mkdir llvm-build

cd llvm-build/

../llvm-3.3.src/configure --enable-optimized

½¨Á¢±àÒë»·¾³

´ËÖÖÅäÖúó£¬llv-clangĬÈϰ²×°µ½Ä¿Â¼ /usr/local/ Ï£¬ Èç¹ûÏë¸Ä±ä°²×°Ä¿Â¼£¬Ôò¼ÓÉÏÅäÖ㺠--prefix=Path À´Öƶ¨ ÊäÈë make -j4

(±¾ÈË»úÆ÷Ϊ˫ºË£©¿ªÊ¼±àÒë

sudo make install

½øÐа²×°

ÈçÒªÐ¶ÔØÔòÔÚ¸ÃĿ¼ÏÂÊäÈë

sudo make uninstall

°²×°ºÃºó£¬ÊäÈë clang -v²é¿´°æ±¾ÐÅÏ¢£º
°²×°clang±ê×¼¿â

clang µÄ±ê×¼¿â--------libc++(½Ó¿Ú²ã)ºÍ libc++abi(ʵÏÖ²ã)ÐèÒª°²×°Í·ÎļþºÍ¶¯Ì¬Á´½Ó¿â(*.so)¡£

°²×°libc++

cd ~/llvm-clang
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
cd libcxx/lib
./buildit

Í·ÎļþÒѾ­Éú³Éµ½ ~/llvm-clang/libcxx/include/,ÒªÈà clang ÕÒµ½±ØÐë¸´ÖÆµ½ /usr/include/c++/v1/

cp -r ~/llvm-clang/libcxx/include/ /usr/include/c++/v1/

*.so ÎļþÒÑÉú³É ~/llvm-clang/libcxx/lib/libc++.so.1.0,ÒªÈà clang ·ÃÎʱØÐ븴 ÖÆµ½ /usr/lib/,²¢´´½¨ÈíÁ´½Ó

ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.so.1
ln -s ~/llvm-clang/libcxx/lib/libc++.so.1.0 ~/llvm-clang/libcxx/lib/libc++.so
cp ~/dllvm-clang/libcxx/lib/libc++.so* /usr/lib/

ÀàËÆ,Ô´Âë°²×° libc++abi µÄÍ·ÎļþºÍ¶¯Ì¬Á´½Ó¿â:

cd ~/llvm-clang/
svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
cd libcxxabi/lib
./buildit

Í·ÎļþÒѾ­Éú³Éµ½ ~/llvm-clang/libcxxabi/include/,ÒªÈà clang ÕÒµ½±ØÐë¸´ÖÆµ½ /usr/include/c++/v1/

cp -r ~/llvm-clang/libcxxabi/include/ /usr/include/c++/v1/

*.so ÎļþÒÑÉú³É ~/llvm-clang/libcxx/lib/libc++abi.so.1.0,ÒªÈà clang ·ÃÎ汯 Ðë¸´ÖÆµ½ /usr/lib/,²¢´´½¨ÈíÁ´½Ó

ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.so.1

ln -s ~/llvm-clang/libcxxabi/lib/libc++abi.so.1.0 ~/llvm-clang/libcxxabi/lib/libc++abi.so

cp ~/llvm-clang/libcxxabi/lib/libc++abi.so* /usr/lib/

ºóÐø¿ÉÒÔͨ¹ýÈçÏÂÑ¡Ïî½øÐдúÂë±àÒë:

clang++ -std=c++11 -stdlib=libc++ -Werror -Weverything -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 -lc++ -lc++abi main.cpp

²ÎÊý˵Ã÷£º

-std=c++11: ʹÓà C++11 ÐÂÌØÐÔ;
-stdlib=libc++: Ö¸¶¨Ê¹Óà clang µÄ±ê×¼¿âÍ·Îļþ /usr/include/c++/v1/;
-Werror: ½«ËùÓбàÒ뾯¸æÊÓΪ±àÒë´íÎó;
-Weverything: ´ò¿ªËùÓбàÒ뾯¸æÑ¡Ïî¡£ÔÚ GCC ÖÐ,ÎÞ·¨Í¨¹ýµ¥¸öÑ¡Ïî´ò¿ªËùÓÐ ±àÒ뾯¸æ,±ØÐë·±ËöµÄͬʱָ¶¨ -Wall¡¢-Wextra¡¢ÒÔ¼°´óÁ¿·ÖÉ¢µÄÆäËûÑ¡Ïî,Ϊ´Ëclang ÐÂÔöÁË -Weverything¡£µ±È»,ÓÐЩ¾¯¸æÒâÒå²»´ó,ÍêÈ«¿ÉºöÂÔ,ÈçÏÂ;
-Wno-disabled-macro-expansion:½ûֹʹÓúê±í´ïʽ,ºöÂԴ˾¯¸æ;
-Wno-float-equal:¸¡µãÀàÐͲ»Ó¦Ê¹Óà != ºÍ == ÔËËã·û,ºöÂԴ˾¯¸æ;
-Wno-c++98-compat¡¢-Wno-c++98-compat-pedantic:²ÉÓà C++11 ÐÂÌØÐԵĴú ÂëÎÞ·¨¼æÈÝ C++98,ºöÂԴ˾¯¸æ;
-Wno-global-constructors:ÔÚ main() ֮ǰ´æÔÚÖ´ÐеĴúÂë,ºöÂԴ˾¯¸æ;
-Wno-exit-time-destructors:ÔÚ main() Ö®ºó´æÔÚÖ´ÐеĴúÂë,ºöÂԴ˾¯¸æ;
-Wno-missing-prototypes:ËäÓк¯Êý¶¨Ò嵫ȱʧº¯ÊýÔ­ÐÍ,ºöÂԴ˾¯¸æ;
-Wno-padded:½á¹¹Ìå´óСӦΪ 4 ×Ö½ÚÕûÊý±¶,ºöÂԴ˾¯¸æ(±àÒëÆ÷×Ô¶¯µ÷Õû¶ÔÆë ±ß½ç);
-lc++:Ö¸¶¨Á´½Ó /usr/lib/libc++.so ±ê×¼¿â;
-lc++abi:Ö¸¶¨Á´½Ó /usr/lib/libc++abi.so ±ê×¼¿â¡£×¢Òâ:ÕâÁ½¸öÑ¡Ïî·Ç³£ÖØ Òª,ȱʧ½«µ¼ÖÂÁ´½Óʧ°Ü!

ÕâЩ²ÎÊýÔÚYouCompleteMeµÄÅäÖÃÎļþ.ycm_extra_conf.pyµÄflagsÖÐÉèÖÃ
°²×°ÅäÖÃYouCompleteMe

ÏÂÔØÔ´Â롣ʹÓÃvundle¸ã¶¨£¬ÔÚvimrcÎļþÖмÓÈë
Bundle 'Valloric/YouCompleteMe'
Ö´ÐÐÃüÁ

$ cd ~
$ mkdir ~/ycm_build
$ cd ~/ycm_build
$ cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBclang=ON -DEXTERNAL_LIBCLANG_PATH=CLANG_INSTALL_PATH/libclang.so . ~/.vim/bundle/YouCompleteMe/cpp

ÔÚYouCompleteMeÖÐÉú³Élibclang.soºÍycm_core.soÎļþ
Ö´ÐÐ make ycm_core£¬ÕâÑù½«ÔÚ~/.vim/bundle/YouCompleteMe/python/Ŀ¼ÏÂ×Ô¶¯Éú³ÉÁ½¸öÎļþ(libclang.soºÍycm_core.so)
Õ⻹ÊDz»¹»µÄ£¬»¹±ØÐëÖ´ÐÐÃüÁmake ycm_support_libs¡£ ÕâÌõÃüÁî²Å»áÉú³ÉµÚÈý¸öÎļþycm_client_support.so¡£ÒòΪ£¬YouCompleteMeÊÇC/S¼Ü¹¹µÄ£¬ËùÒÔ´æÔÚ·þÎñÆ÷ºÍ·þÎñ¶ËµÄ˵·¨¡£
×îºóÉèÖÃ.ycm_extra_conf.pyÎļþ¡£
ÔÚ.vimrcÖÐÌí¼ÓÅäÖãº

" ×Ô¶¯²¹È«ÅäÖÃ
set completeopt=longest,menu "ÈÃVimµÄ²¹È«²Ëµ¥ÐÐΪÓëÒ»°ãIDEÒ»ÖÂ(²Î¿¼VimTip1228)
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "À뿪²åÈëģʽºó×Ô¶¯¹Ø±ÕÔ¤ÀÀ´°¿Ú
inoremap pumvisible() ? "\" : "\" "»Ø³µ¼´Ñ¡Öе±Ç°Ïî
"ÉÏÏÂ×óÓÒ¼üµÄÐÐΪ »áÏÔʾÆäËûÐÅÏ¢
inoremap pumvisible() ? "\" : "\"
inoremap pumvisible() ? "\" : "\"
inoremap pumvisible() ? "\\\" : "\"
inoremap pumvisible() ? "\\\" : "\"

"youcompleteme ĬÈÏtab s-tab ºÍ×Ô¶¯²¹È«³åÍ»
"let g:ycm_key_list_select_completion=['']
let g:ycm_key_list_select_completion = ['']
"let g:ycm_key_list_previous_completion=['']
let g:ycm_key_list_previous_completion = ['']
let g:ycm_confirm_extra_conf=0 "¹Ø±Õ¼ÓÔØ.ycm_extra_conf.pyÌáʾ

let g:ycm_collect_identifiers_from_tags_files=1 " ¿ªÆô YCM »ùÓÚ±êÇ©ÒýÇæ
let g:ycm_min_num_of_chars_for_completion=2 " ´ÓµÚ2¸ö¼üÈë×Ö·û¾Í¿ªÊ¼ÂÞÁÐÆ¥ÅäÏî
let g:ycm_cache_omnifunc=0 " ½ûÖ¹»º´æÆ¥ÅäÏî,ÿ´Î¶¼ÖØÐÂÉú³ÉÆ¥ÅäÏî
let g:ycm_seed_identifiers_with_syntax=1 " Óï·¨¹Ø¼ü×Ö²¹È«
nnoremap :YcmForceCompileAndDiagnostics "force recomile with syntastic
"nnoremap lo :lopen "open locationlist
"nnoremap lc :lclose "close locationlist
inoremap
"ÔÚ×¢ÊÍÊäÈëÖÐÒ²Äܲ¹È«
let g:ycm_complete_in_comments = 1
"ÔÚ×Ö·û´®ÊäÈëÖÐÒ²Äܲ¹È«
let g:ycm_complete_in_strings = 1
"×¢ÊͺÍ×Ö·û´®ÖеÄÎÄ×ÖÒ²»á±»ÊÕÈ벹ȫ
let g:ycm_collect_identifiers_from_comments_and_strings = 0

nnoremap jd :YcmCompleter GoToDefinitionElseDeclaration " Ìø×ªµ½¶¨Òå´¦

×÷Õߣºzhongcq
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ