🧑‍🏫

Vimで現在のファイルのgit diffを確認する

2023/12/15に公開

この記事はVim駅伝の2023-12-15の記事です。
前回の記事はAmaさんのVimで、位置を指定できる winline() を作成するです。


vim-jp slack#tech-spartanというチャンネルで話題になり、書いてみました。
Git管理下のファイルを開き、適当な変更を加えて以下のコマンドを入力するとdiffを見ることができます。

new | r !git diff #
  • new
    • 空のファイルで新しいウィンドウを開く
  • r !git diff #
    • rreadの省略
    • 外部コマンドgit diffを実行し、現在のバッファ(newで開いたバッファ) に結果を挿入
    • 引数として最初に見ているファイルパスを渡したいが、newでバッファが切り替わっているため、#を使って直前のファイルパスを渡す

「newしてgit diffをreadする」という動作をほぼそのままコマンドにした形になっています。spartanも覚えやすいですね。

頻繁に使うのであれば、コマンド化して、もうすこし整形すると見やすいと思います。
こんな感じはどうでしょうか。

command! GitDiff new
      \ | setlocal buftype=nofile bufhidden=delete noswapfile
      \ | setfiletype gitcommit
      \ | execute 'read !git diff #'
      \ | normal! gg
  • new
    • 空のファイルで新しいウィンドウを開く
  • setlocal buftype=nofile bufhidden=delete noswapfile
    • 編集対象としないことを設定
    • special-buffersdirectoryを参考にした
  • setfiletype gitcommit
    • ファイルタイプをgitcommitに設定(ハイライトのため)
  • execute 'read !git diff #'
    • 前掲のread !git diff #と同じだが、あとにnormal!コマンドを続ける必要があるため、executeで実行する
  • normal! gg
    • カーソルを先頭へ復帰

また、newのかわりにenewtabnewを使ったり、git diffのオプションを追加したりして改造できます。お試しあれ。

なお、denops環境ではgin.vimの使用がおすすめです。

https://blog.atusy.net/2023/11/29/gin-diff/

Discussion