106.07.16 vim ale highlight、work with airline

ALE (全名Asynchronous Lint Engine)真的是好東西啊OuO

總之就是非同步的語法檢查
注意若要用vim,版本只少要8喔

安裝因為vundle所以簡單
Plugin 'w0rp/ale'
然後:PluginInstall

基本設定
let g:ale_sign_column_always = 1
let g:ale_linters = {
\   'javascript': ['eslint'],
\   'c': ['clang'],
\   'cpp': ['clang'],
\   'python': ['pylint']
\}
let g:ale_statusline_format = ['E:%d', 'W:%d', 'ok']
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%]'
let g:ale_lint_on_enter = 1
let g:ale_set_signs = 1
let g:ale_sign_error = '◈'
let g:ale_sign_warning = '◈'

設定error跟warning的圖示都是◈比較不會亂,用顏色分就好
ALEErrorSign、ALEWarningSign:行數前的錯誤警告符號
ALEError、ALEWarning:發生錯誤警告的位置
ALEErrorLine、ALEWarningLine:發生錯誤警告整行
所以再加入,想要粗體也可以把NONE換成bold,前景背景也都任意
autocmd VimEnter,Colorscheme * :hi ALEErrorSign     cterm=bold ctermfg=160
autocmd VimEnter,Colorscheme * :hi ALEWarningSign   cterm=bold ctermfg=166
autocmd VimEnter,Colorscheme * :hi ALEErrorLine     cterm=NONE ctermfg=251 ctermbg=160
autocmd VimEnter,Colorscheme * :hi ALEError         cterm=NONE ctermfg=251 ctermbg=160
autocmd VimEnter,Colorscheme * :hi ALEWarning       cterm=NONE ctermfg=251 ctermbg=166

與airline溝通部分,必須先enable
let g:airline#extensions#ale#enabled = 1

----106.07.20更新----
下面那一大堆在最新版本的 airline 可不用使用
上面enable之後就會自動偵測warning跟error區域

發現我電腦上的版本無 ale 這個 extension 而 GitHub 上有
我太久沒 :PluginUpdate 了,我的錯QuQ
加這兩行設定符號即可像下下張圖一樣了
let airline#extensions#ale#error_symbol = 'E'
let airline#extensions#ale#warning_symbol = 'W'
----我是分隔線喔----


然後通常用這行即可,比較簡單
let g:airline_section_warning = '%{ALEGetStatusLine()}'
不過結果會如下

但是我發現airline有提供warning跟error兩塊
所以就又耗了一整個下午
目前結果如下

上面那行先改成這樣
let g:airline_section_error = '%{ALEGetError()}'
let g:airline_section_warning = '%{ALEGetWarning()}'
接著因為ALEGetError()、ALEGetWarning()不是ale內建的,所以要自己刻
其中的'ok'、'E'、'W'、'E0'、'W0'都是字串可自行修改
function! ALEGetError()
    let l:res = ale#statusline#Status()
    if l:res ==# 'ok'
        return ''
    else
        let l:e_w = split(l:res)
        if len(l:e_w) == 2 || match(l:e_w, 'E') > -1
            return 'E' . matchstr(l:e_w[0], '\d\+')
        else
            return 'E0'
        endif
    endif
endfunction

function! ALEGetWarning()
    let l:res = ale#statusline#Status()
    if l:res ==# 'ok'
        return ''
    else
        let l:e_w = split(l:res)
        if len(l:e_w) == 2
            return 'W' . matchstr(l:e_w[1], '\d\+')
        elseif match(l:e_w, 'W') > -1
            return 'W' . matchstr(l:e_w[0], '\d\+')
        else
            return 'W0'
        endif
    endif
endfunction

一切都很棒
唯一缺點就是airline那兩塊背景前景不管我怎麼查就是不能換=''=
如果可以請通知我!!!!

----106.07.16更新----
解決了,然後我重新做一個主題了OuO
可參考106.07.16 vim airline warning section highlight


參考資料:
liuchengxu/space-vim配置
w0rp/ale » Statusline should turn to green when no errors are found
Vimメモ : ALE(Asynchronous Lint Engine)で非同期コードチェック
ale/doc/ale.txt
vim-airline/doc/airline.txt
用 Vim 写 Python 的最佳实践
Asynchronous Lint Engine - Vim Plugin | How-to | Editor 編輯者 #3

沒有留言:

張貼留言

^ Top