compile_error.vim

QuickRun で出力されるコンパイルエラーを解析して、unite で出力する source を適当に書いてみました。


[compile_error.vim]

" コンパイルエラーのエラーメッセージを解析して、unite で表示する source
"
" 対応コンパイラ
" gcc

function! s:gcc_error(source)
    let error_pattern="[A-D]:.\*:.\*:.\*:.\*:.\*"
    if a:source !~ error_pattern
        return {}
    endif
    let errors=split(a:source, ":")
    return {
    \ 'file' : errors[0].":".errors[1],
    \ 'line' : errors[2],
    \ 'col'  : errors[3],
    \ 'error' : errors[4],
    \ 'message' : errors[5]
    \ }
endfunctio

function! s:analyzer_error(source)
    return s:gcc_error(a:source)
endfunction

function! s:get_buffer_errors()
    let lines=getbufline('%', 1, '$')
    let result=[]
    for line in lines
        let error=s:analyzer_error(line)
        if empty(error)
            continue
        endif
        call add(result, error)
    endfor
    return result
endfunction


"--------------------------------------
" unite-source
"--------------------------------------
function! unite#sources#compile_error#define()
  return s:source
endfunction
let s:source = {
      \ 'name' : 'compile_error',
      \}
function! s:source.gather_candidates(args, context)
    let result=[]
    for error in s:get_buffer_errors()
        call add(result, {
        \ "word" : fnamemodify(error.file, ":t").":".error.message,
        \ "source" : error.error,
        \ "kind" : "file",
        \ "action__path" : error.file
        \ })
    endfo
    return result
endfunction


機能的にはエラーが出ている箇所のファイルを開くだけですね。
とりあえず、形にはなっている……かな?


例によって、vim script は、かなりやっつけで書いているので、とてもうさんくさいです。
もう誰か代わりに書いてください。
正規表現とかリスト型とか辞書型とか頭が痛い……。
あ、ちなみに ':' で、split しているので、エラーメッセージに ':' が含まれているとアウトです。


あと適当に表示させてますけど、unite 的に'file''source'でした、の使い方は間違っていますよね?(errro や warning を表示している辺り)
うーん、もうちょっと unite に慣れていきたい。
(操作的な意味でも、表示的な意味でも)

将来性(?)

  • gcc 以外に対応
  • エラー箇所(行番号レベルで)へジャンプ
  • エラーの種類の識別(ファイル内や関数内で出ているエラーのくくり)

とりあえず、msvc のエラーメッセージの解析かなぁー。
gcc より、ちょっとめんどくさそうです。
あと、エラーを選択しているときに、リアルタイムでバッファにエラー箇所(ソース)が表示されるとかって出来るのかな?
うーん、やりたい事はまだまだありそうだ。