Vim に channel が実装されたので Markdown をプレビューするプラグインを作りました
Vimにchannel機能が実装されました。
Big Sky :: Vim にchannel(ソケット通信機能)が付いた。
昨日から株価・為替は乱高下し、大臣の辞任、日銀のマイナス金利導入決定など国内では大きなニュースが続いていますが、Vimmerにとってはこのパッチが最も影響があったのではないでしょうか。
というわけで、せっかくなのでchannel機能を使ってプラグインを書いてみました。 みんな大好きMarkdownのリアルタイムプレビューです。
channelを使ってみたかっただけなので、今のところデバッグ・エラー処理・設定などはやっつけです。 お遊び以外では使わないでください。
インストール
インストール方法は普通のvimプラグインと同じです。コピーするなりプラグインマネージャを使うなり、お好みの方法でインストールしてください。
NeoBundleをお使いの場合は NeoBundle 'miyakogi/livemark.vim'
です。
残念ながらVimはまだmarkdownの変換やwebサーバーなどの機能はないので、その辺りはPythonで処理しています。 以下のようにpythonのライブラリを別途インストールして下さい。
pip3 install misaka pygments tornado
pygments はコードのシンタックスハイライトに使っています。
tornadoをwebサーバとして使ってページを表示しています。また、webソケットで画面の書き換えを行っています。
また、pythonのプロセスではwebサーバとは別のポートでも接続を待ち受けていて、そこに送られてきたテキストを markdown に変換してページに表示しています。Vim は channel を使ってこのポートに編集中のテキストとカーソル位置の情報を送っています。この関数の処理がそれです。毎回コネクション作ってる辺り頭悪い感じなので、後でなんとかします。
Vimのpythonではなく外部プロセスでpythonを起動しているので、vimは+python3
でなくても動きます。vimproc
もなくて大丈夫です。
Pythonのバージョンは3.5で確認していますが、たぶん3.4でも動くと思います。
使い方
Vimで適当なmarkdownファイルを開き、:LiveMark
を実行してください。するとchromeが起動しますので、vimでファイルを編集したりカーソルを動かしたりしてみてください。リアルタイムで変更がブラウザ上に反映されるはずです。
また、Vim上のカーソル位置も取得していますので、長い文章でブラウザの画面に収まらない場合、カーソル位置が画面に収まるようにいい感じ(自称)にスクロールします。
スタイルが何もないと寂しいので、Honoka という日本語向けの Bootstrap テーマを同梱させていただきました*1。日本語でもきれいに表示されると思います。
終了する時は:LiveMarkDisable
です。何もしなくてもVimが終了した時にサーバープロセスは止まります。
手抜き感の漂うスクリーンキャスト・・・
諸注意
エラーなどでPythonのプロセスが残ってしまう場合があります。その時はプロセスを殺してください。
動作確認は Ubuntu 15.10 でしかやっていません。Macは動く可能性ありますが、Windowsはシェルのエスケープとかしてないので動かないかもしれません。
*1:CDNがわからなかったのでコードを含めています。ライセンスはMITとの事なので大丈夫だとは思いますが、もし不都合ありましたらご一報ください。