Λlisue's blog

つれづれなるままに更新されないブログ

vim-gistaで訪れる世界で最も快適なGist環境 in Vim

vim-gista gista:list buffer screenshot

追記 Lingrで切磋琢磨され、Unite関連の機能が大幅に向上しました(https://github.com/lambdalisue/vim-gista/issues?page=1&state=closed

どうも、ご無沙汰しております有末です。本日はvim-gistaというちょこちょこ作っていたプラグインのお披露目会を行いたいと思います。

唐突ですが皆さんGist使っていますか?ちょっと保存しておきたいファイルやコード断片を記録しておくのに素晴らしく便利なサービスですが、正直「ちょっと保存したい」と思った時にブラウザを立ちあげてGitHubのGistページに飛ぶのは面倒臭いですよね。 Vimmerの皆様ならVimからGistを投稿できればどんなに素晴らしいか……と思ったことはあるはずです。 そんな願望を解消してくれるのがmattnさんが開発したgist-vimです。 これをインストールすると下記のように簡単なコマンドを実行するだけで現在編集中のバッファをGistに投稿できます。

:Gist

僕もずっとこのプラグインを使用しウハウハなGist生活を送っていたのです、が、最近になって問題が浮上しました。 gist-vimを使うことで簡単にGistを作成することは出来るようになりましたが、gist-vimでは全参照ができません。 もちろん:Gist --listコマンドを使えば一覧を参照できるのですが、このコマンドだとGist APIが返すページ単位でしか参照できません。 gist-vimUnite.vimから使うためのunite-gistというプラグインもあるのですが、これもGist APIが返すページ単位でしか参照できません。 というか最初のページしかUniteで表示できないのでUniteを使っている意味が半減しています。

そこでgist-vimとunite-gistにこんな(#158, #2)Pull requestを投げたのですがキャッシュなどを行っているわけではないので大量のGistがあると耐え難いほど時間がかかります。 なのでこのPRを改変し、キャッシュを行うように改良しようと試みていたのですが、なにぶんgist-vimはかなり古いプラグインなのでソースコードが難解かつUniteでしか使わないような関数などが乱雑しており改良するのがかなり厳しい状況でした。

そんなこんなでvim-gistaという名前でgist-vimAlternativeとなれるような新しいプラグインをスクラッチから作り直しました。

インストール方法

まぁVimからGistを使いたいと思う用なVimmerの皆様であればneobundle.vimを用いていると思うので、下記のように vimrc に記載してください。

" neobundle.vim
NeoBundle 'lambdalisue/vim-gista'

" neobundle.vim (Lazy)
NeoBundleLazy 'lambdalisue/vim-gista', {
    \ 'autoload': {
    \    'commands': ['Gista'],
    \    'mappings': '<Plug>(gista-',
    \    'unite_sources': 'gista',
    \}}

あとWindowsの方はcURLwgetVimから使えるようにしてください。

使い方

前準備

まずはg:gista#github_userをvimrcで下記のように宣言することをおすすめします(必須ではないですが)。

let g:gista#github_user = 'GitHubのアカウント名'

これで前準備完了です。

簡単な使い方

前準備が完了すれば、あとは

:Gista --list

を実行するとアカウントのパスワードが下図のように聞かれるので埋めてください(下図では:Gista --loginを呼び出しているがあらゆるvim-gistaのコマンドは初回実行時に自動的にログインインターフェイスを呼び出すのでいきなり:Gista --listでOK)。 ちなみにパスワードはGist APIを使用するためのPersonal Access Tokenを作成するためだけに使用されるのでファイルシステムにパスワードが保存されることはありません(Personal Access Tokenは保存されます)。

vim-gista ログイン

どうしてもGitHubのパスワードを入力したくないという方はご自身でPersonal Access Tokenを作成し(gistにチェックを入れるのをお忘れなく)下記コマンドでログインインターフェイスを呼び出してください。 そこで聞かれるユーザー名の部分に作成したPersonal Access Tokenを入力すればログイン完了です。

:Gista --login

ログイン成功後は'gist:list'という名前のバッファが開くので、そこでgistを操作できます。操作方法は下記マッピングを参照してください。

キー 説明
<F1> マッピングに関するヘルプの表示
<C-l> 新しく更新されたGistリストを取得
<C-l><C-l> Gistリストをキャッシュを使用せずに更新
<CR> 指定されているデフォルトの方法で選択されているGistもしくはファイルを開く(デフォルトは 'edit' です)
<S-CR> 選択されているGistもしくはファイルをブラウザで開く(tyru/open-browser.vimがインストールされている必要があります)
+ 選択されているGistにスターをつけます
- 選択されているGistからスターを取ります
? 選択されているGistにスターが付いているか調べます
r 選択されているファイルをリネームします
D 選択されているGistもしくはファイルを削除します
F 選択されているGistをフォークします(自分のGistでは動きません)
e 'edit' を使用して選択されているGistもしくはファイルを開きます
s 'split' を使用して選択されているGistもしくはファイルを開きます
v 'vsplit' を使用して選択されているGistもしくはファイルを開きます
b 選択されているGistもしくはファイルをブラウザで開く(tyru/open-browser.vimがインストールされている必要があります)

使い方のイメージは下図を参照してください。

vim-gista interface (screencast)

Unite.vimとの連携

vim-gistaはUnite.vimを使用すると真価を発揮します。 例えば、数年前に作成した気がする「n次元でのフィッティング」を行うGistが見たいとします。 その場合は下図のように:Unite gistaを呼び出し 'n-dimen...' とフィルタリングを行うと簡単に見つけることができます。 ついでにUnite上でも様々なGist操作がactionで可能になっています。

vim-gista と Unite.vim の連携

注意: 動画は開発中のものです。いまのインターフェイスとは見た目や操作感が若干異なります。

新しいGistを作成する

gist-vimとほとんど同様ですが下記コマンドで現在編集中のバッファの内容で新しいGistを作成します。

:Gista

既存のGistを編集する

いろいろ方法を用意してあるのですが、最も簡単なのはGista --listもしくはUnite gistaで対象のGistを開き:w!で保存する方法です。 この辺の設定はhelp vim-gista-usage当たりが詳しいです。

もっと詳しく

英語ですが vim-gista の README にもっと詳しく書いて有ります。 また:help vim-gista にはかなり細かいところまで書いて有るのでがっつり使いたい方は一読をおすすめします。

vim-gista と gist-vim の違い

もっとも大きな違いはリスト表示時にページごとに表示するか全てのGistを表示するかです。 前記した通り vim-gista は過去のGistから目的のGistを効率的に見つけ出すために開発されました。 そのため vim-gista でリスト表示を行うと下記のような流れでリストを表示します。

  1. Gist APIを用いてGistリストの最初のページをダウンロード
  2. ダウンロードしたページから全ページ数を取得し、全てのページをダウンロード
  3. 全てのページのダウンロードが終わった段階でJSON形式でファイルシステムにキャッシュを作成
  4. 二回目以降はキャッシュ作成時刻よりも後に更新されたGistのみをダウロードし、アクセス時間を大幅に短縮

この様にvim-gistaでは全Gistをダウンロードしキャッシュするので数年前に保存したGistでも簡単に見つけることができます。 ってか正直GitHubの公式Webインターフェイスより使いやすいです(当社比)。

vim-gistaは可能な限りキャッシュの全再構築を行わなくて済むように設計されています。 例えばvim-gistaから特定のGistを削除すると自動的にキャッシュからも削除されるようになっています。 またWebインターフェイスから削除されたGistに対して処理(開くなど)を行うと「エントリーが存在しないからキャッシュから削除しとく?」的なことが聞かれるのでよっぽど大量に削除したりしなければわざわざキャッシュの再構築をするまでもなくキャッシュを最新に保てます。

ほか細かい違いとして以下のようなものが挙げられます

  • 削除などのコマンドは実行しにくいようにショートオプションを取っ払い、他のオプションにあてた(-d--description の省略形になったなど)
  • 内部の構造を完全にスクラッチから作りなおしたので整理されており拡張しやすい(当社比)

既知の問題点

  1. MacVimで更新インディケータ(Requesting gist list... 1/43 pages are loaded みたいなやつ)がうまく表示されない(原因不明)
  2. Unite.vimの表示文字列がUnite起動バッファのサイズに依存する(Unite.vimの機能的問題なのでShougoさんが新しいHookを作ってくれれば即対応できます)
  3. 全くテストされていない(thincaさんのテストフレームワーク試したい)

最後に

はてなブックマークGitHubでのスターなどいただけると承認欲求が満たされモチベーションが上がり開発が進むと思うので清き一票をお願いいたします(笑。