Wagomu no Akibako

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


この​記事はvimアドベントカレンダー202312/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に​ついて​紹介しました。