🍣

Vim 上での git 仕草

に公開

Vim 上で git を使う時のプラグインとかキーマップとかフローとか。

使用プラグイン

プラグインの設定

lambdalisue/gin.vim

" !git の動作に支障をきたすため環境変数 GIT_EDITOR の書き換えを禁止
let g:gin_proxy_disable_editor = v:true

キーマップ

nnoremap qt <Cmd>tabclose<CR>: タブで開いたらこれで閉じる。

status

  • nnoremap <Space>gs <Cmd>!git status -v<CR>: -v で git add した内容を確認。
  • nnoremap <Space>gS <Cmd>GinaPreview<CR>: kuuote/gina-preview.vim で画面分割表示 ↓へ変更。
  • nnoremap <Space>gS <Cmd>GinStatus<CR>: gin.vim で status 表示。<< >> などで add や取消。

log

  • nnoremap <Space>gl <Cmd>GinLog ++opener=tabnew --all --graph --max-count=100 --oneline --decorate<CR>: ログとグラフを一行表示。 ↓へ変更。
  • nnoremap <Space>Agit<CR>: ログとグラフを一行表示。そこから色々と git の操作。
  • nnoremap <Space>gL <Cmd>GinLog --all --graph --max-count=100 --oneline --decorate<CR>: ログとグラフと差分を表示。
  • nnoremap <Space>gg :Gina log -p -G""<Left>: 正規表現が変更に含まれるコミットを表示。 ↓に変更。うまく動かなかった。
  • nnoremap <Space>gg :FloatermNew git log -p -G: 正規表現が変更に含まれるコミットを表示。

add

  • nnoremap <Space>gai <Cmd>!git add --interactive<CR>: ファイル単位での add はこちらを使う。
  • nnoremap <Space>gad :!git add --patch<Space>: 変更箇所単位での add はこちらを使う。現在のバッファだけを対象にするなら % を入力して Enter。 e のときに編集をキャンセルするときは :cq を使う。
  • nnoremap <Space>gaD <Cmd>GinPatch ++opener=tabnew %<CR>: gin.vim で変更箇所単位での add など。変更箇所にさらに変更を加える場合により使いやすいかな。
  • nnoremap <Space>gu <Cmd>silent !git add --update<CR>: 変更したファイルをすべて add。最近 git commit --all -v を使えばこれはいらなさそうと気づいた。
  • nnoremap <Space>gS <Cmd>GinStatus<CR>: コミットに含める変更を選択

commit

  • nnoremap <Space>gn :!git commit --all -v -m ""<Left>: 一行コミットメッセージですべての変更をコミット。-m "" を削除して詳細にコミットメッセージを書く時ように -v も入れているけど、やっぱりいらないかな。
  • nnoremap <Space>gN <Cmd>!git commit --all -v<CR>: 詳細にコミットメッセージを書く時はこちら。
  • nnoremap <Space>gc <Cmd>!git commit -v<CR>: git add が終わったらこちら。
  • nnoremap <Space>gam <Cmd>!git commit --amend<CR>: git add 後に直前のコミットへ混ぜる。

push

  • nnoremap <Space>gp :!git push origin @

diff

  • nnoremap <Space>gd <Cmd>!git diff HEAD<CR>: git add 前に変更箇所確認。
  • nnoremap <Space>gD <Cmd>!git diff HEAD %<CR>: git add カレントバッファの変更箇所確認。
  • nnoremap <Space>g<M-d> <Cmd>GinDiff ++opener=tabnew<CR>: たくさん変更していたらバッファ上で確認をするためにこっちを使うことも。

branch

  • nnoremap <Space>gbb <Cmd>call systemlist('git branch')->CtrlPGeneric('CtrlPGenericGitSwitch')<CR>: CtrlP でブランチを選択して switch。
    function! CtrlPGenericGitSwitch(selected_value) abort
      call substitute(a:selected_value, '\s*\*\?\s*\|\s\+', '', 'g')
      \  ->printf('!git switch %s')
      \  ->execute()
    endfunction
    
  • nnoremap <Space>gbB <Cmd>call ddu#start(#{sources: [#{name: 'git_branch'}]})<CR>: ddu.vim でブランチを選択して色々。
  • nnoremap <Space>gbc :!git switch -c<Space>: ブランチ作成。
  • nnoremap <Space>gbr :!git branch -m temp: 現在のブランチ名を変更。temp から好きな名前に変更する。
  • nnoremap <Space>gbm :!git branch -m temp: 現在のブランチ名を仮名に変更。 <Space>gbr と同じ。m と r を悩む時があるので。
  • nnoremap <Space>gbw :!git switch -: 直前のブランチに切り替え。
  • nnoremap <Space>gbc :!git switch -c<Space>: ブランチ名を入力してブランチ作成。

others

  • nnoremap <Space>gy :GinBrowse ++yank=+ -n<CR>: Github の URL をクリップボードへコピー。
  • xnoremap <Space>gy :GinBrowse ++yank=+ -n<CR>: 選択行の Github の URL をクリップボードへコピー。
  • nnoremap <Space>go :GinBrowse<CR>: Github の URL をブラウザで開く。
  • xnoremap <Space>go :GinBrowse<CR>: 選択行の Github の URL をブラウザで開く。
  • nnoremap <Space>oG :GinBrowse<CR>: Github の URL をブラウザで開く。
  • xnoremap <Space>oG :GinBrowse<CR>: 選択行の Github の URL をブラウザで開く。
  • nnoremap <Space>gbo * :GinEdit ++opener=vsplit %<Left><Left>`: コミットやブランチのファイルを表示。コミットハッシュやブランチ名を入力する位置に <Left> でカーソル移動。 ↓へ変更。
  • nnoremap <Space>gbo * <Cmd>call systemlist('git log --date=short --pretty=format:"%h %cd %s"') ->CtrlPGeneric('CtrlPGenericPassGitHash2GinEdit')<CR>: コミットを CtrlP で選択、そのコミット時点のファイルも CtrlP で選択して gin.vim で開く。
    function! CtrlPGenericPassGitHash2GinEdit(selected_value) abort
      const s:hash = matchstr(a:selected_value, '\w\+')
      call systemlist($'git ls-tree -r --name-only {s:hash}')
      \  ->CtrlPGeneric('CtrlPGenericGinEditHash')
    endfunction
    function! CtrlPGenericGinEditHash(selected_value) abort
      execute $':GinEdit ++opener=vsplit {s:hash} {a:selected_value}'
    endfunction
    
  • nnoremap <Space>gbl <Cmd>Gina blame<CR>: インタラクティブな git blame
  • nnoremap <Space>gh :!git cherry-pick<Space>: cherry-pick
  • nnoremap <Space>gt <Cmd>call ddu#start(#{sources: [#{name: 'git_stash'}]})<CR>: ddu.vim で stash を操作。
  • nnoremap <Space>gr <Cmd>CtrlPLauncher git-restore<CR>: CtrlP で restore 操作を選択。
    .ctrlp-launcher-git-restore
    ステージングを取り消す	!git restore -staged .
    ステージングを取り消してワークツリーをHEADに戻す	!git restore -staged - worktree .
    ワークツリーをHEADに戻す	!git restore .
    tempブランチの内容をワークツリーに反映する	!git restore --source=temp .
    
  • nnoremap <Space>gf <Cmd>CtrlPLauncher git<CR>: CtrlP で git 操作を選択。中身は検討中。
    .ctrlp-launcher-git-restore
    git log all files	execute('GinBuffer log --all --graph -100 --oneline --decorate')
    git log all files patch	execute('GinBuffer log --all --patch --graph -100')
    git log CtrlP file	call ctrlp#filter#do('CtrlP', #{filtermethods: ['printf', 'execute'], methodsargs: #{printf: ['GinBuffer log ++opener=tabnew --all --graph -100 --oneline --decorate %s']}})
    git show select log	call CtrlpGenericGitShow()
    

master に間違ってコミットした時に対処

  1. nnoremap <Space>gbr :!git branch -m temp: 現在のブランチ名を仮名に変更。
  2. nnoremap <Space>g- :!git switch -c master HEAD~: 起点にするコミットにブランチ作成。
  3. nnoremap <Space>gr :!git restore --source=temp .: restore 後に git commit -p で部分的に add して commit
  4. git commit -p で部分的に add して commit
  5. nnoremap <Space>gbd :!git branch -D temp: 仮名のブランチを削除。

フロー

編集 → [add →] commit

30398c5525bf4f.png

GitHubで編集を提案

Discussion