🐙

vimで`git add`する前に`--dry-run`して確認する

2023/10/06に公開

はじめに

vimでコードを修正した後にgit add -Aでステージングする前に、
想定外のファイルが無いか--dry-runオプションの結果を表示するスクリプトです
自分はこれが無いと生きていけません

:GitAdd -A

と入力すると

git add --dry-run -A
add ここにファイル名
add ここにファイル名
︙
execute ? (y/n) > y

とechoされるので、そのままyを入力するとステージングしてくれます

スクリプト

Vim9 Script版とLegacy Vimscript版、両方おいておきます
私は<Space>gagit add -Aするようにマッピングしています

Vim 9script版
def GitAdd(args: string)
  const current_dir = getcwd()
  try
    chdir(expand('%:p:h'))
    echoh MoreMsg
    echo 'git add --dry-run ' .. args
    const list = system('git add --dry-run ' .. args)
    if !!v:shell_error
      echoh ErrorMsg
      echo list
      return
    endif
    if !list
      echo 'none.'
      return
    endif
    for item in split(list, '\n')
      execute 'echoh' (item =~# '^remove' ? 'DiffDelete' : 'DiffAdd')
      echo item
    endfor
    echoh Question
    if input('execute ? (y/n) > ', 'y') ==# 'y'
      system('git add ' .. args)
    endif
  finally
    echoh Normal
    chdir(current_dir)
  endtry
enddef
command! -nargs=* GitAdd GitAdd(<q-args>)
nnoremap <Space>ga <Cmd>GitAdd -A<CR>

※ legacyの方は動作確認できてないです🙇無責任ですまない…

Legacy版
function s:GitAdd(args) abort
  let l:current_dir = getcwd()
  try
    call chdir(expand('%:p:h'))
    echoh MoreMsg
    echo 'git add --dry-run ' .. a:args
    let l:list = system('git add --dry-run ' .. a:args)
    if !!v:shell_error
      echoh ErrorMsg
      echo l:list
      return
    endif
    if !l:list
      echo 'none.'
      return
    endif
    for l:item in split(l:list, '\n')
      execute 'echoh' (l:item =~# '^remove' ? 'DiffDelete' : 'DiffAdd')
      echo l:item
    endfor
    echoh Question
    if input('execute ? (y/n) > ', 'y') ==# 'y'
      call system('git add ' .. a:args)
    endif
  finally
    echoh Normal
    call chdir(l:current_dir)
  endtry
endfunction
command! -nargs=* GitAdd s:GitAdd(<q-args>)
nnoremap <Space>ga <Cmd>GitAdd -A<CR>

GitHubで編集を提案

Discussion