Posted at

Vim の下着で gVim を高速起動する (起動するとは言ってない

More than 1 year has passed since last update.

この記事は Vim (その2) Advent Calendar 2016 の17日目の記事です。


Vim の起動が遅い?

Vim の起動速度が云々という話題が時折あり、自分もなんとなく気になっていました。

闇のプラグインマネージャである dein.vim を試したりもしました。

しかし、聖なる存在である私 anekos とは相性が悪いようで、奇妙な動きに翻弄されるばかり。

不具合報告したくとも、奇怪複雑な動作のため、超面倒くさい!

あきらめた!


起動時間はあきらめる

実際のところ、起動速度が遅いというのは、本質的な問題ではないはず。

Vim を使いたいと思ってから、実際に使えるまでの時間こそが問題です。

それに、起動時間を短くするために色々考えるのも面倒。


起動しなければ 0 秒?

そういうわけで、起動するから時間がかかるので、あらかじめ起動しておくという方針にしました。

つまり、gVim をあらかじめ何個かストック(起動)しておいて、そこから引っ張り出すだけにするのです。


panty コマンド書いた

そしてできたのが panty というコマンドです。

はじめは、シェルスクリプトだったのですが、最近 Rust で書き直しました。

anekos/panty: Super fast gVim summoner

Linux の X 用なので、Mac の人は こちら を参考にすると良いでしょう。


インストル方法

インストール(ビルド)には、rust のパッケージマネージャの cargo が必要です。

(Arch Linux であれば、公式リポジトリにどちらもあるので、サクっとインストールできます。)

$ cargo install panty

$ ~/.cargo/bin/panty -h

これで、~/.cargo/bin/panty にコマンドができます。

適当にパスを通すなりしましょう。


使用方法

まずは、gVim をストックするためのサーバ的なものを起動します。

↓の例では、--stocks 3 の数だけ gVim をストックしておき、--watch で指定されたファイルが更新されると、ストックを再起動して更新します。

これは終了しないので、そのまま放置しておきます。

$ panty collector --stocks 3 --watch ~/.vimrc --watch ~/.gvimrc

あとは、gVim を起動したいときに

$ panty summon ~/.vimrc

のようにすると、裏で起動していた gVim がシャキっと出現し、~/.vimrc を開きます。

ショートカットなどで起動できるようにしておくと良いでしょう。


pros/cons


良いとこ


  • 高速起動 (もどき)

  • .vimrc の書き方などを工夫しなくても良い

  • Rust で遊べた


悪いとこ


  • .vimrc を書き換えた場合、起動が遅れる (上記の--watchオプションを使う場合)

個人的には、vim 関係をいじる時は単純に二つ vim を起動してテストしているので、あまり問題になりません。


実際の速度

実際、どれほどの速度か簡単に計測してみました。

うちの環境では、<A-S-g>panty summon が呼ばれるので、これを押した一定時間後に、a を押すようにします。

これで、インサートモードに入っていれば、その一定時間後には起動が完了しているという寸法です。

実際のテストは以下のようにしました。

$MSEC の部分が問題の時間です。

$ MSEC=0.5

$ sleep 1; xdotool key --delay 0 alt+shift+g ; sleep "$MSEC"; xdotool key --delay 0 a

正確な計測とはいいづらいですが、おおよそ $MSEC0.02 もあればちゃんと起動完了し、インサートモードへ入れているようです。

ほぼウィンドウを表示しているだけなので、もっと速くても良い気もしますが、これ以上速くても意味はないでしょう。

実際に手で入力しても、即インサートモードに入れる感じです。

通常だと、0.5 秒くらいかかっていたようなので、かなり速くなった印象です。

そういうわけで目的は無事達成できたようです!


TODO

最近シェルスクリプトから移植をしはじめたので、ちょっと足りてないとこあります。


  • 起動する gVim のパス指定

  • 他のオプションもわたせるようにする

など。

使いたい人がいて欲しい機能とかあれば、Issue 登録するか Twitter で言ってください。

(ちなみに、過去のコミットにシェルスクリプトも入ってたりしますが、こちらは自分の環境に強く依存しているので参考程度にしかならないと思います)


オマケ


svim

似たものとして、singleton.vim というのがありますが、panty と併用するのに良いものとして、anekos/svim: gVim singleton or gVim window selector on current workspace というのがあります。

画面上に見えている gVim のどれかにファイルを送りこむというものです。


XMonad の設定

xmonad は、アイコン状態でのアプリの起動に対応していないっぽいので、ManageHook を以下のようにすると良いと思います。

import XMonad hiding (doShift)

import qualified XMonad.StackSet as SS
import XMonad.Util.XUtils (hideWindow)

myManageHook :: ManageHook -> ManageHook
myManageHook = composeAll
[ ...
, role =? "STOCKING" --> doHide ]

doHide :: ManageHook
doHide = ask >>= \w -> liftX (hideWindow w) >> doF (SS.delete w)

role :: Query String
role = stringProperty "WM_WINDOW_ROLE"


Vim の下着


gVim をストックしておく → Stock → Stocking → ストッキング → ストッキングといえばパンティーらしい


こういう理論で、panty という名前になりました。