Nukino's memorandum

とあるソフト屋の覚え書き

Gist.vimの導入とヘルパースクリプトの作成

Octopressで記事を書くにあたってGistにコード貼ったり、それをVim上で管理できるGist.vimを導入したんです が、その際に少し嵌まったのでその解決法と使ってる内にもう少し便利にしたいな―。という欲求がフツフツと 沸いてきたので、vimスクリプトを書いてみた。

環境はWindows XP(SP3)+vim 7.3.393(Kaoriya版)。

Gist.vimの導入

cURLのダウンロードとインストール

Windows系の場合、まずはcURLは標準で入ってないのでダウンロードする必要がある。 (linux系なら多分最初から入ってる。Macも最近のなら入ってるのかな?)

cURL-Download

よりダウンロード。cygwinは使ってないので、

Win32 - Generic
|   Win32 2000/XP   7.23.1  binary  SSL enabled         Gunter Knauf    1.33 MB

をダウンロードしてみた。インストーラは付いてないので解凍して

curl.exe
libcurl.dll
libeay32.dll
libssl32.dll

の4ファイルをパスの通ったフォルダにコピー(または解凍したフォルダにパスを通す)すればおk。

Gist.vimのインストール

通常のvimプラグインと一緒。

のどちらかからダウンロード&解凍して、$VIMRUNTIMEにコピーすればいい。

vimプラグイン管理を使ってるなら$MYVIMRC

NeoBundle 'mattn/gist-vim'

とか書いてインストール(:NeoBundleInstall)すればいい(使ってる管理プラグインによって$MYVIMRCの書き方 やExコマンドは違う。ここではNeoBundleの例)

設定

$MYVIMRCに以下を記述

$MYVIMRC(ex.vimrc)
1
2
3
4
    let g:github_user = <input your username>
    let g:github_token = <input your token>
    let g:gist_curl_options = "-k"
    let g:gist_detect_filetype = 1

g:github_userg:github_tokenを設定しておくとgitコマンドが動かないので若干高速化する(筈)。

ちなみにg:github_tokenGithub→Account Setting→Account Adminの以下の部分を参照すれば良い。

API Token

g:gist_curl_optionsを指定しないとGist.vimが動かなかったので調べて、同じコマンドをコマンドラインか ら打ってみると

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

てな表示が出た。SSL証明書の確認が出来ないので、確認を無視するには’-k’オプション指定してね。と書いて あると見て、とりあえずg:gist_curl_options-kを指定してみた。

なんか臭いものに蓋をしただけのような気もする。正しい解決策を誰か教えて。

Gist.vimの(基本的な)使い方

投稿(Post)

:Gist [-P|-p]

-pを付けるとprivate、-Pを付けるとpublicで投稿される。何も付けないとg:gist_privateの値に従う。 (デフォルトはpublic)

範囲指定可能なので

:6,20Gist

とすると、6行目から20行目までを投稿できる。

通常はVisual modeで選択した後”:”を入力すると自動的に選択範囲が範囲指定されるので、それを使う。

他にも-mを付けたら現在開いてるバッファ分の複数ファイルのgistを作成できたり、-aを付けると anonymous投稿出来たりするみたいだが、使ったことはない。

一覧取得

:Gist -l [user]

でgist一覧を取得できる。userを指定しない場合は自分となる。

:Gist -la

で自分のpublicとprivate全てのgist一覧を取得できる。

編集

一覧取得したバッファで[Enter]を押すかまたは

:Gist gist-id

とgist-idを指定したコマンドを実行すればgist編集バッファで編集が出来る

更新

gist編集バッファ内で

:w[rite]

または

:Gist -e

とすると編集バッファの内容を更新できる。

削除

間違えて投稿してしまった場合、gist編集バッファ内で

:Gist -d

とすると、編集しているgist-idが削除される。

:Gist -d gist-id

みたいにgist-idを指定して削除とかは出来ないみたい。(誤操作防止のため??)

説明(description)指定

投稿、更新コマンド時に

:Gist -s ほげほげ
:Gist -e -s ほげほげ

-s <description>とすると説明(description)を指定できる。説明を指定しておくと、一覧表示の際の画面 が

一覧画面

のように説明が表示されて、管理がしやすいように思う。

また

:Gist -s 2012/01/16 15:33

みたいに空白を入れると上手く動かない。空白の後ろ部分(先の例だと15:33)が説明となる。 gistの制限でそうしてあるのか単純にGist.vimのバグかまでは調べてない。全角スペースなら問題ないので、区 切りが欲しい場合は全角スペースで区切ると良い。

Gist.vimヘルパースクリプト

毎回-sオプション付けて説明指定するのは面倒なので、それを自動的に付けてしまおう。 というスクリプトを書いてみた。

導入が若干面倒なので、プラグインにしてしまった方が良いような気もする。
まあ要望があれば考えると言うことで・・・。

インストール

ここからファイルをダウンロードして、 $VIMRUNTIME/autoload/gist_vim_helper.vimに保存。

$MYVIMRCに以下を追加

$MYVIMRC(ex.vimrc)
1
2
3
    command! -nargs=? -range=% GHPostGist call gist_vim_helper#post_cmd(<count>, <line1>, <line2>, <f-args>)
    command! -nargs=? -range=% GHEditGist call gist_vim_helper#edit_cmd(<count>, <line1>, <line2>, <f-args>)
    command! -nargs=? -range=% GHAutoGist call gist_vim_helper#auto_cmd(<count>, <line1>, <line2>, <f-args>)

使い方

投稿

:GHPostGist [is_private]

:Gist -Pまたは:Gist -pコマンドの代替コマンド。g:gist_vim_helper_new_desc変数に従った説明を付 加する。is_privateが1なら:Gist -p、0なら:Gist -P、省略時は:Gistコマンドが発行される。

g:gist_vim_helper_new_descに指定できるフォーマットは

%Y,%m,%dなど
strftmime()関数で指定可能な日付時刻指定子
$f
投稿するファイル名
$d
ユーザー記述。毎回入力を求められる。

です。先ほど述べたようにスペースを入れないように注意!

更新

:GHEditGist [is_private] [is_close]

:Gist -eコマンドの代替。is_privateは指定しても無意味。将来的にGist.vimがprivate→publicとかに対応す るかもしれないので、付けてある。is_closeに1を指定すると更新が成功したらgist編集バッファを閉じる。 g:gist_vim_helper_edit_desc変数に従った説明を付ける。

g:gist_vim_helper_edit_descに指定できるフォーマットはg:gist_vim_helper_edit_descと同様。

ただし$dを指定した際は入力求める際の初期値が現在の説明になってるので、不要な部分を適宜削除する必要 がある。

投稿または更新を自動判別

:GHAutoGist [is_private] [is_close]

はgist編集バッファ内で実行すると:GHEditGist [is_private] [is_close]コマンド、それ以外のバッファで 実行すると、:GHPostGist [is_private]コマンドを実行する。

結構便利。

設定例

$MYVIMRC(ex.vimrc)
1
2
3
4
5
6
7
8
9
10
11
    let g:gist_vim_helper_new_desc  = "[%Y%m%d-%H%M]$f/$d"
    "説明に作成日時を付加する
    let g:gist_vim_helper_edit_desc = ""
    "説明に更新日時を付加する場合コメントアウト
    "let g:gist_vim_helper_edit_desc = "[%Y%m%d-%H%M]$f/$d"

    noremap <silent><Space>gp :GHPostGist 0<CR>
    noremap <silent><Space>ge :GHEditGist 0 0<CR>
    noremap <silent><Space>ga :GHAutoGist 0 1<CR>
    nnoremap <Space>gl        :<C-u>echo "please wait..."<CR> :Gist -l<CR>
    nnoremap <Space>gdel      :<C-u>Gist -d<CR> :close<CR>

キー定義は適当に変更する。<Space>gl<Space>gdelはおまけ。

Gist.vimの修正(必要ならば)

g:gist_vim_helper_edit_descに値を設定した場合、:GHEditGist(または:GHAutoGist)コマンド で更新すると説明が更新されるが、

:w[rite]

とすると、説明が更新されない。それが気に入らない人は$VIMRUNTIME/autoload/gist.vims:GistWrite() 関数(319行目くらい?)を以下のように変更する。

gist.vim
1
2
3
4
5
6
7
8
9
10
    function! s:GistWrite(fname)
      if substitute(a:fname, '\\', '/', 'g') == expand("%:p:gs@\\@/@")
---     Gist -e
+++     1,1call gist_vim_helper#edit(0,0)
      else
        exe "w".(v:cmdbang ? "!" : "") fnameescape(v:cmdarg) fnameescape(a:fname)
        silent! exe "file" fnameescape(a:fname)
        silent! au! BufWriteCmd <buffer>
      endif
    endfunction

追加する部分は

call gist_vim_helper#edit_cmd(-1, 1, 1, 0, 0)

でもいいかもしれない。

Octopressで使用する場合にGist Tagを貼り付ける

:Gist コマンドで記事をポストするとg:gist_put_url_to_clipboard_after_postが1の時、

https://gist.github.com/1606832

のようなURL(‘1606832’の部分はGist-ID)がクリップボードに貼り付けられる。またOctopressには

(gist-tag) download
1
{% gist gist_id [filename] %}

と記事に書けばGistコードをページに貼り付けてくれる”Gist Tag”という便利なプラグインが存在する。

ということでクリップボードから貼り付けて、ちょっと変更加えればGistコードをページに埋め込むことが出来 る・・・んだけど、数回やっただけで面倒くさくなってきた(スペースの有無とか間違えて、Octopress Document 見に行ったりしてるし)。

ということで変換して貼り付けてくれるvimスクリプトを書いてみた。

上記コードを$MYVIMRC(または$VIMRUNTIME/ftplugin/markdownとか)に貼り付ければ、vim上で

:PasteGist

とExコマンド打てば、カーソル行にGist Tagが貼り付けられる(クリップボードにGistのURLがないと駄目)。

カーソル行の後に貼り付けるようにしたいのなら9行目のnormal O{normal o{とかにすればおk。

Comments