本文由編程派-EarlGrey翻譯,原文出自realpython,是Vim的愛好者專門針對利用Sublime Text 3設置Python IDE一文所寫。譯者本人也是依照Sublime Text那篇文章配置的開發環境,但一直對Vim做爲神器的美名很是仰慕,又看到了一篇這麼全面的配置文章,以爲有必要翻譯過來與你們分享,想必能夠省卻不少本身研究如何配置的時間。php
我注意到,有人在realpython.com宣揚Sublime Text 3。做爲公司的資深開發人員(呃,也就是老古董),我以爲有義務介紹一個真正的Python開發環境給你們——我要推薦的固然就是Vim了。不錯,Vim編輯器無處不在,速度快,歷來不會崩潰。而且,它能作任何事情!css
不過,不利之處也有,就是Vim配置起來很讓人頭疼。可是,別擔憂,本文將告訴你如何配置一個強大的Vim環境,專門用於每天搗鼓Python開發。html
下面是最終效果預覽。python
若是想充分地利用好本文,你應該對如何使用Vim和它的命令模式至少有一個基本的瞭解。若是你是初學者,你能夠經過vim-adventure或者openvim網站學習。在繼續閱讀本文以前,請花點時間瀏覽那兩個網站的內容。linux
由於許多Unix衍生系統已經預裝了Vim,咱們首先要確認編輯器是否成功安裝:git
vim --version
若是已經安裝了,你應該看到相似下面的文字:github
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Nov 5 2014 21:00:28) Compiled by root@apple.com 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
在這一步,你要確保已經知足如下兩點要求:shell
Vim編輯版本應該大於7.3。數據庫
支持Python語言。在所選編輯器的功能中,確保你看到了+python
。編程
若是知足上述要求,接下來能夠安裝Vim擴展了。若是不知足,則須要安裝/升級。
若是沒有Homebrew,建議立刻安裝,並運行:
brew update brew install vim
Debian或Ubuntu系統,可使用下面的代碼:
sudo apt-get remove vim-tiny apt-get update apt-get install vim
若是是其餘版本的Linux系統,請查閱相應版本包管理器的文檔。不清楚的話,能夠先閱讀這篇文章:安裝Vim
Windows系統下安裝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的擴展一般也被成爲bundle或插件。
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施展它的魔法——自動下載全部的插件,併爲你進行安裝和更新。
對於Windows用戶,請查閱Windows安裝指南。
本文不可能列舉Vim的所有功能,只能快速介紹一些Vim自帶的強大功能,它們對於Python開發來講是很是有用的。
或許,Vim編輯器最重要的功能就是它不要求使用鼠標(除了GUI版本外)。一開始,你可能會以爲這是個很是糟糕的作法,可是隻要你投入時間——是的,這很花時間——學習快捷組合鍵,就能夠大幅提高工做流的速度。
使用: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>操做。更多信息請看這裏。
雖然Vim支持tab操做,仍有不少人更喜歡緩衝區和分割佈局。你能夠把緩衝區想象成最近打開的一個文件。Vim提供了方便訪問近期緩衝區的方式,只須要輸入:b <buffer name or number>
,就能夠切換到一個已經開啓的緩衝區(此處也可以使用自動補全功能)。你還能夠經過ls
命令查看全部的緩衝區。
專業貼士: 在:ls
命令輸出的最後,Vim會提示「敲擊Enter繼續查看」,這時你能夠直接輸入:b <buffer name>
,當即選擇緩衝區。這樣能夠省掉一個按鍵操做,也沒必要去記憶緩衝區的名字。
大多數「現代」集成開發環境(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
固然,想要代碼摺疊功能根據縮進狀況正常工做,那麼你就會但願本身的縮進是正確的。這裏,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\+$/
這會將多餘的空白字符標示出來,極可能會將它們變成紅色突出。
大部分狀況下,進行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>
上面的第一行確保了在你完成操做以後,自動補全窗口不會消失,第二行則定義了「轉到定義」的快捷方式。
上面「轉到定義」功能的一個問題,就是默認狀況下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
想要在Vim中執行基本的Git命令?vim-fugitive插件則是不二之選。
Plugin 'tpope/vim-fugitive'
請看Vimcasts的這部視頻,瞭解更多狀況。
Powerline是一個狀態欄插件,能夠顯示當前的虛擬環境、Git分支、正在編輯的文件等信息。
這個插件是用Python編寫的,支持諸如zsh、bash、tmux和IPython等多種環境。
Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}
請查閱插件的官方文檔,瞭解配置選項。
一般Vim會忽視系統剪貼板,而使用自帶的剪貼板。可是有時候你想從Vim以外的程序中剪切、複製、粘貼文本。在OS X平臺上,你能夠經過這行代碼訪問你的系統剪貼板:
set clipboard=unnamed
最後,當你熟練掌握了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的功能。
笨辦法學Vimscript是學習vimscript的極好材料。
全文結束
譯者也按照本文的步驟,在Vagrant虛擬機上嘗試了Vim設置,可是惋惜在YouCompleteMe插件那遇到了些問題,沒有繼續配置下去。在原文頁,我也發現一些網友留言,說根據本文的建議進行了設置,可是碰到了問題。最後,譯者從中摘取了部分,供你們參考。
Wei-Hao Lin
The commands in "Python Indentation" keep throwing "e518: unknown option: set", so i altered it and it works fine as following:
au BufNewFile,BufRead *.py \ set tabstop=4 | \ set softtabstop=4 | \ set shiftwidth=4 | \ set textwidth=79 | \ set expandtab | \ set autoindent | \ set fileformat=unix | au BufNewFile,BufRead *.js,*.html,*.css \ set tabstop=2 | \ set softtabstop=2 | \ set shiftwidth=2 |
Konstantin Gagarin
change powerline to airlineand add powerline fonts.
Ruslan Kiianchuk
It seems like the hack with Python virtualenv can be solved with plugin without the need to pollute vimrc with Python code: https://github.com/jmcantrell/vim-virtualenv