#308 Oh My ZSH
- Download:
- source codeProject Files in Zip (2.18 KB)
- mp4Full Size H.264 Video (25.9 MB)
- m4vSmaller H.264 Video (11.2 MB)
- webmFull Size VP8 Video (11.7 MB)
- ogvFull Size Theora Video (23.5 MB)
Railsデベロッパーであればコマンドラインを使う機会が多いですが、常にそれを活用しきれているとは言えません。対応策としてできることの一つは、UNIXベースのシステムの多くでデフォルトのシェルであるBashをZ Shell (zsh)に切り替えることです。この作業は難しい場合もありますが、oh-my-zshというプロジェクトを利用すればzshを簡単にインストールすることができ、同時に便利なデフォルト設定といくつかのプラグインとテーマを導入できます。切り替える方法は、ターミナルでこのコマンドを実行するだけです。
wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
システムにwget
がインストールされていない場合は、代わりにcurl
を使ってこのコマンドでzshをインストールできます。
curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
このコマンドによってoh-my-zshリポジトリがクローンされて自動的にインストールが実行されます。そのときにパスワードの入力が求められます。インストールが終了した後に新規のターミナルウィンドウを開くと、zshウィンドウが開くはずです。
最初に目につく点としては、プロンプトが大きく変わっています。これはテーマを使って自由にカスタマイズできます。その方法は後で紹介します。zshは見た目は違いますが、ほとんどの部分はBashと同じように振る舞い、コマンドもまったく同じように動作します。
zshの機能の紹介
zshのもっとも便利な機能のひとつは、かしこい自動補完です。例えばls -
とタイプしてタブを押すと、ls
で使えるオプションのリストが表示されます。さらにカーソルキーを使ってリスト内をスクロールし、コマンドを実行することができます。この機能は、git commit
のような複雑なコマンドの場合に特に便利です。
➜ ~ git commit - --all -a -- update all paths in the index file --allow-empty -- allow recording an empty commit --amend -- amend the tip of the current branch --author -- override the author name used in the commit --cleanup -- specify how the commit message should be cleaned up --edit -e -- edit the commit message before committing --file -F -- read commit message from given file --include -i -- update the given files and commit the whole index --interactive -- interactively update paths in the index file --message -m -- use the given message as the commit message --no-verify -n -- do not look for suspicious lines the commit introduc --only -o -- commit only the given files --quiet -q -- suppress commit summary message --reedit-message -c -- use existing commit object and edit log message --reuse-message -C -- use existing commit object with same log message --signoff -s -- add Signed-off-by line at the end of the commit mess --untracked-files -u -- show files in untracked directories --verbose -v -- show unified diff of all file changes
もう一つの便利な機能として、より広範にワイルドカードオプションを指定できます。Railsプロジェクト内のすべてのRubyファイルをリストアップしたいという場合、2つのアスタリスクを使用して深くネストされたディレクトリ内を検索することができます。
➜ railscasts git:(master) ls **/*.rb app/controllers/application_controller.rb app/controllers/comments_controller.rb app/controllers/episodes_controller.rb app/controllers/feedback_messages_controller.rb app/controllers/info_controller.rb app/controllers/users_controller.rb app/controllers/versions_controller.rb app/helpers/application_helper.rb app/helpers/comments_helper.rb app/helpers/episodes_helper.rb app/helpers/error_messages_helper.rb app/helpers/feedback_messages_helper.rb # rest of files omitted.
その他にもzshが提供する優れた機能があります。そのいくつかはOS X特有のものです。例えば、タイトルバーに現在のユーザ、マシン、ディレクトリについてのより詳しい情報が表示されます。
その他にも小さいながら便利な機能がいくつかあります。新規のターミナルタブを開くときは、前のタブのカレントディレクトリと同じディレクトリで開きます。また、コマンドをタイプし始めてから上矢印を押すと、コマンドヒストリに基づいて自動補完されます。
zshの設定を変更する
これらの機能はすべて自由に設定変更できるので、次はその方法を見ていきます。ホームディレクトリに.zshrc
ファイルがあり、新規のzshセッションを開始するときに読み込まれます。
# Path to your oh-my-zsh configuration. ZSH=$HOME/.oh-my-zsh # Set name of the theme to load. # Look in ~/.oh-my-zsh/themes/ # Optionally, if you set this to "random", it'll load a random theme each # time that oh-my-zsh is loaded. ZSH_THEME="robbyrussell" # Set to this to use case-sensitive completion # CASE_SENSITIVE="true" # Comment this out to disable weekly auto-update checks # DISABLE_AUTO_UPDATE="true" # Uncomment following line if you want to disable colors in ls # DISABLE_LS_COLORS="true" # Uncomment following line if you want to disable autosetting terminal title. # DISABLE_AUTO_TITLE="true" # Uncomment following line if you want red dots to be displayed while waiting for completion # COMPLETION_WAITING_DOTS="true" # Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*) # Example format: plugins=(rails git textmate ruby lighthouse) plugins=(git) source $ZSH/oh-my-zsh.sh # Customize to your needs... export PATH=/Users/eifion/.rvm/gems/ruby-1.9.2-p290/bin:/Users/eifion/.rvm/gems/ruby-1.9.2-p290@global/bin:/Users/eifion/.rvm/rubies/ruby-1.9.2-p290/bin:/Users/eifion/.rvm/bin:/Users/eifion/bin:/usr/local/bin:/usr/local/mysql/bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
このファイルはまずoh-my-zshの設定ディレクトリへのパスを設定し、次にテーマを設定します。現在はrobbyrussell
になっています。その下はコメントアウトされたオプションなので、例えばもしディレクトリ表示のカラー表示をやめたい場合は、DISABLE_LS_COLORS
オプションのコメント記号を外します。
ファイルの下の方には、現在有効になっているプラグインのリストがあります。今はgit
だけが有効になっている状態ですが、後ほど追加します。その下の行のsource $ZSH/oh-my-zsh.sh
がoh-my-zshを読み込んで、最後の行がPATH
を設定します。ここにはoh-my-zshをインストールしたときに設定されていた値がデフォルトで設定されますが、これは.bash_profileからそのまま持ってくるのがいいでしょう。これをおこなうには、.zshrc
からexport PATH
で始まる行を削除して、このコマンドを実行します。
➜ ~ cat ~/.bash_profile >> ~/.zshrc
当然ながらこれらの設定はマシンごとに異なります。大抵の場合はコピーしたままで動作するはずですが、場合によっては正常に機能させるために多少の調整が必要になるかも知れません。
テーマ
次にプロンプトの表示を変えるために新規のテーマを作成します。利用可能なテーマは~/.oh-my-zsh/themes
ディレクトリにありますが、デフォルトの状態ですでに多くの種類が選択可能です。見た目を確認するためには、oh-my-zshのwikiページにスクリーンショット付きのテーマリストがあります。oh-my-zshをさらに詳細にカスタマイズしたければ、独自のテーマを作成することができます。ではここで新規のzsh-theme
ファイルをthemesディレクトリに作成してみましょう。
PROMPT='%3~$(git_prompt_info)%#' ZSH_THEME_GIT_PROMPT_PREFIX="[" ZSH_THEME_GIT_PROMPT_SUFFIX="]"
作ろうとするテーマはごく基本的なものです。おこなうのは、プロンプトを設定して、カレントディレクトリがGitリポジトリの場合にプロンプトの一部として表示するプレフィックスとサフィックスを定義することです。さらにテーマをカスタマイズしたければ、他のテーマのソースコードを見てヒントを得ることができるでしょう。またこの参考ページには、PROMPT
オプションで指定できる多くの文字とその意味についての説明があります。作成したテーマを見るためには、.zshrc
ファイルのZSH_THEME
オプションを修正して作成したテーマの名前と合わせます。
ZSH_THEME="eifion"
プラグイン
プラグインを使ってzshを簡単に拡張することができます。テーマの場合と同じようにデフォルトの状態で多くの種類のプラグインが提供されています。プラグインがある場所は~/.oh-my-zsh/plugins
ディレクトリです。新規に追加する前に、どのような機能があるかディレクトリ内を一度見てみるのがいいでしょう。Bundlerプラグインを見てみましょう。このプラグインには_bundler
ファイルが含まれています。プラグインにアンダースコアで始まるファイルが含まれている場合はコマンドに何らかの自動補完機能を付加することを意味します。このプラグインは他にもいくつか機能を持っています。よく使われるBundlerコマンドのエイリアスを追加し、またよく使われるRails関連のコマンドを必ずbundle exec
を介して実行させて、いちいち入力しなくてもいいようにしています。
利用するべきプラグインがいくつかあります。brew
プラグインは、gem
プラグインと同じくいくつかの自動補完機能を追加します。その他のいくつかは機能的には小さいもので、例えばrails3
とruby
のプラグインはいくつかのエイリアスを追加するだけです。プラグインを追加するには、.zshrc
ファイルで下のようにplugins
オプションに追加するだけです。
plugins=(git bundler brew gem)
プラグインを自分で作成することもできます。プロジェクトの内容をすべて~/code
ディレクトリに保存していますが、プロジェクトのディレクトリに移動するためにいちいちcd ~/code/<project>
とタイプしなくてはいけないのは少し手間です。そこでc
コマンドを設定し、簡単にプロジェクトのディレクトリに移動できるようにします。カスタムプラグインは~/.oh-my-zsh/custom/plugins
ディレクトリに作成します。プラグインごとにディレクトリと.plugin.zsh
ファイルが必要です。
c() { cd ~/code/$1; } _c() { _files -W ~/code -/; } compdef _c c
上の1行目はc
コマンドを定義していて、 単純にcode
ディレクトリの下の、引数で指定した名前のサブディレクトリにカレントディレクトリを設定します。2行目はコマンドの自動補完機能を設定しています。コマンドに自動補完機能を付加するには、同じ名前のコマンドをもうひとつ作成し、名前の始めにアンダースコアを付けます。_c
コマンドは_files
completion behaviourに委譲され、~/code
ディレクトリ内のファイルに基づいて自動補完をおこないます。最後の行は、_c
がc
の自動補完コマンドとして使用されることを宣言することで補完機能を定義しています。
作成したプラグインを利用可能にするために、.zshrc
ファイルでプラグインオプションに追加します。
plugins=(git bundler brew gem eifion)
変更を有効化するために新規のターミナルウィンドウを開きます。これで新しいコマンドが利用可能になりました。
oh-my-zshに関する今回のエピソードは以上です。シェルを使う機会が多い場合は、システムのデフォルトシェルをzshに置き換えることを検討してみてはいかがでしょうか?