Vim scriptをsourceしてエラーがあればquickfixに表示する

Vim scriptを書くとする。
動作確認しようとして「:source %」(もしくはquickrun)をする。
構文エラーで怒られる。悲しい。

quickfixに表示する

エラー文を読んで行番号確認して{number}G打って移動してっていうのを繰り返すのが面倒になってきた。
なので、sourceして怒られたらquickfixに出力して該当箇所へのジャンプはそっちに任せることにする。
ついでにquickfixに表示する練習もしたかったので一石二鳥。

vimrcに以下を追加。

" 指定したVim scriptをsourceしてエラーをquickfixに表示
function! s:vim_lint(file)
  let messages = ''
  redir => messages
  silent! execute ':source ' . a:file
  redir END

  let errors = []
  for l in split(messages, "\n")
    if l =~ '^行'
      let info = {'filename': a:file}
      let info.lnum = substitute(l, '行\s*\(\d*\):', '\1', '')
    elseif l =~ '^E'
      let info.text = l
      call add(errors, info)
      unlet info
    endif
  endfor
  call setqflist(errors, 'r')
  cwindow
  silent! doautocmd QuickFixCmdPost make
endfunction

command! -nargs=0 VimLint call s:vim_lint(expand('%:p'))
nnoremap <Space>l :<C-u>VimLint<CR>
  • サンプルコード

例えばこういうコードがあるとして、

上記設定だと:VimLintって打つかlとするとこうなる。

ぼくの環境ではerrormarker.vimを入れているので、実際はこうなる。

なお一般的なlintと違い、「実際に動かした結果」のエラーを解釈しているわけなので使う場合は気をつけること。