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
"ÉÏÏÂ×óÓÒ¼üµÄÐÐΪ »áÏÔʾÆäËûÐÅÏ¢
inoremap
inoremap
inoremap
inoremap
"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
"nnoremap
"nnoremap
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
×÷Õߣºzhongcq