2015年05月30日

Preztoによるzshプラグインの導入

前々からまとまった時間が取れたら、Mac OS XのCLI環境の再整備をやりたいと思っていました。私のCLI環境では、ターミナルをデフォルトのTerminalからiTerm2へ、ログインシェルもbashからzshへ換えています。この2つを行ったことで、CLI環境は格段に使い勝手が良くなりましたが、さらに、今回は次の2つを目標を達成することを目指して整備作業をやることにしました。
  • プラグインを導入して、zsh環境をさらに使い易くする。
  • GitHubを利用して、dotfilesを一元的に管理する。

Mac OS X CLI環境整備の第一段として、Preztoというプラグイン・マネージャーを使ってzshへのプラグイン導入を行ったので、自分自身の備忘録を兼ねてその作業記録を書きます。

zshは豊富な機能やオプション設定を持っていて、zsh本体には標準でこれらを利用したプラグインが含まれています。標準プラグインを使うことで、zshの動作をカスタマズすることができます。また、zshを使っているユーザーは非常に多いので、ユーザーが独自に作成したプラグイン(外部プラグイン)も世の中にはたくさん存在しています(参考ページBに主要なzshの外部プラグインの一覧が掲載されています)。zshの外部プラグインは個別に入れていくこともできますが、プラグイン・マネージャーを使った方が格段に導入が楽です。ググって調べてみると、zshのプラグイン・マネージャーとして以下の3つが有名らしいです。

Google検索のヒット数から判断すると、これらの中で一番広く使われているのはoh-my-zshのようです。これはプラグイン・マネージャーと言うよりは、作成者の好みの設定を数多く収集したオプション・コレクションみたいなものらしいです。上記のoh-my-zshのリンクページには180以上のプラグインが収納されていると書かれていますが、全体の作りが良くないらしく若干動作が重くて、プラグインのメンテもあまりされていないという情報があります。さらに、oh-my-zshのプラグインにはユーザーがRubyを使っていることを前提とした設定が多く含まれているという情報も散見しました。私はプログラミング言語としてRubyを使っておらず、今後も使う予定はまったくはありません。私の好みとは合っていないような気がしたので、oh-my-zshは候補から外しました。Antigenというのは、zshの作者がoh-my-zshとvundle(Vimのプラグイン・マネージャー)の影響を受けて開発しているプラグイン・マネージャーです。Antigenは一部の機能をoh-my-zshのプラグインをそのまま利用する形で実現されています。この点が気に入らなかったのと、Google検索のヒット数から情報が少ないことを理由にAntigenも候補から外しました。最終的に消去法で残ったPreztoをzshのプラグイン・マネージャーとして採用することに決めました。

■ Preztoのインストールと設定


Preztoのインストールは、以下のコマンドによって行えます。
% git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

このコマンドを実行すると、~/.zpreztoというディレクトリが作成され、その中にPreztoのリポジトリのクローンが作成されます。

続いて、Preztoの起動スクリプトファイルのリンクを作成しますが、その前に既存のzshのスクリプトファイルを保存しました。
% cd ~
% mkdir zsh_orig
% mv .zshrc zsh_orig

私の環境では.zshrcしか存在しなかったので、このファイルだけ保存しましたが、.zlogin, .zlogout, .zprofile, .zshenv, .zshrcが存在する場合は、これらをすべて保存しておきます。

最後に以下のコマンドを実行すれば、zshの起動時にPreztoを読み込むための.zlogin, .zlogout, .zprofile, .zshenv, .zshrc(これらはすべて~/.zprezto/runcomsに格納されているファイルのリンク)がホームディレクトリに作成されます。
% setopt EXTENDED_GLOB
% for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

Preztoをインストールした直後に別のターミナルでzshを起動すると、コマンド・プロンプトが下のような表示に変わりました。
SCShot_150530_0002-Installing_Prezto.png
Preztoのプラグインを有効にしたり個々のプラグインのオプション設定値を変えるには、~/.zpreztorcというファイル(これは~/.zprezto/runcoms/zpreztorcに対するリンク)を編集します。デフォルトではこのファイルは以下のような内容になっています。
#
# Sets Prezto options.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#

#
# General
#

# Set case-sensitivity for completion, history lookup, etc.
# zstyle ':prezto:*:*' case-sensitive 'yes'

# Color output (auto set to 'no' on dumb terminals).
zstyle ':prezto:*:*' color 'yes'

# Set the Zsh modules to load (man zshmodules).
# zstyle ':prezto:load' zmodule 'attr' 'stat'

# Set the Zsh functions to load (man zshcontrib).
# zstyle ':prezto:load' zfunction 'zargs' 'zmv'

# Set the Prezto modules to load (browse modules).
# The order matters.
zstyle ':prezto:load' pmodule \
'environment' \
'terminal' \
'editor' \
'history' \
'directory' \
'spectrum' \
'utility' \
'completion' \
'prompt'

#
# Editor
#

# Set the key mapping style to 'emacs' or 'vi'.
zstyle ':prezto:module:editor' key-bindings 'emacs'

# Auto convert .... to ../..
# zstyle ':prezto:module:editor' dot-expansion 'yes'

#
# Git
#

# Ignore submodules when they are 'dirty', 'untracked', 'all', or 'none'.
# zstyle ':prezto:module:git:status:ignore' submodules 'all'

#
# GNU Utility
#

# Set the command prefix on non-GNU systems.
# zstyle ':prezto:module:gnu-utility' prefix 'g'

#
# History Substring Search
#

# Set the query found color.
# zstyle ':prezto:module:history-substring-search:color' found ''

# Set the query not found color.
# zstyle ':prezto:module:history-substring-search:color' not-found ''

# Set the search globbing flags.
# zstyle ':prezto:module:history-substring-search' globbing-flags ''

#
# Pacman
#

# Set the Pacman frontend.
# zstyle ':prezto:module:pacman' frontend 'yaourt'

#
# Prompt
#

# Set the prompt theme to load.
# Setting it to 'random' loads a random theme.
# Auto set to 'off' on dumb terminals.
zstyle ':prezto:module:prompt' theme 'sorin'

#
# Ruby
#

# Auto switch the Ruby version on directory change.
# zstyle ':prezto:module:ruby:chruby' auto-switch 'yes'

#
# Screen
#

# Auto start a session when Zsh is launched in a local terminal.
# zstyle ':prezto:module:screen:auto-start' local 'yes'

# Auto start a session when Zsh is launched in a SSH connection.
# zstyle ':prezto:module:screen:auto-start' remote 'yes'

#
# SSH
#

# Set the SSH identities to load into the agent.
# zstyle ':prezto:module:ssh:load' identities 'id_rsa' 'id_rsa2' 'id_github'

#
# Syntax Highlighting
#

# Set syntax highlighters.
# By default, only the main highlighter is enabled.
# zstyle ':prezto:module:syntax-highlighting' highlighters \
# 'main' \
# 'brackets' \
# 'pattern' \
# 'cursor' \
# 'root'
#
# Set syntax highlighting styles.
# zstyle ':prezto:module:syntax-highlighting' styles \
# 'builtin' 'bg=blue' \
# 'command' 'bg=blue' \
# 'function' 'bg=blue'

#
# Terminal
#

# Auto set the tab and window titles.
# zstyle ':prezto:module:terminal' auto-title 'yes'

# Set the window title format.
# zstyle ':prezto:module:terminal:window-title' format '%n@%m: %s'

# Set the tab title format.
# zstyle ':prezto:module:terminal:tab-title' format '%m: %s'

#
# Tmux
#

# Auto start a session when Zsh is launched in a local terminal.
# zstyle ':prezto:module:tmux:auto-start' local 'yes'

# Auto start a session when Zsh is launched in a SSH connection.
# zstyle ':prezto:module:tmux:auto-start' remote 'yes'

# Integrate with iTerm2.
# zstyle ':prezto:module:tmux:iterm' integrate 'yes'

zstyle ':prezto:load' pmodule '<PLUGIN_MODULE>' ...」という記述がzshの起動時にロードされるプラグイン・モジュールを定義しています。この記述にプラグイン名を追加することでプラグインを有効にできます。~/.zprezto/modulesに存在するディレクトリ名がプラグイン名に相当します。また、「zstyle ':prezto:module:<MODULE_NAME>' <OPTION> '<VALUE>'」という記述が多く存在しますが、これらはプラグイン・モジュールのオプション値を設定しています。これらの中で、「zstyle ':prezto:module:prompt' theme 'sorin'」がコマンド・プロンプトのテーマを設定しているプラグイン・オプションです。「prompt -p」というコマンドによって、利用可能なプロンプト・テーマの表示形式の一覧を確認することができます。各プラグインの機能やオプションの詳細についてはプラグイン・ディレクトリ内のREADME.mdに説明が記載されています。私は好みで、上記の.zpretorcを以下のように変更しました。
--- /Users/yuhri/Downloads/prezto-master/runcoms/zpreztorc	2015-05-26 19:12:54.000000000 +0900
+++ /Users/yuhri/.zpreztorc 2015-05-30 18:05:19.000000000 +0900
@@ -32,6 +32,14 @@
'spectrum' \
'utility' \
'completion' \
+ 'archive' \
+ 'git' \
+ 'python' \
+ 'node' \
+ 'osx' \
+ 'homebrew' \
+ 'syntax-highlighting' \
+ 'history-substring-search' \
'prompt'

#
@@ -39,7 +47,7 @@
#

# Set the key mapping style to 'emacs' or 'vi'.
-zstyle ':prezto:module:editor' key-bindings 'emacs'
+zstyle ':prezto:module:editor' key-bindings 'vi'

# Auto convert .... to ../..
# zstyle ':prezto:module:editor' dot-expansion 'yes'
@@ -63,13 +71,13 @@
#

# Set the query found color.
-# zstyle ':prezto:module:history-substring-search:color' found ''
+zstyle ':prezto:module:history-substring-search:color' found ''

# Set the query not found color.
-# zstyle ':prezto:module:history-substring-search:color' not-found ''
+zstyle ':prezto:module:history-substring-search:color' not-found ''

# Set the search globbing flags.
-# zstyle ':prezto:module:history-substring-search' globbing-flags ''
+zstyle ':prezto:module:history-substring-search' globbing-flags ''

#
# Pacman
@@ -117,12 +125,12 @@

# Set syntax highlighters.
# By default, only the main highlighter is enabled.
-# zstyle ':prezto:module:syntax-highlighting' highlighters \
-# 'main' \
-# 'brackets' \
-# 'pattern' \
-# 'cursor' \
-# 'root'
+zstyle ':prezto:module:syntax-highlighting' highlighters \
+ 'main' \
+ 'brackets' \
+ 'pattern' \
+ 'cursor' \
+ 'root'
#
# Set syntax highlighting styles.
# zstyle ':prezto:module:syntax-highlighting' styles \
@@ -135,7 +143,7 @@
#

# Auto set the tab and window titles.
-# zstyle ':prezto:module:terminal' auto-title 'yes'
+zstyle ':prezto:module:terminal' auto-title 'yes'

# Set the window title format.
# zstyle ':prezto:module:terminal:window-title' format '%n@%m: %s'
@@ -155,3 +163,10 @@

# Integrate with iTerm2.
# zstyle ':prezto:module:tmux:iterm' integrate 'yes'
+
+#
+# Custom
+#
+
+# Prevent to convert 'diff' to 'git diff' by utility module.
+alias diff='command diff'

なお、インストール済みのPreztoを更新したい場合は、以下のコマンドによって行えます。
% cd ~/.zprezto
$ git pull && git submodule update --init --recursive


■ dircolors-solarizedの導入と設定


Preztoのインストールに合わせて、以下のサイトで配布されているdircolors-solarizedというものも導入しました。

 seebi/dircolors-solarized ・ GitHub

これは、GNU lsコマンドによるディレクトリやファイル名の表示色をSolarizedカラーに適合させるためのカラー・テーマです。私はiTerm2のカラー・テーマをSolarizedに設定していますが、上のカラー・テーマを導入すると、GNU lsコマンドのディレクトリやファイル名がSolarizedカラーに対して視認性の高い色で表示されるようになります。

ただし、Mac OS XのデフォルトのlsコマンドはBSD版起源のものであり、GNU版のlsではありません。上のdircolors-solarizedを利用したい場合は、GNU lsが収納されているcoreutilsというフォーミュラをHomebrewによってインストールする必要があります。
% brew install coreutils

これでGNU ls(glsコマンド)が使えるようになったので、dircolors-solarizedを取得します。
% mkdir ~/zsh
% cd ~/zsh
% git clone git://github.com/seebi/dircolors-solarized.git

さらに、以下のコマンドを実行して、カラー・テーマ定義ファイルに対するリンクを作成します。
% ln -s $HOME/zsh/dircolors-solarized/dircolors.256dark ~/.dir_colors

最後に.zpreztorcを以下のように変更すれば、dircolors-solarizedの設定は有効になります。
--- /Users/yuhri/Backup/zpreztorc	2015-05-30 18:05:19.000000000 +0900
+++ /Users/yuhri/.zpreztorc 2015-05-30 18:06:28.000000000 +0900
@@ -30,6 +30,7 @@
'history' \
'directory' \
'spectrum' \
+ 'gnu-utility' \
'utility' \
'completion' \
'archive' \
@@ -64,7 +65,7 @@
#

# Set the command prefix on non-GNU systems.
-# zstyle ':prezto:module:gnu-utility' prefix 'g'
+zstyle ':prezto:module:gnu-utility' prefix 'g'

#
# History Substring Search


【2015/05/31 追記】

本記事に掲載した私家版.zpreztorcに「alias diff='command diff'」という記述が存在しますが、これはPreztoのutilityモジュールによって「diff」コマンドが「git diff」に変換されてしまうことを回避するために追加した設定です(この設定は参考ページCに掲載されていました)。このコマンド変換は以下のファイル内の定義によって実現されています。
#
# Highlights diff output.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#

function diff {
if zstyle -t ':prezto:module:utility:diff' color; then
if (( $+commands[colordiff] )); then
command diff --unified "$@" | colordiff --difftype diffu
elif (( $+commands[git] )); then
git --no-pager diff --color=auto --no-ext-diff --no-index "$@"
else
command diff --unified "$@"
fi
else
command diff --unified "$@"
fi
}

diff "$@"

このファイルでは、colordiffコマンドが存在する場合は「diff | colordiff」が、colordiffコマンドが存在せず、かつgitコマンドが存在する場合に「git diff」の方が使われるように定義されています。そこで、Homebrewでcolordiffコマンドをインストールしてみました。
% brew install colordiff

その結果、やはり「diff」コマンドは「diff | colordiff 」として実行されるようになりました。

上記の結果から、colordiffをインストールしておけば、「diff」コマンドは「git diff」に変換されないので、.zpreztorc内に「alias diff='command diff'」という記述は不要になります。

【参考ページ】

  1. Zsh の環境を揃えるのに疲れたら Prezto がオススメ ≫ GeeksDev
  2. zshの外部プラグインまとめ - Qiita
  3. ターミナル環境を見直す(1) - zsh + prezto編 - oinume journal
  4. oh-my-zshを使っていて重いと感じている方、preztoはいかが? - Qiita
  5. Zsh + Prezto で快適コマンド環境を構築する | Developers.IO
  6. Zsh - LS_COLORSを設定しよう - Qiita



posted by とみやん at 13:14| Comment(0) | TrackBack(0) | PC > Mac