zsh-powerline


##はじめに

この記事は､[みんなで作ろう最強の設定ファイル Advent Calendar 2013](http://qiita.com/advent-calendar/2013/dotfiles)という企画の一部です｡

```bash:
$ mkdir -p ~/dotfiles/.zsh/

$ cd !$

$ git clone https://github.com/syui/dotfiles.git
```

##解説

`zsh`や`bash`というシェルで使える`powerline`があります。

![](https://lh5.googleusercontent.com/-KdisOkn-llM/UPJvSdDRl0I/AAAAAAAAC9Y/0B57OZL5F-k/s800/bashp.png)

まずは、ツールをダウンロードしていきましょう｡

```bash:
$ cd ~/dotfiles/.zsh

$ git clone https://github.com/milkbikis/powerline-shell.git
```

次に､`powerline`の設定ファイルをコピーします｡

```
$ cp config.py.dit config.py
```

そして、`install.py`を実行すると､`powerline-shell.py`というファイルが作られます。

```bash:
$ cd powerline-shell

$ ./install.py
```

あとは、設定ファイルに以下を書き込みます。

```bash:~/.zshrc
function powerline_precmd() {
  export PS1="$(~/dotfiles/.zsh/powerline-shell/powerline.py $? --shell zsh 2> /dev/null)"
}
function install_powerline_precmd() {
  for s in "${precmd_functions[@]}" ; do
    if [ "$s" = "powerline_precmd" ] ; then
      return
    fi
  done
  precmd_functions+=(powerline_precmd)
}
install_powerline_precmd
```

そして、設定ファイルの読み込みや再起動を行うと､プロンプトが反映されます｡

```bash:
$ source ~/.zshrc

$ exec $SHELL
```

##bash

上記は､`zsh`のものですが、`bash`の場合は､設定ファイルに以下を書き込みます｡

```bash:~/.bashrc
 function _update_ps1() {
       export PS1="$(~/dotfiles/powerline-shell/powerline-shell.py $? 2> /dev/null)"
    }

    export PROMPT_COMMAND="_update_ps1"
```


##設定

ここで、`powerline-shell/config.py`を編集すると、プロンプトの表示をカスタマイズできます｡

表示したくないものは､コメントアウトしていきましょう｡

```bash:~/dotfiles/powerline-shell/config.py
SEGMENTS = [
  # 'virtual_env',
  # 'username',
  'hostname',
  'ssh',
  'cwd',
  'read_only',
  'git',
  'hg',
  'svn',
  'fossil',
  'jobs',
  'root',
]

# powerline-shell/theme/{basic,solarized-dark,washed}というテーマが使えます｡
THEME = 'default'
```

最後に､設定を反映するため､再度､`install.py`を実行します｡

##オリジナルプロンプト

![](https://lh3.googleusercontent.com/-ted_IDjGWjU/UEyLUivkbQI/AAAAAAAABDI/JRWsUbOmMAY/s240/zsha.png)![](https://lh6.googleusercontent.com/-CAsKAP06EQs/UEyLT5DuteI/AAAAAAAABDE/lSKSSAk_xRk/s240/zsha.png)


また、個人的に作った[オリジナルプロンプト](https://gist.github.com/syui/9737740)があります｡

これは、ディレクトリの深層によって、コマンドラインの入力欄を移動させないようにしています。

もちろん、個人的な好みの問題ですが、もしよろしければ使ってみてください｡設定は簡単で､ダウンロードしたファイルを読み込むだけです｡

```bash:
$ mkdir -p ~/dotfiles/.zsh/

$ cd !$ && curl -O https://gist.githubusercontent.com/syui/9737740/raw/prompt.zsh

$ cd ~/dotfiles/.zsh

$ echo source $PWD/prompt.zsh >> ~/.zshrc

$ source ~/.zshrc
```

もし表示がうまく行かなければ､フォントにパッチを当てる必要があります｡

##フォントにパッチを当てる

```bash:
$ sudo port install fontforge

$ curl -O http://www.marksimonson.com/assets/content/fonts/AnonymousPro-1.002.zip && git clone https://github.com/Lokaltog/powerline

$ unzip -j *.zip

$ fontforge --script powerline/font/fontpatcher.py *.ttf

$ mv *.ttf ~/Library/Fonts/
```

##zshのプロンプトの書き方

ここでは、`zsh`の基本的なプロンプトの書き方を説明します｡

ちなみに、ここでは、具体例として､`~/dotfiles/.zsh/prompt.zsh`を参考にしてみましょう｡

まず知ってほしいのは、プロンプトに表示する内容です。`zsh`では、例えば､ディレクトリやホスト名、コマンドのエラーなどを表示できます｡

|プロンプト変数|内容|表示|
|---|---|---|
|%M|ホスト名	|localhost.localdomain|
|%m	|ホスト名	|localhost|
|%n|	ユーザ名|	root|
|%#|	ユーザ種別|	#（rootの場合）|
|%|（root以外）|-|
|%y|	ログイン端末名|	pts/0|
|%l|	ログイン端末名|	pst/0（tty*の場合はttyを省略）|
|%?|	直前のコマンドの戻り値|	0|
|%h,%!|	コマンド実行数|（history数）	1|
|%d,%/|	カレントディレクトリ|	/root/currentdir|
|%~|	カレントディレクトリ	|~/currentdir|
|%C	|カレントディレクトリ	|currentdir|
|%c,%.|	カレントディレクトリ|	currentdir（$PWD=$HOMEの場合は~）|
|%D	|日付	12-07-31|書式）yy-mm-dd|
|%W|	日付	07/31/12|書式）mm/dd/yy|
|%w|	日付	Sun 31|書式）day dd|
|%*|	時間	15:50:30|書式）hh:mm:ss|
|%T|	時間	15:50|書式）hh:mm|
|%t,%@|	時間	03:50PM|書式）hh:mm(am/pm format)|


ここで、特に面白くて役に立つのが、`%?`です。コマンドがエラーで終了したのか､成功したのかを知らせてくれます｡

参考:

[http://tegetegekibaru.blogspot.jp/2012/08/zsh_2.html](http://tegetegekibaru.blogspot.jp/2012/08/zsh_2.html)


さらに、バックグラウンドカラーとフォントカラーを設定すると､非常に分かりやすく表示できます｡

ここで、`%F`がフォントカラーで、`%K`がバックグラウンドカラーです｡そして、カラーの終わりは､`%f`や`%k`で設定します｡

例えば､以下の書き方をした場合は､どうなるでしょうか｡

```bash:
%{%F{white}%K{blue}%} %n {%k%f%}
```

この場合は､`%n`であるユーザー名が、フォントカラーを白`white`に、バックグラウンドカラーをブルー`blue`にして表示されることになります。

|カラー|内容|具体例|
|---|---|---|
|%{%F{color}%}hoge{%f}|フォントカラーを設定する|%F{cyan} hoge %f|
|%{%K{color}%}hoge{%k}|バックグラウンドカラーを設定する|%{%K{cyan}%} hoge {%k}|
|%{%K{color}%F{color}%}hoge{%f%f}|両方を設定する|%{%K{cyan}%F{black}%} hoge {%k%f}|

次に､注目すべきポイントとしては､バージョン管理の書式です｡

例えば､以下の様な記述があったとします｡

```:bash
 zstyle ':vcs_info:git:*' formats '(%s)-[%b]' '%c%u %m'
```

これは、それぞれ、以下の様な命令内容になっています。

|書式|内容|
|---|---|
|zstyle|予め用意されたスタイルを指定する|
| ':vcs_info:git:*'|git のときはステージしているかどうかを表示する|
|formats|フォーマットを指定する|
|%s	|バージョン管理システム名(git, svn, hg, ...)|
|%b	|ブランチ情報|
|%c	|stagedstr 文字列|
|%u	|unstagedstr 文字列|
|%m	|その他の情報|

参考:

[http://qiita.com/mollifier/items/8d5a627d773758dd8078](http://qiita.com/mollifier/items/8d5a627d773758dd8078)

カッコいいプロンプトができたら､是非教えて下さい｡