🐙
vimで`git add`する前に`--dry-run`して確認する
はじめに
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>ga
でgit 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>
Discussion