1. 程式人生 > >Vim外掛之ale

Vim外掛之ale

純粹個人記錄備份而已,如有錯誤,歡迎指正,更新於2018/5/13

ale(Asynchronous Lint Engine)是一款語法檢查的外掛,與syntastic類似,但有兩個明顯的優勢,一個是語法檢查是非同步執行的,因此基本上不會出現卡頓的情況,另外一個是ale預設會使用所有檢查工具併發的進行檢查,但它只支援Vim 8.0以上的版本,配置如下

"ale
"始終開啟標誌列
let g:ale_sign_column_always = 1
let g:ale_set_highlights = 0
"自定義error和warning圖示
let g:ale_sign_error = '✗'
let g:ale_sign_warning = '⚡'
"
在vim自帶的狀態列中整合ale let g:ale_statusline_format = ['✗ %d', '⚡ %d', '✔ OK'] "顯示Linter名稱,出錯或警告等相關資訊 let g:ale_echo_msg_error_str = 'E' let g:ale_echo_msg_warning_str = 'W' let g:ale_echo_msg_format = '[%linter%] %s [%severity%]' "普通模式下,sp前往上一個錯誤或警告,sn前往下一個錯誤或警告 nmap sp <Plug>(ale_previous_wrap) nmap sn <Plug>(ale_next_wrap) "<Leader>s觸發/關閉語法檢查 nmap <Leader>s :ALEToggle<CR> "
<Leader>d檢視錯誤或警告的詳細資訊 nmap <Leader>d :ALEDetail<CR>

需要注意的是要上面的狀態列整合只是整合到Vim自帶的狀態列上,而且必須在狀態列設定%{ALEGetStatusLine()},比如我的狀態列設定為

"設定狀態列顯示的內容
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}\ %{ALEGetStatusLine()}

如果你有使用airline的話,會發現airline預設也能顯示ale相關的symbol,error對應的是”E”,warning對應的是”W”,如果你想把自定義的error和warning圖示整合到airline的話,需要修改~/.vim/plugged/vim-airline/autoload/airline/extensions/ale.vim

這個檔案,方法是開啟上面提到的ale.vim檔案,找到下面這兩句並註釋掉

let s:error_symbol = get(g:, 'airline#extensions#ale#error_symbol', 'E:')
let s:warning_symbol = get(g:, 'airline#extensions#ale#warning_symbol', 'W:')

然後再新增下面這兩句就可以了

let s:error_symbol = get(g:, 'airline#extensions#ale#error_symbol', '✗ ')
let s:warning_symbol = get(g:, 'airline#extensions#ale#warning_symbol', '⚡ ')

實時的語法檢查,有時候挺煩人的,如果希望只在儲存檔案時才執行Linters,可以像下面這樣設定

"檔案內容發生變化時不進行檢查
let g:ale_lint_on_text_changed = 'never'
"開啟檔案時不進行檢查
let g:ale_lint_on_enter = 0

另外,你還可以指定某種語言特定的Linter,比如對於C/C++我都是使用clang,那麼就可以像下面這樣配置

"使用clang對c和c++進行語法檢查,對python使用pylint進行語法檢查
let g:ale_linters = {
\   'c++': ['clang'],
\   'c': ['clang'],
\   'python': ['pylint'],
\}

另外,對於Java如果安裝在中文的系統上,錯誤和警告資訊都會亂碼,可以進行下面的設定

let g:ale_java_javac_options = '-encoding UTF-8  -J-Duser.language=en'