2012年2月25日土曜日

[vim] phpファイルを保存するとき、エラーチェックして、エラーがあったらステータスラインを赤にする設定

やったこと


最近、ステータスラインに今カーソルがどの関数にいるかを表示する方法とか、
PHPのエラーチェックやる方法とかを、会社の先輩に教えてもらった。
せっかくなので、ステータスラインの整理をした。
なかなかうまくいった。
特に、保存した時PHPにエラーがあったら、ステータスラインにエラーの内容表示するところとか。

できたもの


ステータスラインのフォーマットは
「ノーマルモード時」、「インサートモード」「PHPエラー検出時」の3パターン。

① ノーマルモード
「背景色を青」、「文字色を白」に変更する。
表示する内容は、「ファイルの絶対パス」、「現在カーソルがいる関数名」、「行数」。


② インサートモード
表示する内容は、インサートモードと同じ。
「背景色を黄色」、「文字色を黒」に変更する。



③ PHPエラー検出時(ファイルタイプがphpのときのみ)
一番やりたかったのはこれ。
ファイルを保存した時、php -lを実行して、
エラーがあった場合、「背景色を赤」、「文字色を黄色」、
「エラーの内容をステータスラインに表示」する。
エラーがない場合は、ノーマルモードと同じ。



設定


.vimrcに設定した内容は以下の通り。

"----------------------------------------------------------+
"  ステータスライン                                        |
"----------------------------------------------------------+

" ステータスラインを常に表示,色変更
set laststatus=2
hi StatusLine ctermfg=White ctermbg=Blue cterm=none
au InsertEnter * hi StatusLine ctermfg=Black ctermbg=yellow cterm=none
au InsertLeave * hi StatusLine ctermfg=White ctermbg=Blue cterm=none
set statusline=%F:\ \ %{GetFunc()}%=%l/%L%11p%%

autocmd BufEnter,BufWritePost * call ErrorCheckStatusline()

" function行の取得用の関数
function! GetFunc()
    let s:path = expand('%:p')
    let s:ext  = expand('%:e')
    if s:ext == "php"
        let start = search("function",'bn')
    elseif &filetype == "vim"
        let start = search("function!",'bn')
    elseif &filetype == "py"
        let start = search("def",'bn')
    else
        let start = ""
    endif

    let lines = getline(start)
    return lines
endfunction

" エラー時のステータスライン変更用関数
function! ErrorCheckStatusline()

  " エラー時の色定義
  let l:ecol = 'highlight StatusLine ctermfg=Yellow ctermbg=Red cterm=none'
  "
  if ! exists('g:is_error')
      " 通常時の色定義
      let s:fg = synIDattr( hlID( "StatusLine" ) , "fg" )
      let s:bg = synIDattr( hlID( "StatusLine" ) , "bg" )
      let g:ncol = 'highlight StatusLine ctermfg='.s:fg.' ctermbg='.s:bg.' cterm=none'
  endif

  " チェックを実行(PHP)
  if &filetype == "php"
    let l:tmp = system("php -l ".bufname(""))

    " エラーがあった場合
    if ! (l:tmp =~ "No syntax errors" )
       let g:is_error = 1
       let g:status = split(l:tmp, '\n')
       silent exec 'set statusline=%{g:status[0]}%=%c,%l%11p%%'
       silent exec l:ecol
       return
    else
       let g:is_error = 0
    endif


  " チェックを実行(python)
  elseif &filetype == "python"
    let l:tmp = system("pyflakes ".bufname(""))

    " エラーがあった場合
    if ! (l:tmp == "" )
       let g:is_error = 1
       let g:status = split(l:tmp, '\n')
       silent exec 'set statusline=%{g:status[0]}%=%c,%l%11p%%'
       silent exec l:ecol
       return
    else
       let g:is_error = 0
    endif

  endif

  " 通常のステータスラインを表示
  silent exec 'set statusline=%F,\ \ %{GetFunc()}%=%l/%L%11p%%'
  silent exec g:ncol
  return
endfunction


今後

① もう少し関数を汎用的にする。
② インサートモードでは、そのモードで必要な情報をステータスラインに表示したい。それが何かは検討中。
③ ビジュアルモードでも何らかの変更をやりたい。
④ vimscript, python のエラーチェックもいれたい。


設定

ここ参考になった。
Vim-Tips
[Vim] statusline

0 件のコメント:

コメントを投稿