Vimのパッケージをインストール・アップデートしてヘルプを作るスクリプトを書きました
先日からVim本体のパッケージ機能を使い、プラグインマネージャは使わない生活をしています。 とはいえプラグインのアップデートやヘルプの生成は手作業では面倒なので、そのあたりを処理してくれるPythonのスクリプトを書きました。
始めはdotfileをgit管理(今まではhgで管理してbitbucketに置いてました)にしてプラグインをsubmoduleにすれば十分かと思ったのですが、やってみたら意外と面倒でした。 Pythonで書いたのは、自分の場合VimがあるところならまずPythonもあるというのと、3.4で入ったpathlibというパスをいい感じに扱えるライブラリを使ってみたかったからです。
この記事を書きながらログ周りやオプションを整備してリファクタリングもしましたが、あくまで自分用に書いたスクリプトなので機能は最低限です。 gitにしか対応していませんが、パッケージ機能を試したい方はもし良ければお使いください。 なお、Vimのパッケージ機能についてはヘルプや先日の記事をご参照ください。
修正
- デフォルトで読み込むパスが
ever
からstart
に変更されたので修正
機能
インストール、アップデート、チェックの3つの機能があります。
インストールするプラグインをJSON形式で記述して ~/.vim/pack/{好きな名前}/pack.json
に置いておくと勝手に読み込みます。
インストール
インストールは不要です。 標準ライブラリ以外の依存もありません。 ファイル(最新版または今日のバージョン)を適当なところに保存して実行するだけです。 実行権限をつけてパスの通った所に置いておけば手軽に実行できます。
実行にはPython3.5以上が必要です。 もしかしたら3.4でも動くかもしれませんが未確認です。
なお、この記事の内容は今日のバージョンベースです。 Vimの仕様変更や私の気分次第で最新版は記事の内容と異なる場合がありますのでご注意下さい。
使い方
実行は python3 vimpack.py {コマンド} [設定ファイル名(デフォルトpack.json)]
です。
コマンドは必須で、設定ファイルの名前はオプションです。
インストールしたいリポジトリの情報を記入した pack.json
というファイルを ~/.vim/pack/{好きな名前}
のディレクトリに置いておきます。
この設定ファイルに書かれたリポジトリがそのディレクトリの下のstart
またはopt
ディレクトリにcloneされます。
以下のように複数のディレクトリに設定ファイルを置くこともできます。
~/.vim/pack ├── 好きな名前1 │ ├── pack.json │ ├── opt │ └── start ├── 好きな名前2 │ ├── pack.json │ ├── opt │ └── start └── 好きな名前3 ├── pack.json ├── opt └── start
※注: Vim 7.4.1527以前のバージョンではstart
ではなくever
設定ファイルのフォーマット
現時点では次のようなフォーマットにしています。 Vimの仕様変更や私の気分次第で変わるかもしれません。 もし動かなかったら私の設定ファイルを確認してください。
{ 'start': { 'github.com': [ 'username1/plugin_repo', 'other_user/plugin_repo2' ], }, 'opt': { 'github.com': [ 'another_user/plugin', 'another_user/somplugin' ] } }
JSONなので末尾コンマ禁止です。エラーになります。 苦情はPython標準ライブラリのjsonモジュールにお願いします。
必ず読み込むプラグインはstart
以下に、遅延読み込みしたいものはopt
以下に記述します。
それぞれのディレクトリに配下のリポジトリがクローンされます。
リポジトリの指定は{ホスト名: [リポジトリ1, リポジトリ2, ...]}
という形のホスト名をキーとしたリストになります。
github以外からインストールする時はホスト名を追加して別に配列を持たせてください。 名前の衝突は一切考慮していないので、万一衝突した場合は先にcloneされたほうが勝ちます。 なお、一度Pythonの辞書オブジェクトに変換される都合上順番はランダムになります。
インストール
以下のコマンドを実行します。
python3 vimpack.py install
勝手に設定ファイルを探してきて、丁寧に一つずつcloneします。 すでにディレクトリがある場合はcloneせずにスキップします。 並列実行をしないのは面倒そうだった(特にログ出力)からです。 全部まとめてインストールとかそう何度もしないと思うので、のんびりコーヒーでも飲みながら眺めていてください。
ちなみに、ログはカラー対応のターミナルだと色がつきます。 ここはがんばりました。 対応していない端末だと色がつかないだけでなく制御文字がそのまま表示されて残念な感じになります。 これを機に色の出る端末に乗り換えましょう。
インストールされたプラグインにplugin
ディレクトリがなかった場合は作って_.vim
というダミーのファイルを作成します。
気になる方はグローバルな.gitignore
に追加しておいてください。
ついでにdoc
ディレクトリの中身を~/.vim/doc
以下にリンクし、ヘルプ用のタグファイルを作成します。
これらの処理は--no-dummy
や--no-doc
オプションをつけることでスキップできます。
アップデート
以下のコマンドを実行します。
python3 vimpack.py update
これを実行すると、pack.json
に記述されたリポジトリだけでなく、JSONのキーとして存在しているディレクトリ(start
とopt
)のgitリポジトリを全てアップデート(git pull
)します。
git submodule update --init --recursive
も実行しているので多分submoduleも更新できると思います。
なお、設定ファイルに書かれていてもインストールされていないリポジトリは無視します。
インストールの場合と同様、ダミーファイルの作成とヘルプの更新も行います。 同じくオプションでスキップ可能です。
チェック
python3 vimpack.py check
設定ファイルにないリポジトリや未インストールのリポジトリを確認して、もしあれば警告を出します。 ついでにダミーファイルの作成とヘルプの更新を行います。 git以外でプラグインを追加した時に便利かな、と思ってつくってみました。
オプション
--help
ヘルプを表示します。 Pythonのargparseが作ってくれるやつです。 オプションの確認ができます。
設定ファイル名
デフォルトはpack.json
です。
他の名前にしたい場合は python vimpack.py check config.json
などのように他のオプションの前に指定してください。
フルパスを指定するとそのファイルだけを読み込みます。
--no-dummy
ダミーファイルの作成をスキップします。
--no-doc
ヘルプファイルへのシンボリックリンク作成をスキップします。
--loglevel
出力するログのレベルを設定できます。
レベルは debug
, info
, warn
, error
などがあります。
大文字小文字は関係ありません。
デフォルトは info
です。
debug
が最も詳細(たくさん)なログを表示します。
まとめ
初めてpathlibをガッツリ使ってみました。 少しクセがありますが、基本的に便利でいい感じでした。
もしvimpack.pyのバグに気づいたら、コメントでもリポジトリのissueでもいいので教えていただけるとすごく嬉しいです。 機能追加は・・・しないと思いますので適当にいじってください。