Hatena::ブログ(Diary)

C++でゲームプログラミング Twitter

2011-02-18

[][]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

f:id:osyo-manga:20110218094320g:image


機能的にはエラーが出ている箇所のファイルを開くだけですね。

とりあえず、形にはなっている……かな?


例によって、vim script は、かなりやっつけで書いているので、とてもうさんくさいです。

もう誰か代わりに書いてください。

正規表現とかリスト型とか辞書型とか頭が痛い……。

あ、ちなみに ':' で、split しているので、エラーメッセージに ':' が含まれているとアウトです。


あと適当に表示させてますけど、unite 的に'file''source'でした、の使い方は間違っていますよね?(errro や warning を表示している辺り)

うーん、もうちょっと unite に慣れていきたい。

(操作的な意味でも、表示的な意味でも)


将来性(?)

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

とりあえず、msvc のエラーメッセージの解析かなぁー。

gcc より、ちょっとめんどくさそうです。

あと、エラーを選択しているときに、リアルタイムでバッファにエラー箇所(ソース)が表示されるとかって出来るのかな?

うーん、やりたい事はまだまだありそうだ。

ShougoShougo 2011/02/18 16:38 unite.vimの作者です。こんにちは。

QuickRunのsourceとは、なかなか面白いですね。
quickfix sourceのQuickRun版でしょうか。

> あと、エラーを選択しているときに、リアルタイムでバッファにエラー箇所(ソース)が表示されるとかって出来るのかな?
-auto-previewを使いましょう。

> あと適当に表示させてますけど、unite 的に'file'の使い方は間違っていますよね?(errro や warning を表示している辺り)
確かになにやらおかしいですね。
fileにはファイル名だけいれておいたほうが良いと思います。
そのほうが、fnamemodify()もきちんと処理されるでしょう。

githubにリポジトリを作ってみてはどうでしょうか。
そのほうが、unite-plugins的にも紹介しやすくなります。

Vim scriptに関しては慣れるしかないと思いますよ。

osyo-mangaosyo-manga 2011/02/18 19:46 コメントありがとうございます。

>quickfix sourceのQuickRun版でしょうか。
quickfix なんて……わたし聞いてないっ!

> -auto-previewを使いましょう。
おー、調べてみます。

> 確かになにやらおかしいですね。
あ、間違えた。
'source'のほうでした。
単に'compile_error'って表示させると長いので、'warning'と'error'に変えるのはどうかなーって事で試してみました。
まぁ見た目の問題ですね。

> githubにリポジトリを作ってみてはどうでしょうか。
github で公開しようとは思っていますが、最終的にどうなるかは分からないのでまだリポジトリはつくっておりませんぬ。
投げっぱなしになる可能性も捨てきれないので……。

> Vim scriptに関しては慣れるしかないと思いますよ。
書きながら覚えるのが一番ですね。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/osyo-manga/20110218/1297989997