いろんないみで

はまっちゃた

vim - git diff で追加された部分をquickfixに出力したい。

こんな設定をしてみました。

function! s:qfGitDiff(...) "{{{
  let [lnum, ret] = [0, []]
  let dir = matchstr(system('git rev-parse --show-toplevel'), '\v^\f+\ze[\r\n]')

  if empty(dir) | return | endif

  for line in split(system(printf('git diff %s', a:0 ? a:1 : '')), '\v\r\n|\n|\r')
    if line[:3] ==# 'diff'
      let [lnum, fname] = [0, dir . '/' . matchstr(line, '\v\sb/\zs\f+$')]
      continue
    endif
    let char = line[0]
    if char ==# '@'
      let lnum = str2nr(matchstr(line, '\v\+\d+'))
      continue
    endif
    if lnum
      if char ==# '+'
        call add(ret, {
        \ 'filename': fname, 'type': 'i', 'lnum': lnum, 'col': 1, 'text': line})
      endif
      let lnum = stridx('-\', char) + 1 ? lnum : lnum + 1
    endif
  endfor

  call setqflist(ret, 'r')

  if len(ret)
    return 1
  endif
endfunction "}}}

command! -nargs=? QfGitDiff if s:qfGitDiff('<args>') | copen | endif

画面キャプチャーはこんな感じです。

赤色のチリチリが付いているのはvim-hierのおかげです。

f:id:hujo:20140902201305g:plain

C言語はわかりませんが。。。

あとgitを使いこなせるようになりたいなぁ。。