読者です 読者をやめる 読者になる 読者になる

Blank File

LinuxとかPythonとかVimとか、趣味でいじる感じで

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のキーとして存在しているディレクトリ(startopt)のgitリポジトリを全てアップデート(git pull)します。 git submodule update --init --recursiveも実行しているので多分submoduleも更新できると思います。 なお、設定ファイルに書かれていてもインストールされていないリポジトリは無視します。

インストールの場合と同様、ダミーファイルの作成とヘルプの更新も行います。 同じくオプションでスキップ可能です。

チェック

python3 vimpack.py check

設定ファイルにないリポジトリや未インストールのリポジトリを確認して、もしあれば警告を出します。 ついでにダミーファイルの作成とヘルプの更新を行います。 git以外でプラグインを追加した時に便利かな、と思ってつくってみました。

オプション

--help

ヘルプを表示します。 Pythonargparseが作ってくれるやつです。 オプションの確認ができます。

設定ファイル名

デフォルトはpack.jsonです。 他の名前にしたい場合は python vimpack.py check config.json などのように他のオプションの前に指定してください。 フルパスを指定するとそのファイルだけを読み込みます。

--no-dummy

ダミーファイルの作成をスキップします。

--no-doc

ヘルプファイルへのシンボリックリンク作成をスキップします。

--loglevel

出力するログのレベルを設定できます。 レベルは debug, info, warn, error などがあります。 大文字小文字は関係ありません。

デフォルトは info です。 debugが最も詳細(たくさん)なログを表示します。

まとめ

初めてpathlibをガッツリ使ってみました。 少しクセがありますが、基本的に便利でいい感じでした。

もしvimpack.pyのバグに気づいたら、コメントでもリポジトリのissueでもいいので教えていただけるとすごく嬉しいです。 機能追加は・・・しないと思いますので適当にいじってください。