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の機能があります。

次のようにカスタマイズすれば、ginablameバッファで<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