🧑‍🏫

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 #'
      \ | setlocal readonly nobuflisted
      \ | normal! gg
  • new
    • 空のファイルで新しいウィンドウを開く
  • setlocal buftype=nofile bufhidden=delete noswapfile
    • 編集対象としないことを設定
    • special-buffersdirectoryを参考にした
  • setfiletype gitcommit
    • ファイルタイプをgitcommitに設定(ハイライトのため)
  • execute 'read !git diff #'
    • 前掲のread !git diff #と同じだが、あとにコマンドを続ける必要があるため、executeで実行する
  • setlocal readonly nobuflisted
    • 編集対象としないことを設定 その2
    • read !git diff #はバッファの書き換えなので、readonlyはそれより後に設定する必要がある
    • 他のオプションは先でも後でも良いのだが、まとめると1行が長くなりすぎるので適当に分割した
  • normal! gg
    • カーソルをバッファ先頭へ復帰

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

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

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

Discussion