pythoncscope
㈠ 如何在VIM中指定python解釋器版本
你可能不想(或至少不應該) code> python3 作為vim的默認python解釋器,因為你的插件的一些(大部分)將變得不兼容,例如 YouCompleteMe 和 clang_complete 本身,因為他們沒有 python3 支持。通常,支持 python3 的插件可以讓您決定是否要通過添加到 .vimrc
let g:syntastic_python_python_exec ='python3'
解決方案: :echo has('python')顯示 0 實際上告訴你vim可能不是用 python2 編譯的。所以首先檢查 vim --version 的輸出,你應該能夠看到你的編譯器構建vim的共享庫列表。你看到以下? (例如對於python 2.7):
-L / usr / lib / python2.7 / config-x86_64-linux-gnu - lpython2.7
如果沒有(或者如果你看到 -lpython2.x 和 -lpython3.x 我建議你從源代碼編譯vim,具體鏈接到 -lpython2.x
sudo apt-get remove --purge vim vim-runtime vim-gnome vim-tiny vim-common vim-gui-common
clone vim mercurial
hg clone htvim/
cd vim
,然後使用以下標志運行 ./ configure :
./configure --with-features = huge \
--enable-cscope \
--enable-pythoninterp \
--enable-largefile \
--with-python-config-dir = / usr / lib / python2.7 / config
您還可能想要鏈接 ruby 和 lua 如果需要,然後最後運行
make build
make install
這里是shell腳本,將自動執行整個過程為你。這可能有點過分,但我認為這是你應該如何處理這不與運行與您的未來包的兼容性問題。
㈡ 電腦上有vim. 怎麼看電腦上看有沒有make
1、下載源碼包:
1
到官網下載vim,下載的版本
END
2、准備庫文件:
1
libXt-devel
ncurses-devel
確認是否已安裝,未安裝就必須安裝,
END
3、解壓文件:
1
cd到源碼文件放置的目錄,然後執行下面的指令:
mkdir -p ~/downloads/vim
tar –xjv -f vim-7.4.tar.bz2 -C ~/downloads/vim
如下圖所示:
END
4、生成Makefile文件:
1
cd ~/downloads/vim/ vim74/src
./configure --prefix=/usr/local/software/vim --with-features=huge --enable-gui=auto --enable-multibyte --enable-fontset --enable-rubyinterp=yes --enable-pythoninterp=yes --enable-perlinterp=yes --enable-luainterp=yes --enable-tclinterp --enable-cscope
如下圖所示:
2
參數說明如下:
--prefix=/usr/local/software/vim:編譯安裝路徑(你可以自定義)
--with-features=huge:支持最大特性
--enable-gui= auto:表示生成gvim
--enable-multibyte:啟用多位元組支持,即可以在Vim中輸入中文
--enable-fontset:啟用對X 字體集輸出的支持
--enable-rubyinterp=yes:啟用Vim對ruby編寫的插件的支持
--enable-pythoninterp=yes:啟用Vim對python編寫的插件的支持
--enable-perlinterp=yes:啟用Vim對perl編寫的插件的支持
--enable-luainterp=yes:啟用Vim對lua編寫的插件的支持
--enable-tclinterp:啟用Vim對tcl編寫的插件的支持
--enable-cscope:Vim對cscope支持
注意有的—enable-XXX選項後需要加yes
如要查看其它未使用參數的說明,用如下的命令:
./configure --help
END
5、編譯源碼:
1
make
END
6、安裝vim:
1
make install
END
7、測試是否安裝成功:
cd /usr/local/software/vim/bin/
./gvim
成功啟動後,輸入
:version
回車後查看版本,如果是7.4,說明安裝成功
接下來就是把【usr/local/software/vim/bin/】加入到PATH變數中,方法很簡單,在此不再贅述。
㈢ 為啥vim和gvim對python的支持不一樣
有人在realpython.com宣揚Sublime Text 3。作為公司的資深開發人員(呃,也就是老古董),我覺得有義務介紹一個真正的Python開發環境給大家——我要推薦的當然就是Vim了。不錯,Vim編輯器無處不在,速度快,從來不會崩潰。並且,它能做任何事情!
不過,不利之處也有,就是Vim配置起來很讓人頭疼。但是,別擔心,本文將告訴你如何配置一個強大的Vim環境,專門用於天天搗鼓Python開發。
下面是最終效果預覽。
如果想充分地利用好本文,你應該對如何使用Vim和它的命令模式至少有一個基本的了解。如果你是初學者,你可以通過vim-adventure或者openvim網站學習。在繼續閱讀本文之前,請花點時間瀏覽那兩個網站的內容。
安裝
因為許多Unix衍生系統已經預裝了Vim,我們首先要確認編輯器是否成功安裝:
vim --version
如果已經安裝了,你應該看到類似下面的文字:
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Nov 5 2014 21:00:28)
Compiled by [email protected]
Normal version without GUI. Features included (+) or not (-):
-arabic +autocmd -balloon_eval -browse +builtin_terms +byte_offset +cindent
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
-conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con +diff +digraphs
-dnd -ebcdic -emacs_tags +eval +ex_extra +extra_search -farsi +file_in_path
+find_in_path +float +folding -footer +fork() -gettext -hangul_input +iconv
+insert_expand +jumplist -keymap -langmap +libcall +linebreak +lispindent
+listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape
-mouse_dec -mouse_gpm -mouse_jsbterm -mouse_netterm -mouse_sysmouse
+mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg -osfiletype
+path_extra -perl +persistent_undo +postscript +printer -profile +python/dyn
-python3 +quickfix +reltime -rightleft +ruby/dyn +scrollbind +signs
+smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary
+tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title
-toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo
+vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp
-xterm_clipboard -xterm_save
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
user exrc file: "$HOME/.exrc"
fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -D_FORTIFY_SOURCE=0 -Iproto -DHAVE_CONFIG_H -arch i386 -arch x86_64 -g -Os -pipe
Linking: gcc -arch i386 -arch x86_64 -o vim -lncurses
在這一步,你要確保已經滿足以下兩點要求:
Vim編輯版本應該大於7.3。
支持Python語言。在所選編輯器的功能中,確保你看到了+python。
如果滿足上述要求,接下來可以安裝Vim擴展了。如果不滿足,則需要安裝/升級。
Unix衍生系統
Debian或Ubuntu系統,可以使用下面的代碼:
sudo apt-get remove vim-tiny
apt-get update
apt-get install vim
如果是其他版本的Linux系統,請查閱相應版本包管理器的文檔。不清楚的話,可以先閱讀這篇文章:安裝Vim
驗證安裝
確保你已經安裝了7.3版本以上、支持Python的Vim編輯器。你可以再次運行vim --version進行確認。如果你想知道Vim中使用的Python版本,你可以在編輯器中運行:python import sys; print(sys.version)。
2.7.6 (default, Sep 9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)]
這行命令會輸出你的編輯器當前的Python版本。如果報錯,那麼你的編輯器就不支持Python語言,需要重裝或重新編譯。
Vim編輯器安裝完成後,我們來看看如何將其設置為Python開發的強大環境。
Vim擴展
Vim本身能夠滿足開發人員的很多需求,但是它的可擴展性也極強,並且已經有一些殺手級的擴展,可以讓Vim擁有「現代」集成開發環境的特性。所以,你所需要的第一件東西就是一個好用的擴展管理器。
Vim的擴展通常也被成為bundle或插件。
Vundle
Vim有多個擴展管理器,但是我們強烈推薦Vundle。你可以把它想像成Vim的pip。有了Vundle,安裝和更新包這種事情不費吹灰之力。
我們現在來安裝Vundle:
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
該命令將下載Vundle插件管理器,並將它放置在你的Vim編輯器bundles文件夾中。現在,你可以通過.vimrc配置文件來管理所有擴展了。
將配置文件添加到你的用戶的home文件夾中:
touch ~/.vimrc
接下來,把下來的Vundle配置添加到配置文件的頂部:
set nocompatible " required
filetype off " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')
" let Vundle manage Vundle, required
Plugin 'gmarik/Vundle.vim'
" Add all your plugins here (note older versions of Vundle used Bundle instead of Plugin)
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
這樣,你就完成了使用Vundle前的設置。之後,你就可以在配置文件中添加希望安裝的插件,然後打開Vim編輯器,運行下面的命令:
:PluginInstall
這個命令告訴Vundle施展它的魔法——自動下載所有的插件,並為你進行安裝和更新。
開始打造IDE吧
本文不可能列舉Vim的全部功能,只能快速介紹一些Vim自帶的強大功能,它們對於Python開發來說是非常有用的。
扔掉滑鼠
或許,Vim編輯器最重要的功能就是它不要求使用滑鼠(除了GUI版本外)。一開始,你可能會覺得這是個非常糟糕的做法,但是只要你投入時間——是的,這很花時間——學習快捷組合鍵,就可以大幅提升工作流的速度。
分割布局(Split Layouts)
使用:sv <filename>命令打開一個文件,你可以縱向分割布局(新文件會在當前文件下方界面打開),使用相反的命令:vs <filename>, 你可以得到橫向分割布局(新文件會在當前文件右側界面打開)。
你還可以嵌套分割布局,所以你可以在分割布局內容再進行分割,縱向或橫向都可以,直到你滿意為止。眾所周知,我們開發時經常需要同時查看多個文件。
專業貼士:記得在輸入完:sv後,利用tab補全功能,快速查找文件。
專業貼士:你還可以指定屏幕上可以進行分割布局的區域,只要在.vimrc文件中添加下面的代碼即可:
set splitbelow
set splitright
專業貼士:想要不使用滑鼠就切換分割布局嗎?只要將下面的代碼添加到.vimrc文件中,你就可以通過快捷組合鍵進行切換。
"split navigations
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>
組合快捷鍵:
Ctrl-j 切換到下方的分割窗口
Ctrl-k 切換到上方的分割窗口
Ctrl-l 切換到右側的分割窗口
Ctrl-h 切換到左側的分割窗口
換句話說, 按Ctrl+Vim的標准移動鍵,就可以切換到指定窗口。
等等,nnoremap是什麼意思?——簡單來說,nnoremap將一個組合快捷鍵映射為另一個快捷鍵。一開始的n,指的是在Vim的正常模式(Normal Mode)下,而不是可視模式下重新映射。基本上,nnoremap <C-J> <C-W><C-j>就是說,當我在正常模式按下<C-J>時,進行<C-W><C-j>操作。更多信息請看這里。
緩沖區(Buffers)
雖然Vim支持tab操作,仍有很多人更喜歡緩沖區和分割布局。你可以把緩沖區想像成最近打開的一個文件。Vim提供了方便訪問近期緩沖區的方式,只需要輸入:b <buffer name or number>,就可以切換到一個已經開啟的緩沖區(此處也可使用自動補全功能)。你還可以通過ls命令查看所有的緩沖區。
專業貼士: 在:ls命令輸出的最後,Vim會提示「敲擊Enter繼續查看」,這時你可以直接輸入:b <buffer name>,立即選擇緩沖區。這樣可以省掉一個按鍵操作,也不必去記憶緩沖區的名字。
代碼折疊(Code Folding)
大多數「現代」集成開發環境(IDE)都提供對方法(methods)或類(classes)進行折疊的手段,只顯示類或方法的定義部分,而不是全部的代碼。
你可以在.vimrc中添加下面的代碼開啟該功能:
" Enable folding
set foldmethod=indent
set foldlevel=99
這樣就可以實現,但是你必須手動輸入za來折疊(和取消折疊)。使用空格鍵會是更好的選擇。所以在你的配置文件中加上這一行命令吧:
" Enable folding with the spacebar
nnoremap <space> za
現在你可以輕松地隱藏掉那些當前工作時不需要關注的代碼了。
第一個命令,set foldmethod=ident會根據每行的縮進開啟折疊。但是這樣做會出現超過你所希望的折疊數目。但是別怕,有幾個擴展就是專門解決這個問題的。在這里,我們推薦SimplyFold。在.vimrc中加入下面這行代碼,通過Vundle進行安裝:
Plugin 'tmhedberg/SimpylFold'
不要忘記執行安裝命令::PluginInstall
專業貼士: 希望看到折疊代碼的文檔字元串?
let g:SimpylFold_docstring_preview=1
Python代碼縮進
當然,想要代碼折疊功能根據縮進情況正常工作,那麼你就會希望自己的縮進是正確的。這里,Vim的自帶功能無法滿足,因為它實現不了定義函數之後的自動縮進。我們希望Vim中的縮進能做到以下兩點:
首先,縮進要符合PEP8標准。
其次,更好地處理自動縮進。
PEP8
要支持PEP8風格的縮進,請在.vimrc文件中添加下面的代碼:
au BufNewFile,BufRead *.py
\ set tabstop=4
\ set softtabstop=4
\ set shiftwidth=4
\ set textwidth=79
\ set expandtab
\ set autoindent
\ set fileformat=unix
這些設置將讓Vim中的Tab鍵就相當於4個標準的空格符,確保每行代碼長度不超過80個字元,並且會以unix格式儲存文件,避免在推送到Github或分享給其他用戶時出現文件轉換問題。
另外,對於全棧開發,你可以設置針對每種文件類型設置au命令:
au BufNewFile,BufRead *.js, *.html, *.css
\ set tabstop=2
\ set softtabstop=2
\ set shiftwidth=2
自動縮進
自動縮進有用,但是在某些情況下(比如函數定義有多行的時候),並不總是會達到你想要的效果,尤其是在符合PEP8標准方面。我們可以利用indentpython.vim插件,來解決這個問題:
Plugin 'vim-scripts/indentpython.vim'
標示不必要的空白字元
我們希望避免出現多餘的空白字元。可以讓Vim幫我們標示出來,使其很容易發現並刪除。
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/
這會將多餘的空白字元標示出來,很可能會將它們變成紅色突出。
支持UTF-8編碼
大部分情況下,進行Python開發時你應該使用UTF-8編碼,尤其是使用Python 3的時候。確保Vim設置文件中有下面的命令:
set encoding=utf-8
自動補全
支持Python自動補全的最好插件是YouCompleteMe。我們再次使用Vundle安裝:
Bundle 'Valloric/YouCompleteMe'
YouCompleteMe插件其實底層使用了一些不同的自動補全組件(包括針對Python開發的Jedi),另外要安裝一些C庫才能正常工作。插件官方文檔提供了很好的安裝指南,我就不在這里重復了。切記跟隨文檔的步驟進行安裝。
安裝完成後,插件自帶的設置效果就很好,但是我們還可以進行一些小的調整:
let g:ycm_autoclose_preview_window_after_completion=1
map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR>
上面的第一行確保了在你完成操作之後,自動補全窗口不會消失,第二行則定義了「轉到定義」的快捷方式。
支持Virtualenv虛擬環境
上面「轉到定義」功能的一個問題,就是默認情況下Vim不知道virtualenv虛擬環境的情況,所以你必須在配置文件中添加下面的代碼,使得Vim和YouCompleteMe能夠發現你的虛擬環境:
"python with virtualenv support
py << EOF
import os
import sys
if 'VIRTUAL_ENV' in os.environ:
project_base_dir = os.environ['VIRTUAL_ENV']
activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
EOF
這段代碼會判斷你目前是否在虛擬環境中編輯,然後切換到相應的虛擬環境,並設置好你的系統路徑,確保YouCompleteMe能夠找到相應的site packages文件夾。
語法檢查/高亮
通過安裝syntastic插件,每次保存文件時Vim都會檢查代碼的語法:
Plugin 'scrooloose/syntastic'
還可以通過這個小巧的插件,添加PEP8代碼風格檢查:
Plugin 'nvie/vim-flake8'
最後,讓你的代碼變得更漂亮:
let python_highlight_all=1
syntax on
配色方案
配色方案可以和你正在使用的基礎配色共同使用。GUI模式可以嘗試solarized方案, 終端模式可以嘗試Zenburn方案:
Plugin 'jnurmine/Zenburn'
Plugin 'altercation/vim-colors-solarized'
接下來,只需要添加一點邏輯判斷,確定什麼模式下使用何種方案就可以了:
if has('gui_running')
set background=dark
colorscheme solarized
else
colorscheme Zenburn
endif
Solarized方案同時提供了暗色調和輕色調兩種主題。要支持切換主題功能(按F5)也非常簡單,只需添加:
call togglebg#map("<F5>")
文件瀏覽
如果你想要一個不錯的文件樹形結構,那麼NERDTree是不二之選。
Plugin 'scrooloose/nerdtree'
如果你想用tab鍵,可以利用vim-nerdtree-tabs插件實現:
Plugin 'jistr/vim-nerdtree-tabs'
還想隱藏.pyc文件?那麼再添加下面這行代碼吧:
let NERDTreeIgnore=['\.pyc$', '\~$'] "ignore files in NERDTree
超級搜索
想要在Vim中搜索任何文件?試試ctrlP插件吧:
Plugin 'kien/ctrlp.vim'
正如插件名,按Ctrl+P就可以進行搜索。如果你的檢索詞與想要查找的文件相匹配的話,這個插件就會幫你找到它。哦,對了——它不僅僅可以搜索文件,還能檢索標簽!更多信息,可以觀看這個Youtube視頻.
顯示行號
開啟顯示行號:
set nu
Git集成
想要在Vim中執行基本的Git命令?vim-fugitive插件則是不二之選。
Plugin 'tpope/vim-fugitive'
請看Vimcasts的這部視頻,了解更多情況。
Powerline狀態欄
Powerline是一個狀態欄插件,可以顯示當前的虛擬環境、Git分支、正在編輯的文件等信息。
這個插件是用Python編寫的,支持諸如zsh、bash、tmux和IPython等多種環境。
Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}
請查閱插件的官方文檔,了解配置選項。
系統剪貼板
通常Vim會忽視系統剪貼板,而使用自帶的剪貼板。但是有時候你想從Vim之外的程序中剪切、復制、粘貼文本。在OS X平台上,你可以通過這行代碼訪問你的系統剪貼板:
set clipboard=unnamed
Shell開啟Vim編輯模式
最後,當你熟練掌握了Vim和它的鍵盤快捷方式之後,你會發現自己經常因為shell中缺乏相同的快捷鍵而懊惱。沒關系,大部分的shell程序都有Vi模式。在當前shell中開啟Vi模式,你只需要在~/.inputrc文件中添加這行代碼:
set editing-mode vi
現在,你不僅可以在shell中使用Vim組合快捷鍵,還可以在Python解釋器以及任何利用GNU Readline程序的工具(例如,大多數的資料庫shell)中使用。現在,你在什麼地方都可以使用Vim啦!
結語
Vim的設置到這里就差不多了(至少對於Python開發來說是這樣的)。當然,開源世界裡還有大量你可以使用的其他擴展,以及本文中所提到插件的替代品。你最喜愛的擴展是什麼?你又是如何將Vim設置符合你喜好的?
這是我本人的Vim配置文件鏈接。你有沒有自己的設置代碼?請與我們分享!
謝謝!
資源
Vim Tutor是Vim自帶的程序,安裝結束之後,只要在命令行輸入vimtutor即可,程序將會用Vim編輯器教你如何使用Vim。
Vimcasts是一系列的高階視頻教程,內容涉及許多Vim的功能。
Vim官方文檔
Open Vim
笨辦法學Vimscript是學習vimscript的極好材料。
㈣ 你用過的最好的代碼閱讀或編輯工具是什麼
從前讀/寫C程序時是ctags/cscope+vim。
後來很長一段時間接觸java/Python代碼。都是直接在Finder里找到文件,用MacVim打開文件閱讀代碼。偶爾也用用Ack。
新加入團隊這段時間純Python,用Vim+NerdTree+Ack閱讀編輯代碼。
----------------------------------------------
由於閱讀別人項目的代碼通常帶有目的性,而自己又會有幾下定位到文件的狗屎運,因此連cscope之類的東西都懶得配置了。寫代碼方面也沒配任何的OmniComplete,甚至通常映射C-n的<tab>都取消掉了。這樣的好處除了會強制減少介面命名的歧義外,就比較練記憶力。
㈤ youcompleteme ctags/cscope 哪個好
YouCompleteMe的特別之處
基於語義補全
總所周知,Vim是一款文本編輯器。也就是說,其最基礎的工作就是編輯文本,而不管該文本的內容是什麼。在Vim被程序員所使用後,其慢慢的被肩負了與IDE一樣的工作,文本自動補全(ie.acp,omnicppcompleter),代碼檢查(Syntastic)等等工作。
針對文本自動補全這個功能來說,主要有兩種實現方式。
基於文本
我們常用的omnicppcompleter,acp,vim自帶的c-x, c-n的實現方式就是基於文本。更通俗的說法,其實就是一個字:
猜
其通過文本進行一些正則表達式的匹配,再根據生成的tags(利用ctags生成)來實現自動補全的效果。
基於語義
顧名思義,其是通過分析源文件,經過語法分析以後進行補全。由於對源文件進行分析,基於語義的補全可以做到很精確。但是這顯然是vim所不可能支持的。而且經過這么多年發展,由於語法分析有很高的難度,也一直沒有合適的工具出現。直到,由apple支持的clang/llvm橫空出世。YouCompleteMe也正是在clang/llvm的基礎上進行構建的。
整合實現了多種插件
clang_complete
AutoComplPop
Supertab
neocomplcache
Syntastic(類似功能,僅僅針對c/c++/obj-c代碼)
支持語言
c
c++
obj-c
c#
python
對於其他的語言,會調用vim設置的omnifunc來匹配,因此同樣支持php,ruby等語言。
已知的有 * javascript —-tern_for_vim * ruby/java —-eclim
使用效果圖
使用感受
和IDE一樣,自動補全,
根據include的文件進行補全
不用再蹩腳的生成tags
補全非常精準,而且速度很快,不會有延遲(以前在大項目上,acp用起來實在是很卡)
支持類似tags的跳轉,跳到定義處以及使用處
出錯提示很智能,並且用起來真的是如絲般柔滑,不用輸入:w進行強制檢測
安裝
說完了那麼多好處,就要說到安裝了。不同於以往其他vim插件,YCM是一款編譯型的插件。在下載完後,需要手動編譯後才能使用。對應其他的插件來說,僅僅就是把.vim的文件丟到相應文件夾下就可以。而這也加大了使用YCM的難度。
安裝准備
最新版的Vim(7.3.584+),編譯時添加+python標志(已經安裝的可以通過vim --version查看)
cmake(mac可以通過homebrew安裝,brew install cmake,ubuntu可以通過sudo apt-get install cmake)
安裝vundle插件,用於安裝管理vim的插件
mac下快速安裝
在.vimrc中添加下列代碼
Bundle 'Valloric/YouCompleteMe'
保存退出後打開vim,在正常模式下輸入
:BundleInstall
等待vundle將YouCompleteMe安裝完成
而後進行編譯安裝:
cd ~/.vim/bundle/YouCompleteMe
./install --clang-completer
如果不需要c-family的補全,可以去掉--clang-completer。如果需要c#的補全,請加上--omnisharp-completer。
正常來說,YCM會去下載clang的包,如果已經有,也可以用系統--system-libclang。
就這樣,安裝結束。打開vim,如果沒有提示YCM未編譯,則說明安裝已經成功了。
手動編譯安裝
安裝的腳本並不是什麼時候都好用,至少對我來說是這樣的。安裝完之後出現了問題,參考issue#809。
在用:BundleInstall安裝完成或者使用
git clone --recursive https://github.com/Valloric/YouCompleteMe.git
獲取最新的倉庫,而後使用git submole update --init --recursive確認倉庫的完整性後,開始安裝流程。
下載最新的clang二進制文件 YCM要求clang版本 > 3.2,一般來說都是下載最新的。
安裝python-dev.(ubuntu下使用sudo apt-get install python-dev,mac下默認提供,否則請安裝command line tools)
編譯
cd ~
mkdir ycm_build
cd ycm_build
cmake -G 「Unix Makefiles」 -DPATH_TO_LLVM_ROOT=~/ycm_temp/llvm_root_dir . ~/.vim/bundle/YouCompleteMe/cpp make ycm_support_libs
這里需要注意的是,~/ycm_temp/llvm_root_dir中包含的是根據第一步下載的壓縮包解壓出來的內容(包括include, bin等等文件)。
這樣就完成了,開始感受YCM提供的完全不遜色於大型IDE所提供的自動補全功能吧。
配置
不同於很多vim插件,YCM首先需要編譯,另外還需要有配置。在vim啟動後,YCM會找尋當前路徑以及上層路徑的.ycm_extra_conf.py.在~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py中提供了默認的模板。也可以參考我的(就在模板上改改而已)。不過這個解決了標准庫提示找不到的問題。
一般來說,我會在~目錄下放一個默認的模板,而後再根據不同的項目在當前目錄下再拷貝個.ycm_extra_conf.py。
# This file is NOT licensed under the GPLv3, which is the license for the rest
# of YouCompleteMe.
#
# Here's the license text for this file:
#
# This is free and unencumbered software released into the public domain.
#
# Anyone is free to , modify, publish, use, compile, sell, or
# distribute this software, either in source code form or as a compiled
# binary, for any purpose, commercial or non-commercial, and by any
# means.
#
# In jurisdictions that recognize right laws, the author or authors
# of this software dedicate any and all right interest in the
# software to the public domain. We make this dedication for the benefit
# of the public at large and to the detriment of our heirs and
# successors. We intend this dedication to be an overt act of
# relinquishment in perpetuity of all present and future rights to this
# software under right law.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# For more information, please refer to <http://unlicense.org/>
import os
import ycm_core
# These are the compilation flags that will be used in case there's no
# compilation database set (by default, one is not set).
# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
flags = [
'-Wall',
'-Wextra',
#'-Werror',
#'-Wc++98-compat',
'-Wno-long-long',
'-Wno-variadic-macros',
'-fexceptions',
'-stdlib=libc++',
# THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
# language to use when compiling headers. So it will guess. Badly. So C++
# headers will be compiled as C headers. You don't want that so ALWAYS specify
# a "-std=<something>".
# For a C project, you would set this to something like 'c99' instead of
# 'c++11'.
'-std=c++11',
# ...and the same thing goes for the magic -x option which specifies the
# language that the files to be compiled are written in. This is mostly
# relevant for c++ headers.
# For a C project, you would set this to 'c' instead of 'c++'.
'-x',
'c++',
'-I',
'.',
'-isystem',
'/usr/include',
'-isystem',
'/usr/local/include',
'-isystem',
'/Library/Developer/CommandLineTools/usr/include',
'-isystem',
'/Library/Developer/CommandLineTools/usr/bin/../lib/c++/v1',
]
# Set this to the absolute path to the folder (NOT the file!) containing the
# compile_commands.json file to use that instead of 'flags'. See here for
# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
#
# Most projects will NOT need to set this to anything; you can just change the
# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
compilation_database_folder = ''
if os.path.exists( 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 ( 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 ):
# The compilation_commands.json file generated by CMake does not have entries
# for header files. So we do our best by asking the db for flags for a
# corresponding source file, if any. If one exists, the flags for that file
# should be good enough.
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:
# Bear in mind that compilation_info.compiler_flags_ does NOT return a
# python list, but a "list-like" StringVec object
compilation_info = GetCompilationInfoForFile( filename )
if not compilation_info:
return None
final_flags = (
compilation_info.compiler_flags_,
compilation_info.compiler_working_dir_ )
# NOTE: This is just for YouCompleteMe; it's highly likely that your project
# does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR
# ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.
#try:
# final_flags.remove( '-stdlib=libc++' )
#except ValueError:
# pass
else:
relative_to = DirectoryOfThisScript()
final_flags = ( flags, relative_to )
return {
'flags': final_flags,
'do_cache': True
}
YouCompleteMe提供的其他功能
YCM除了提供了基本的補全功能,自動提示錯誤的功能外,還提供了類似tags的功能:
跳轉到定義GoToDefinition
跳轉到聲明GoToDeclaration
以及兩者的合體GoToDefinitionElseDeclaration
可以在.vimrc中配置相應的快捷鍵。
nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>
nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
另外,YCM也提供了豐富的配置選項,同樣在.vimrc中配置。具體請參考
let g:ycm_error_symbol = '>>'
let g:ycm_warning_symbol = '>*'
同時,YCM可以打開location-list來顯示警告和錯誤的信息:YcmDiags。個人關於ycm的配置如下:
" for ycm
let g:ycm_error_symbol = '>>'
let g:ycm_warning_symbol = '>*'
nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>
nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
nmap <F4> :YcmDiags<CR>
YCM提供的跳躍功能採用了vim的jumplist,往前跳和往後跳的快捷鍵為Ctrl+O以及Ctrl+I。
總結
YouCompleteMe是我用過的最爽的一個自動補全的插件了。之前使用acp時,遇到大文件基本上就卡死了,以至於都不怎麼敢使用。由於YCM使用的時C/S結構,部分使用vim腳本編寫,部分認為原生代碼,使得跑起來速度飛快。
㈥ vim 和 emacs 到底比ultraedit 和notepad2/++ 強在什麼地方
vim和emacs的能力確實強大,定製能力也非常強。
如vim,可定製語法高亮、顏色方案、文字編碼、顯示行號、自動縮進、自動保存、查找結果高亮顯示等,可以設定某個功能鍵運行某個程序,VIM應該是程序員的編輯器,現在我在vim中編寫C、python、ruby、rails等程序,直接按f4、f8、f9等就可運行看到結果。
emacs比vim要復雜的多,但我們只要能把自己的任務解決,沒必要把emacs的所有功能全部掌握,現在我也用emacs編寫python程序,按ctrl-c ctrl-c直接運行,用emacs運行c和ruby正在解決中。
vim的定製文件是.vimrc,emacs的定製文件是.emacs,定製好配置文件加上下載需要的各種插件,將實現幾乎所有想要的功能。
emacs的文本處理能力比vim強,二進制處理能力也比vim強,emacs比vim程序體積大。如某文件在vim中16進制顯示就有問題,在emacs中的16進制模式中顯示無誤。emacs和vim打開一個很大的文件,速度都很快,都比其他常用程序快很多。
㈦ Mac自帶的Vim怎麼升級
首先,要下載vim的源代碼。Vimsourcearchives:vimonline,下載7.4的新建一個目錄用於安裝vim7.4:sudomkdir/usr/local進入源代碼的src目錄中,執行:./configure--with-features=huge--enable-pythoninterp=yes--enable-cscope--enable-fontset--enable-perlinterp--enable-rubyinterp--with-python-config-dir=/usr/lib/python2.7/config--prefix=/usr/local(這樣解決了部分人提到的不資瓷Python的問題)需要注意的是,不能寫上--enable-gui,這是開啟gui特性的,但是我們是在終端環境下安裝的,因此不能開啟這個特性,否則會出現編譯錯誤。然後,修改src目錄下的這個文件:os_unix.h加上一個頭文件:#include然後你就可以執行make,然後再執行makeinstall!
㈧ 如何cscope查看python代碼
cscope默認會查找.c,.h,.l,.y代碼。
對於其他代碼,比如python, java則需要事先建立cscope.files, 然後再執行cscope -Rbqk
舉例:
1.進入代碼根目錄
2.執行命令
find ./ -name '*.py' > ./cscope.files
3.執行命令cscope -Rbqk