輪ごむの空き箱

git操作プラグインを探しているならgin.vimはどう?


この記事はvimアドベントカレンダー2023 12/12の記事です。

はじめに

みなさんvimでgit操作をするときにどのプラグインを使っていますか? 自分はgin.vim(とgitsigns.nvim)を使っています。 この記事を読んだ人のプラグインリストにgin.vimが入ればいいなという気持ちで書いています。

導入方法は各自でご確認ください。

気に入っている点

やさしい設計

:h gin-action-mappingに書いてあるように、

Gin defines the following mappings for actions:

	"?"	List mappings/actions available
	"a"	Open a prompt to input action to execute
	"."	Repeat previous action which has executed from a prompt

?で使用可能なマッピングやアクションのリストが表示されます。 これはうれしい! 例えば、GinLog?を押すことで、このように使用可能なアクションが表示されます
これを見るとyyでコミットidをヤンクできるんだなということが分かります。あとはaのchoiceからrebaseを実行できるな、等と考えらます。ドキュメントを読むことは大事です。しかし、どんな機能が提供されているのかが一目でわかることによってプラグイン導入後直ぐに使い始められたり、忘れたときにすぐに確認できたりとやさしい設計となっています。 <Plug>(gin-action-*)が表示されるので、ドキュメントを確認せずともマッピングを定義できる点もやさしいですね。

その他のコマンドで定義されているマッピングやアクションについては、実際に確認してみてください。

Diffから該当ファイルへジャンプできる

これに関しては私よりも詳しい説明をAtusyさんがしてくださっているので、こちらのブログを見てください。

gin.vimでgitの差分を快適に閲覧する 2023/11/29のVim駅伝記事です。 前回はyasunori0418さんによる「vimを切っ掛けにエンジニアになった話」でした。 gin.
ogp

ざっくりと説明すると、GinDiffのの差分行で<Cr>をすると差分ファイルの指定行へジャンプしてくれるという機能があり、非常に便利です。

自分の設定

自分が気に入っている設定はこの部分です。

autocmd({ 'FileType' }, {
  pattern = { 'gin-diff', 'gin-log', 'gin-status' },
  callback = function()
    local keymap = vim.keymap.set
    local opts = { buffer = true, noremap = true }
    keymap({ 'n' }, 'c', '<Cmd>Gin commit<Cr>', opts)
    keymap({ 'n' }, 's', '<Cmd>GinStatus<Cr>', opts)
    keymap({ 'n' }, 'L', '<Cmd>GinLog --graph --oneline<Cr>', opts)
    keymap({ 'n' }, 'd', '<Cmd>GinDiff --cached<Cr>', opts)
    keymap({ 'n' }, 'q', '<Cmd>bdelete<Cr>', opts)
    keymap({ 'n' }, 'p', [[<Cmd>lua vim.notify("Gin push")<Cr><Cmd>Gin push<Cr>]], opts)
    keymap({ 'n' }, 'P', [[<Cmd>lua vim.notify("Gin pull")<Cr><Cmd>Gin pull<Cr>]], opts)
  end,
})

autocmd({ 'FileType' }, {
pattern = 'gin-status',
callback = function()
local keymap = vim.keymap.set
local opts = { buffer = true, noremap = true }
keymap({ 'n' }, 'h', '<Plug>(gin-action-stage)', opts)
keymap({ 'n' }, 'l', '<Plug>(gin-action-unstage)', opts)
end,
})

よく使うGinStatus,GinLog,GinDiffにsLdを割り当てており、各画面にワンタッチで移動できるようにしています。 また、それぞれの画面からcでコミットできように設定しています。 これにより、自分の良くする操作を簡単にできるようになり、非常に快適です。

また、GinStatusのデフォルトのマッピングでは<<でステージング、>>でアンステージングを行うことができますが、これをhlに割り当てています。これも2回キー入力するひと手間を省くことができて便利です。

因みに、、、 git関連のマッピングが<C-g>で始まっているのは、Atusyさんのブログを参考にさせていただいているからです。

Vim/NeovimのCTRL_GをPrefixにしてみる CTRL_Gの機能はステータスラインで賄えるのでGit用のPrefixにしてみました
ogp
vim.keymap.set({ 'n' }, '<C-g><C-s>', '<Cmd>GinStatus<Cr>', {})
vim.keymap.set({ 'n' }, '<C-g><C-l>', '<Cmd>GinLog --graph --oneline<Cr>', {})

最後に、自分が実際に変更をpushするまでの様子をgifで紹介します。

さいごに

今回はgin.vimについて紹介しました。