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

tellme.tokyo

テルミー東京

zplug 流 zsh プラグイン管理術

Zsh zplug

とある引用から。

技術者であればだれでも経験することでしょうけれども、自分が作ったものを他人に理解させるというのは存外に難しく、なぜかというと開発者自身はどうしても開発した時の思考の流れを重視してしまい、読者にとって理解しやすい話の流れで話すという思考の大転換が困難だからです。そういえば、開発者自身による解説書の名著って意外なくらい少ないと思いませんか?

私は先月末に zplug という zsh 用のプラグインマネージャーをリリースした。以下の記事では、zplug が生まれた背景やその周辺事情を導入として書いたため、もしかするとユーザ目線からでは分かりづらかったかもしれない。

そこで今回は開発者としての記事ではなく、いちユーザとして(といっても開発者がユーザ目線でプロダクトを語るのは冒頭の引用にもある通りひどく難しいことである)使い方を紹介していく。

特徴

  • 何でも管理できる(コマンド、Gist、oh-my-zsh のプラグイン、GitHub Releases のバイナリ)
  • 非同期インストール/アップデート
  • ブランチロック・リビジョンロック
  • インストール後の コマンド実行 hook あり
  • oh-my-zsh などの外部プラグインをサポート
  • バイナリを管理できる(GitHub Releases)
  • shallow clone できる(オン・オフ)
  • 依存関係の記述ができる
  • ユーザはプラグインマネージャのことを考えなくていい(*.plugin.zsh 不必要)
  • 選択的インターフェイスとの連携(fzf, peco, percol, zaw)

書き方

zplug はタグという概念を持っている。タグとはプラグインの属性情報を表したもので、タグ:値 のセットで記述していく。

$ zplug "foo/bar", as:command, of:"*.sh"

こんな具合である。各タグ間はカンマと一つ以上のスペース(, )で区切る必要がある。タグの値は必ずしもクォートで括る必要はないが、ワイルドカードなどファイルグロブを値と指定する場合、シェルに展開されないようにクォーティングする。

タグ一覧

現在利用できるタグは以下のとおり。

タグ 説明 値 (デフォルト値)
as コマンドかプラグインかを指定する plugin,command (plugin) as:command
of source するファイルへの相対パスかパスを通すコマンドへの相対パスを指定する(glob パターンでも可) - ("*.zsh") of:bin,of:"*.sh"
from 外部からの取得を行う gh-r,gist,oh-my-zsh,github,bitbucket (github) from:gh-r
at ブランチ/タグを指定したインストールをサポートする ブランチかタグの名前 (master) at:v1.5.6
file リネームしたい名前(コマンド時に有用) 好きなファイル名 (-) file:fzf
dir インストール先のディレクトリパス READ ONLY -
if 真のときダウンロードしたコマンド/プラグインを有効化する 真か偽 (-) if:"[ -d ~/.zsh ]"
do インストール後に実行するコマンド コマンド (-) do:make install
frozen 直接指定しないかぎりアップデートを禁止する 0か1 (0) frozen:1
commit コミットを指定してインストールする ($ZPLUG_SHALLOW が真かどうかに関わらず) コミットのハッシュ値 (-) commit:4428d48
on 依存関係 READ ONLY -
nice 優先度(高 -20 〜 19 低)の設定をする。優先度の高いものから読み込む。10 以上を設定すると compinit のあとにロードされる -20..19 (0) nice:10

具体的な書き方については README公式の Wiki を参照。

タグの省略について

タグは限りなく怠惰な指定が可能である。例えば、

zplug "zsh-users/zsh-history-substring-search"

zplug "zsh-users/zsh-history-substring-search", as:plugin, from:github, of:"*.zsh"

と等価である。意味はそのままで、「プラグインとして解釈され(as)、GitHubから取得し(from)、*.zsh なファイル(of)を読み込む」ことを指定している。

つまりタグは省略された場合、デフォルト値が適用される。他にも at:master, nice:0 が適用されているが、zplug のタグにおいてとても重要なのは as, of, from である。逆にこの 3 つを使えばだいたいのコマンドやプラグインを管理下に置くことができるように思う。

各コマンド

また、タグによって指定されたプラグイン属性は各種サブコマンドによってインストールされたりロードされたりする。

ここで zplug コマンドの役割とフローを説明する。

  1. 「ユーザ名/リポジトリ名」を引数に zplug "foo/bar" としてプラグインを連想配列 $zplugs に登録する(このとき、プラグイン名がキーで、タグによる属性情報が値となる)
  2. zplug install でインストールする
  3. zplug loadsource されたりコマンドならシンボリックリンクが作成される
  4. プラグイン・コマンドが使用可能になる

インストールとアップデート

zplug installzplug update によりインストールとアップデートが行える。インストールする項目があるか、アップデートする項目があるか、はそれぞれ zplug checkzplug status によって確認できる。

また、zplug check は(例えるなら)Boolean な関数なので以下の様な書き方ができる。

zplug check || zplug install

また、インストール済みかどうかのチェックで設定項目を書くのにも使用されるべきである。

if zplug check "zsh-users/zsh-history-substring-search"; then
    bindkey '^P' history-substring-search-up
    bindkey '^N' history-substring-search-down
fi

これでインストールされていないときに、不要なキーバインドの設定を防ぐことができる。

まとめ

うまく説明できたかわからない。ただ、zplug が持つポテンシャルは zsh プラグイン管理を革新するだけのものがある。みなさん使ってみてください。