🍣
Vim 上での git 仕草
Vim 上で git を使う時のプラグインとかキーマップとかフローとか。
使用プラグイン
- lambdalisue/gina.vim
-
kuuote/gina-preview.vimgin.vim を主に使うようになったので削除。 - lambdalisue/gin.vim
-
cohama/agit.vim にちょっと手を加えた hokorobi/agit.vim
- fixup, switch, restore などを追加
- voldikss/vim-floaterm
- ctrlpvim/ctrlp.vim
- mattn/ctrlp-launcher
- christoomey/ctrlp-generic
- Shougo/ddu.vim
- peacock0803sz/ddu-source-git_stash
プラグインの設定
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-restoregit 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 に間違ってコミットした時に対処
-
nnoremap <Space>gbr :!git branch -m temp
: 現在のブランチ名を仮名に変更。 -
nnoremap <Space>g- :!git switch -c master HEAD~
: 起点にするコミットにブランチ作成。 -
nnoremap <Space>gr :!git restore --source=temp .
:restore
後にgit commit -p
で部分的にadd
してcommit
。 -
git commit -p
で部分的にadd
してcommit
。 -
nnoremap <Space>gbd :!git branch -D temp
: 仮名のブランチを削除。
Discussion