在終端中優(yōu)雅地編寫Python
前言
最早我也只是在服務(wù)器上編輯文件的時(shí)候用用vim來(lái)改改程序,并沒有把vim當(dāng)做自己的主力編輯器。但是偶然的一次機(jī)會(huì)需要改一個(gè)奇葩的輸入文件的格式,用了下Vim的宏錄制,嘗到了甜頭,于是后面就開始用Vim來(lái)寫程序了,雖然使用初期有些阻力,但時(shí)間久了就會(huì)發(fā)現(xiàn),雙手再也不用離開鍵盤,即使使用sublime這樣的編輯器我也要改成使用Vim模式,Vim真的能讓自己一思維的速度編輯文本(對(duì)我來(lái)說(shuō)就是寫程序了)。
正好最近換了新的電腦,需要在新電腦上配置一下,就干脆把一些配置相關(guān)的東東記錄下來(lái)吧,相關(guān)的配置文件我都放在了github(https://github.com/PytLab/dotfiles) 上并寫了相應(yīng)的安裝和卸載腳本,給有需要的同學(xué)做個(gè)參考吧。
本文是有關(guān)配置的文章,并不對(duì)Vim的核心技巧進(jìn)行說(shuō)明,有需要的童鞋可以參考文檔和相關(guān)書籍。這里主要配合tmux和vim可以更有優(yōu)雅的幫助我們?cè)诮K端中進(jìn)行Python編程。
先來(lái)個(gè)大致的效果圖吧:
終端窗口管理工具Tmux
首先還是需要配置下tmux,它除了可以進(jìn)行多window多panel以外最主要的是他提供了窗口組隨時(shí)存儲(chǔ)和恢復(fù)的功能。也可以幫助我們?cè)谝粋€(gè)窗口中使用多個(gè)panel一邊使用vim一邊在ipython中進(jìn)行測(cè)試。
tmux的配置文件是當(dāng)前用戶主目錄下的.tmux.conf文件,啟動(dòng)tmux時(shí)會(huì)自動(dòng)加載,也可以通過(guò)在tmux中進(jìn)行加載例如<prefix> : source ~/.tmux.conf。
完整的配置文件參見: https://github.com/PytLab/dotfiles/blob/master/.tmux.conf
修改快捷鍵前綴
關(guān)于tmux的配置比較簡(jiǎn)單,我先把快捷鍵的前綴從Ctrl-b換成了Ctrl-l,主要是根據(jù)個(gè)人喜好,因?yàn)檫@樣左手Ctrl右手l個(gè)人覺得比較方便。
- # Set tmux prefix to <C-a>
- set -g prefix C-l
- unbind C-b
修改分屏快捷鍵
tmux的分屏快捷鍵默認(rèn)值為:
- <prefix> + " 水平分屏
- <prefix> + % 垂直分屏
感覺好奇怪,我就改成了相對(duì)直觀的方式:
- <prefix> + |, 類似在屏幕上加一條處置線
- <prefix> + -, 類似在屏幕上加一條水平線
- # Split pane.
- unbind '"'
- bind | splitw -h
- unbind '%'
- bind - splitw -v
將復(fù)制模式改為vim的復(fù)制模式
由于使用vim習(xí)慣了而且不想在去碰鼠標(biāo),tmux也是可以將復(fù)制模式修改成同Vim相同的方式,只是操作的前綴不同罷了。
- # Copy mode
- # copy-mode to vi mode
- setw -g mode-keys vi
- # enter copy mode
- bind Escape copy-mode
- # paste buffer
- bind C-p pasteb
- # select (v)
- bind -t vi-copy v begin-selection
- # copy (y)
- bind -t vi-copy y copy-selection
綁定面板切換快捷鍵
這里面板切換上,我將面板的上下左右方向綁定到了kjhl四個(gè)同Vim中光標(biāo)移動(dòng)一樣的四個(gè)鍵上同Vim保持一致,這樣就不需要在記住新的方向鍵了。
- # Map panel switch.
- # Up
- bind-key k select-pane -U
- # Down
- bind-key j select-pane -D
- # left
- bind-key h select-pane -L
- # right
- bind-key l select-pane -R
修改面板大小的快捷鍵
這里為了能夠?qū)⒋笮「`活的移動(dòng),我將鼠標(biāo)控制打開,這樣就能通過(guò)鼠標(biāo)進(jìn)行方便精準(zhǔn)的面板大小調(diào)整了。
- # Resize panel size.
- bind < resize-pane -L 10
- bind > resize-pane -R 10
- bind _ resize-pane -D 10
- bind + resize-pane -U 10
- # Use mouse to resize panel.
- set -g mouse-utf8 on
配置當(dāng)然要根據(jù)自己的使用習(xí)慣來(lái)設(shè)置,這里僅僅給出參考。這樣我們將多窗口終端的控制玩弄于手掌之中啦。
Vim配置
解決了終端窗口問(wèn)題,我們開始大刀闊斧的搗鼓編輯器啦,這里我對(duì)我使用的幾個(gè)Vim插件進(jìn)行整理,以及幾個(gè)基本配置進(jìn)行下說(shuō)明。
完整的vim配置文件參見: https://github.com/PytLab/dotfiles/blob/master/.vimrc
關(guān)于Vim安裝
這里主要說(shuō)一下在Mac上的Vim安裝,Vim的官網(wǎng)以及YouCompleteMe的README都有推薦使用MacVim, 但是如果我們并不想在使用Vim的時(shí)候還打開新的窗口而是直接在終端使用Vim的話需要在安裝MacVim后做一點(diǎn)小處理。
1. 安裝MacVim
- brew cask install macvim
2. 使用MacVim的mvim腳本覆蓋掉系統(tǒng)自帶的vim
- alias vim='/usr/local/bin/mvim -v'
- alias vi='vim'
自動(dòng)給打開的文件添加頭部
例如我們編寫Python腳本的時(shí)候經(jīng)常會(huì)在文件開頭添加執(zhí)行文件的Python路徑以及文件的編碼方式,我們可以通過(guò)在Vim的配置文件中添加一個(gè)函數(shù),并讓他在打開一個(gè)新的緩沖區(qū)的時(shí)候自動(dòng)添加到頭部。
- " Auto add head info
- " .py file into add header
- function HeaderPython()
- call setline(1, "#!/usr/bin/env python")
- call append(1, "# -*- coding: utf-8 -*-")
- normal G
- normal o
- endf
- autocmd bufnewfile *.py call HeaderPython()
這樣當(dāng)我們使用
- vi new.py
的時(shí)候便會(huì)匹配到文件后綴并執(zhí)行頭部添加函數(shù)進(jìn)行內(nèi)容添加, 其他語(yǔ)言的腳本例如bash、perl等都是類似的方式。
安裝插件管理器Vundle
如果要安裝插件,必須要有個(gè)方便的插件管理器,Vim的插件管理器有很多,這里我使用了Vundle,它的全稱是Vim Bundle,可以讓我們輕松的安裝、更新、搜索和清理Vim插件。Vundle本身是一個(gè)Vim插件,所以使我們安裝所有插件中最早需要安裝的插件。
Vundle的安裝方式這里就不詳細(xì)介紹了,可以參見:https://github.com/VundleVim/Vundle.vim
安裝好后我們需要修改下.vimrc文件:
- set nocompatible
- filetype off
- set rtp+=~/.vim/bundle/Vundle.vim
- call vundle#begin()
- " 在這里添加你想安裝的Vim插件
- call vundle#end() " required
- filetype plugin indent on " required
這樣如果我們想安裝插件的話我們只需要在call vundle#begin() 和 call vundle#end()之間直接寫入就好了,非常方便,寫好后我們直接運(yùn)行
- vim +PluginInstall +qall
vundle便會(huì)自動(dòng)下載并安裝好插件,我們直接作為伸手黨使用就好啦.
自動(dòng)補(bǔ)全神器YouCompleteMe
YouCompleteMe是一個(gè)非常強(qiáng)大的Vim自動(dòng)補(bǔ)全插件,他的特別之處就在于他并不是像vim自帶的Ctrl-x和Ctrl-n那樣基于文本進(jìn)行補(bǔ)全,而是基于語(yǔ)義,通過(guò)分析源文件進(jìn)行語(yǔ)法分析,這得益于強(qiáng)大的clang/llvm。同時(shí)YCM也整合了多種插件,其中也包含語(yǔ)法糾錯(cuò),類似Syntastic的功能,但是只能進(jìn)行C/C++/Objective-C的語(yǔ)法檢測(cè),對(duì)于Python的話我們后面需要安裝Syntastic插件。
YCM雖然強(qiáng)大,但是安裝卻稍微麻煩些,首先他文件比較大,另外需要自己進(jìn)行編譯(NeoVundle插件管理器貌似可以直接幫你自動(dòng)編譯), 不過(guò)無(wú)論我之前在ubuntu還是現(xiàn)在的mac上,至少我還是沒有遇到什么很大的問(wèn)題的。
具體的安裝請(qǐng)參考YCM的安裝說(shuō)明: https://github.com/Valloric/YouCompleteMe#installation
YCM的相關(guān)設(shè)置:
- " Plugin YCM settings.
- set completeopt=longest,menu
- let g:ycm_min_num_of_chars_for_completion=2
- let g:ycm_cache_omnifunc=0
- let g:ycm_seed_identifiers_with_syntax=1
- let g:ycm_complete_in_comments = 1
- let g:ycm_complete_in_strings = 1
- let g:ycm_collect_identifiers_from_comments_and_strings = 0
- let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
- let g:syntastic_check_on_open=1
- let g:syntastic_enable_signs=1
- let g:syntastic_cpp_check_header = 1
- let g:syntastic_cpp_remove_include_errors = 1
YCM除了在.vimrc中進(jìn)行配置外,還有一個(gè)Python的配置文件.ycm_extra_conf.py,在里面我們可以設(shè)置相應(yīng)的編譯選項(xiàng),比如編譯參數(shù),頭文件和庫(kù)文件的地址等等,這樣我們?cè)诰帉慍/C++等的時(shí)候ycm會(huì)找到相應(yīng)的頭文件和庫(kù)文件進(jìn)行編譯并給出相應(yīng)的提示。這個(gè)文件需要根據(jù)自己的項(xiàng)目根據(jù)自己的文件位置進(jìn)行自定義。
我的.ycm_extra_conf.py的完整版:https://github.com/PytLab/dotfiles/blob/master/.ycm_extra_conf.py
為Python的縮進(jìn)助力
寫Python的時(shí)候你一定需要一款幫助你顯示縮進(jìn)的插件,indentLine就是一款提供縮指示線的插件,有純文字實(shí)現(xiàn),有了他在判斷Python代碼塊的時(shí)候就方便了許多。
插件地址:https://github.com/Yggdroot/indentLine
我相應(yīng)的配置:
- " Plugin indentLine settings.
- let g:indentLine_char = "┆"
- let g:indentLine_enabled = 1
- let g:autopep8_disable_show_diff=1
效果:
對(duì)打開的多個(gè)文件進(jìn)行操作
當(dāng)我們寫代碼的時(shí)候不可能每次只打開一個(gè)文件,而是打開很多個(gè),而且要經(jīng)常在這之間來(lái)回切換。vim提供了自己的buffer管理工具,但是并不直觀,這時(shí)可以使用minibufexplorer插件,這樣便可以像切換tab一樣在Vim中進(jìn)行buffer的切換來(lái)同時(shí)編輯多個(gè)文件。
效果如下圖:
我們可以通過(guò)根據(jù)前面的buffer序號(hào)來(lái)使用Ctrl+w :b buffer-number來(lái)快速切換。
使用Pylint來(lái)幫助我們進(jìn)行Python語(yǔ)法檢測(cè)
首先Pylint是一個(gè)代碼分析工具,它能夠分析Python中的代碼錯(cuò)誤,查找不符合風(fēng)格標(biāo)準(zhǔn)(默認(rèn)PEP8)和有潛在問(wèn)題的代碼,如果單獨(dú)使用的話,他還可以為我們的Python代碼進(jìn)行檢測(cè)并生成一份報(bào)告,并為你的代碼進(jìn)行評(píng)分,像這樣:
- pylint incar.py --output-format=html > score.html
我們可以利用syntastic插件來(lái)使用pylint幫助我們進(jìn)行語(yǔ)法檢查。
syntastic的安裝可以直接通過(guò)Vundle來(lái)進(jìn)行方便的安裝,安裝后我們需要進(jìn)行下配置:
- " Plugin syntastic settings.
- set statusline+=%#warningmsg#
- set statusline+=%{SyntasticStatuslineFlag()}
- set statusline+=%*
- let g:syntastic_always_populate_loc_list = 1
- let g:syntastic_auto_loc_list = 1
- let g:syntastic_check_on_open = 0
- let g:syntastic_check_on_wq = 0
- let g:syntastic_mode_map = {'mode': 'passive', 'active_filetypes': [], 'passive_filetypes': []}
- " Use pylint to check python files.
- let g:syntastic_python_checkers = ['pylint']
- map <F5> :SyntasticToggleMode<CR> :SyntasticCheck<CR>
- " Ignore warnings about newlines trailing.
- let g:syntastic_quiet_messages = { 'regex': ['trailing-newlines', 'invalid-name',
- \'too-many-lines', 'too-many-instance-attributes', 'too-many-public-methods',
- \'too-many-locals', 'too-many-branches'] }
這里主要涉及兩個(gè)部分的配置,
- 一個(gè)是將檢測(cè)模式改成被動(dòng),由于Syntastic檢測(cè)并不是異步進(jìn)行的,如果每次保存的時(shí)候都進(jìn)行檢測(cè),都會(huì)卡在那里等一會(huì),如果我的代碼比較大的話會(huì)更久,所以我們?cè)谙胍獧z測(cè)的時(shí)候在檢測(cè)。
- 忽略掉一些我們不想看到的warnign,pylint完全按照PEP8來(lái)的話,我的代碼經(jīng)常會(huì)各種提示的warning,比如我喜歡在代碼最后一行留個(gè)空行也會(huì)有提示,因此我就通過(guò)正則表達(dá)式將次信息過(guò)濾掉,這時(shí)候就需要設(shè)置syntastic_quiet_message變量了。
樹形目錄方便文件查看
像其他IDE一樣,左邊有樹形目錄的話,所有文件夾和文件都一目了然那一定是極好的,所以NERDTree插件就是這么一款工具,他可以直接通過(guò)Vundle進(jìn)行安裝,然后在配置文件中設(shè)置啟動(dòng)的快捷鍵以及窗口大小和忽略顯示的文件等等。
- " Plugin nerdtree settings.
- map <F2> :NERDTreeToggle<CR>
- let NERDTreeChDirMode=1
- let NERDTreeShowBookmarks=1
- let NERDTreeWinSize=25
- let NERDTreeShowHidden=1
- let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$', '\.git$']
在項(xiàng)目中迅速定位文件
ctrlp.vim 顧名思義,就是提供了同Sublime的Ctrl+p的功能,可以直接通過(guò)Vundle安裝,在配置文件中將其映射到功能鍵上便可以快速啟動(dòng)搜索,支持模糊匹配。
- map <F3> :CtrlP<CR>
顯示文件中的類、函數(shù)、變量
tagbar插件可以幫助我們顯示當(dāng)前文件中的類、函數(shù)、變量等,方便我們閱讀代碼,它是基于ctags的,支持很多語(yǔ)言,具體詳見:https://github.com/majutsushi/tagbar/wiki
安裝好ctags之后可以直接從Vundle中進(jìn)行安裝。
在配置文件中可以將其綁定到快捷鍵上方便快速啟動(dòng)。
- map <F2> :TagbarToggle<CR>
效果如下:
其他插件
Vim 的插件很豐富,這里我就不再一一贅述了,希望這些強(qiáng)大的工具能讓我們?cè)诮K端中更優(yōu)雅的編寫Python(不限于Python啦),有關(guān)我使用的vim插件都在我的.vimrc中,有興趣的童鞋可以搜索相應(yīng)的插件名稱進(jìn)行查看。
- " Plugins.
- Plugin 'VundleVim/Vundle.vim'
- Plugin 'Valloric/YouCompleteMe'
- Plugin 'nathanaelkane/vim-indent-guides'
- Plugin 'fholgado/minibufexpl.vim'
- Plugin 'Yggdroot/indentLine'
- Plugin 'scrooloose/nerdtree'
- Plugin 'ctrlpvim/ctrlp.vim'
- Plugin 'majutsushi/tagbar'
- Plugin 'dyng/ctrlsf.vim'
- Plugin 'vim-airline/vim-airline'
- Plugin 'vim-airline/vim-airline-themes'
- Plugin 'MattesGroeger/vim-bookmarks'
- Plugin 'vim-syntastic/syntastic'
同時(shí)為了方便自己我也寫了相應(yīng)的安裝和卸載腳本,方便大家參考,github地址:https://github.com/PytLab/dotfiles
總結(jié)
本文主要簡(jiǎn)單介紹下本人平時(shí)編程中使用tmux,vim等工具的配置,希望能借此幫助大家能更好的在終端中進(jìn)行程序編寫提高工作效率。
最后還是建議配置文件中不要盲目復(fù)制粘貼別人的配置,最好保證里面的配置自己都知道是做什么的,而且是對(duì)自己需要的。