Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5695

ブラウザをやめてVimでGitHubを使う

$
0
0

はじめに

こちらのクロス投稿です。

最近仕事でGitHubを使っていますが、ターミナルとブラウザの行き来が面倒になってきたので
Vim上でGitHubを操作できるプラグインgh.vim1をつくりました。

ようやくまともに動くようになったので、
プラグインの紹介と実装について解説していきます。

デモ

こんな感じで使います。

機能一覧

  • issue 一覧、作成、更新、close
  • repository 一覧、作成、削除(デフォルトOFF)
  • pull request 一覧、差分

使い方

詳細はREADMEやhelpを読んで頂ければと思います。ここでは大まかな使い方を解説します。

gh.vimは通常のプラグインのようなコマンドを用意してません。
代わりにgh://から始まるバッファを開くことでGitHubに対する様々な操作を可能にします。

例えば:new gh://:owner/:repo/issuesでバッファを開くとissue一覧が表示されます。
:ownerはユーザ名もしくはorg名、:repoはリポジトリ名です。

現時点で使用可能なバッファは次になります。
ちょっとわかりづらいので補足します。
gh://user/reposは自身がアクセスprivateやorgnizationのリポジトリ一覧
gh://:owner/reposは他のユーザの公開リポジトリ一覧
を確認できます。

bufferdescription
gh://:owner/:repo/issues[?state=open&..]get issue list
gh://:owner/:repo/issues/:numberedit issue
gh://:owner/:repo/issues/newcreate issue
gh://:owner/reposget repository list
gh://user/reposget authenticated user repository list
gh://user/repos/newcreate repository
gh://:owner/:repo/readmeget repository readme
gh://:owner/:repo/pulls[?state=open&...]get pull request list
gh://:owner/:repo/pulls/:number/diffshow pull request list diff

さて、お気づきの方がいるかも知れないんですが、HTTPのURIと似た形になっています(http -> ghに変わったくらい)
普段エンジニアの我々からすれば馴染みがありますね。

このようなIFにしたのは
これまでに無い形のプラグインをつくってみたい(1つもコマンドを提供しない)
というのが一番です。

現時点で特にお気に入りな機能としては

  • issue 作成と更新
  • pull request の差分表示

です。どちらも業務で実際結構使用するので、それがVimできるようになったのはコストが低下して良きです。

仕組み

コマンドを提供しないで、どうやってバッファを開いたときに処理させているかについて解説します。

VimにはBufReadCmdというautocmdがあります。こちらはパターンにマッチしたバッファ(名)が読み込まれるときに発火して指定した関数を実行します。

この機能を利用して、gh://*から始まるバッファが読み込まれるときに任意の関数を処理させています。
実際の定義は次になっています。(一部抜粋)

auBufReadCmd gh://*/repos call gh#repos#list()auBufReadCmd gh://*/repos\?* call gh#repos#list()auBufReadCmd gh://*/*/issues call gh#issues#list()auBufReadCmd gh://*/*/issues\?* call gh#issues#list()auBufReadCmd gh://*/*/issues/[0-9]* call gh#issues#issue()

バッファ名はVimの正規表現が使えます。
そして関数内でバッファ名から必要な:ownerと:repo情報を取得してcurlでGitHubのAPIを叩いています。

実は、これは以前thincaさんに教えて頂いていました。
更にlambdaalisueさんのgina.vimというプラグインも同じ仕組みを使っていました。

この仕組みを使うメリットとしては

  • バッファを開いた時の処理と開く前の処理を分断できる
  • 同じ処理をさせたければバッファを開くだけで良くなる

なので、プラグイン次第では実装が結構楽になります。

今後

当初VimでGitHubのPRをレビュー(コメント、approve、change requestなど)したいというのが目的でした。
個人的な目的はまだ達成していないので、今後はそこを達成したら更にUI周りもリッチにして行きたいと感がています。

ひとまずRloadmapを片付けてからってところですね。

雑感

仕組み自体はシンプルですが、Vimのバッファ操作周りが相変わらず面倒なので色々と大変でした。
みなさんのフィードバックをお待ちしています。


  1. 現時点ではNeovimでは動作しない、対応したい気持ちはある 


Viewing all articles
Browse latest Browse all 5695

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>