bashからzshに移行してみたときのメモ

普段はCygwinからLinux系のサーバに接続して作業しているので、以下の記事はCygwinを前提として書いてます。
ですが、「インストール」のところ以外はUbuntuとかの他のLinux系OSでも問題なく動くと思います。

# bashからzshへ移行してみた

Linuxディストリビューションで、幾つかあるシェルの中でも初期装備として採用されることの多いbash。
以前は特に不満なところはなかったのですが、最近似たような名前のディレクトリやファイルが増えてきてしまい、Tab補完の恩恵を十分に受けられなかったり、タイプミスが頻発したりしてました。
そこで、シェルの一種であるzshの記事を偶然目にし、それによるとbash以上にTab補完が強力ということなので試しに導入

# zshの設定諸々

## インストール

```
$ apt-cyg install zsh
$ zsh
```

## .zshrcの配置
初回起動時に尋ねられる
とりあえず作成して、後でいろいろ調整。

## 最低限の設定
### 補完
zshは補完機能に優れているので、その機能を有効化する。
追加でファイルをインストールする必要は無し。

```zsh:~/.zshrc
autoload -U compinit
compinit
```

これだけで、Tab補完がヌルヌル動く。
`compinit -u`のオプションありのもネットで散見された。補完に表示されるファイルに関するセキュリティのオプションだそう。

alias,function,PATHは適宜bashから引き継ぐべし

> 参考URL
> [zshのセキュリティオプション](http://d.hatena.ne.jp/ywatase/20071103)

### gitコマンドの補完関係
gitコマンドの補完もbash同様可能。
また、ブランチ情報のプロンプト表示も大体同じようにできる。
まずは補完の方から。

```:
% mkdir -p ~/.zsh/completion/
% cd ~/.zsh/completion/
% pwd
~/.zsh/completion
% wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
% wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh
# リンクは2017/10/11現在

# ファイル名を変更しておく
% mv git-completion.zsh _git
```

git-completion.zshはそれぞれ名前も変えておく必要があるんだそう。

次に、既存の設定に加えて、.zshrcに追記する。

```zsh:~/.zshrc
# autoloadの文より前に追記すること。
fpath=(~/.zsh/completion $fpath)

autoload -U compinit
compinit -u
```


追記したら、以下のコマンドを実行。

```
% rm -f ~/.zcompdump
% compinit
```

以上。最小限の設定でした。

> 参考URL
> [gitのソースツリーに含まれるgit-completion.zshをzshで使う手順](https://gist.github.com/juno/5546179)
> [zshでgitのコマンドやブランチ名を補完できるようにする](http://blog.qnyp.com/2013/05/14/zsh-git-completion/)

## PROMPTの詳細設定

ブランチの情報をプロンプトで簡単に確認できるようにしたい。
どうやらbashとほぼ同じ感覚で導入できるらしい。

まずは必要ファイルのダウンロードから。

```
% cd
% wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
% mv git-prompt.sh .git-prompt.sh
```

ホームディレクトリが散らからないようにリネームだけしておく。
例によって`~/.zshrc`に追記する。

```zsh:~/.zshrc
setopt PROMPT_SUBST
source ~/.git-prompt.sh

GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWUPSTREAM=1
GIT_PS1_SHOWUNTRACKEDFILES=1
#GIT_PS1_SHOWSTASHSTATE=1

PROMPT='[%n@%m:%~]$(__git_ps1 " (%s)")%# '
```

諸々の変数に1を代入することで、それぞれの情報を表示する機能を有効／無効に出来る。
詳しい内容については、以下の参考URLを参照されたし。


### プロンプトをカラフルに

そうだ、色を付けよう。

文字列の色は"%F{color} *hoge* %f"で、ボールド体などの書体は"%B **hoge** %b"というように、挟めば可能。

以下にワイのcygwin風プロンプト。

```zsh:~/.zshrc
PROMPT='
[%B%F{red}%n@%m%f%b:%F{yellow}%~%f]%F{cyan}$(__git_ps1 " (%s)")%f
%# '
```

`~/.zshrc`ファイル内で改行すると、プロンプトにもそのまま反映される。カンタン。

ちなみに使用してる色は赤、黄、青。
まるで信号機である。

> 参考URL
> [zshプロンプトのカスタマイズ](https://qiita.com/yamagen0915/items/77fb78d9c73369c784da)
> [zshのプロンプトにgitのブランチ名を表示する](https://blog.bungu-do.jp/archives/3880)
> [Zshプロンプトの色設定](http://www.sakito.com/2011/11/zsh.html)
> [「Git補完をしらない」「git statusを1日100回は使う」そんなあなたに朗報【git-completionとgit-prompt】](https://qiita.com/varmil/items/9b0aeafa85975474e9b6)

## Tab補完の詳細設定

Tab補完の挙動など、各種詳細設定

### 補完のリスト表示時に`ls --color`と同じカラースキームを使用

色が付くだけでかなり有り難い。

```zsh:~/.zshrc
eval `dircolors /etc/DIR_COLORS`
autoload -U colors
colors
zstyle ':completion:*' list-colors "${LS_COLORS}"
```

### その他補完時の詳細設定

```zsh:~/.zshrc
#単語の入力途中でもTab補完を有効化
setopt complete_in_word
# 補完候補をハイライト
zstyle ':completion:*:default' menu select=1
# キャッシュの利用による補完の高速化
zstyle ':completion::complete:*' use-cache true
#大文字、小文字を区別せず補完する
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
# 補完リストの表示間隔を狭くする
setopt list_packed
```

補完に関してはもう十分なくらい。

## page up/downキーでのヒストリー補完

もう一押し。
bashだと~/.inputrcを編集することになるが、zshでは例によって~/.zshrcに追記するだけでよい。
これもまた便利。

```zsh:~/.zshrc
bindkey "^[[5~" history-beginning-search-backward
bindkey "^[[6~" history-beginning-search-forward
```

"^P"とか"^N"に書き換えれば、Ctrl-P/Nで補完できる。
そのへんはお好みで。

## ヒストリの共有

screenとか、tmuxとか、もしくは複数端末を表示して作業する際、使用したコマンド履歴を各端末画面で共有できる設定があります。
`~/.zsh_history`とか適当なファイルを媒体として実現させる模様。
例によって`~/.zshrc`に追記する。

```zsh:~/.zshrc
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
# プロセスを横断してヒストリを共有
setopt inc_append_hisotry
# ヒストリの共有の有効化
setopt share_history
# 直前と同じコマンドをヒストリに追加しない
setopt hist_ignore_dups
# ヒストリに追加されるコマンドが古いものと同じなら古いものを削除
setopt hist_ignore_all_dups
```

このあたりの恩恵は正直あまり実感していない。
もっと使い込まねば。

## zshの優しさ

怠惰でいい加減なユーザを支えてくれる嬉しい設定。

- `cd`と打つのさえ面倒
- 以前作業してたディレクトリにサクッと戻りたい
- タイピング速度が疾すぎてキーボードが正しく出力してくれない

このあたりの設定は流石としか言えない。

```zsh:~/.zshrc
# cdを使わずにディレクトリを移動できる
setopt auto_cd
# "cd -"の段階でTabを押すと、ディレクトリの履歴が見れる
setopt auto_pushd
# コマンドの打ち間違いを指摘してくれる
setopt correct
```

# ログインシェルの変更

ターミナルを起動したタイミングで、自動的にzshを起動するようにしたい。
この設定はLinuxだと簡単らしい

端末のコマンドラインにおいて、以下のように入力。

- Linux系

```
$ chsh
```
 
パスワードを入力して、シェルをフルパスで指定するだけ。

Cygwinを利用する人の場合は、`/etc/passwd`と`/Cygwin.bat`の中身のシェル名をマニュアルで変更する。
デフォルトだと`/etc/passwd`が存在しないらしいので、まず作るところから。

- Cygwin

```
% mkpasswd > /etc/passwd
```

あとは`% sed -i "s/bash/zsh/g" filename`とか、エディタとかでシェル名を置き換えて完了。

これで、次回ログイン時からzshが起動するようになる。

> 参考URL
> [cygwinでログインシェルを変更する。 - てきとーなブログ](http://azoay.hatenablog.com/entry/2015/06/15/122106)
> [ログインシェルを変更するには：Linux最強Tips集](http://linuxtips.biz/020/post_79.html)


# その他参考URL

いくつかのコラムでは参考URLを付けてなかったが、
それらは以下のサイトから適当に抜き出したものである。

先人の有り難い知恵の結晶である。

> 参考URL
> [めんどくせーからzshrcそのまま晒す - Qiita](https://qiita.com/kotashiratsuka/items/ae37757aa1d31d1d4f4d)
> [zshの補完を強化するTips - Qiita](https://qiita.com/syui/items/ed2d36698a5cc314557d)
> [Zsh - ArchWiki](https://wiki.archlinux.jp/index.php/Zsh#Zsh_.E3.82.92.E3.83.87.E3.83.95.E3.82.A9.E3.83.AB.E3.83.88.E3.81.AE.E3.82.B7.E3.82.A7.E3.83.AB.E3.81.AB.E3.81.99.E3.82.8B)
> [漢のzsh | コラム | マイナビニュース](http://news.mynavi.jp/column/zsh/)

以上。

（LD_LIBRARY_PATHの設定も厄介だった）

~~もう少し見やすい記事にしたいところ。~~