🦍
Vimで現在行のコミットIDからGitHubのPRを開く
初めに
先日getprというコミットIDからPRのリンク取得できるCLIを作りました。
CLIだけだとちょっと使い勝手が良くないので、Vimで使いやすいようにプラグインを作りました。
使い方は簡単で、:GetprOpen
でPRのリンクを開く、:GetprYank
でレジスタにヤンクします。
もともとgetpr
を作ったのはバグの原因となった行のPRを開きたかったので、Vimでそれを手軽にできるようにしたという感じです。
実装
実装は簡単で、現在行をline('.')
で取得して、それを使ってgit blame
からコミットを抽出します。
let line = line('.')
let blame_line = system(printf('git blame -L %s,%s -- %s', line, line, file))
行を取得できたら、あとは半角スペースで区切って1つ目のコミットidを取得します。
let id = blame_line->split(' ')[0]
あとはgetpr
に渡せばリンクを取れます。
let url = system(printf('%s %s', 'getpr', id))->trim()
getpr.vim
はキーマップを2つ提供していて、これをつかって次のように設定すればコマンド打たずに簡単にPRを開けるので、だいぶ手間が省けます。
map go <Plug>(getpr-open)
map gy <Plug>(getpr-yank)
ぜひお試しください。
おまけ
普段ぼくはgina.vimというプラグインを使っていますが、このプラグインもgit blame
の機能があります。
次のようにカスタマイズすれば、gina
のblame
バッファで<C-o>
を押すとそのPRのリンクを開けます。gina
ユーザーはぜひお試しください。
call gina#custom#mapping#nmap(
\ 'blame', '<C-o>',
\ ':<C-u>call GinaOpenPR()<CR>',
\ {'silent': 1},
\)
let s:cmd = 'open'
if has('linux')
let s:cmd = 'xdg-open'
elseif has('win64')
let s:cmd = 'cmd /c start'
endif
function! GinaOpenPR() abort
let can = gina#action#candidates()
let url = system(printf('%s %s', 'getpr', can[0].rev))->trim()
call system(printf('%s %s', s:cmd, url))
endfunction
Discussion