Zsh
Mac
環境構築
コマンド

とりあえずZshを使えば良いんだろう?

More than 3 years have passed since last update.

Zshに移行するにあたってやった事。


Why zsh.


Only this one.(嘘というか受け売り)


  • 軽量で強力な補完機能


Only this one.(本当)


  • 凄腕の人たちが使っているので、自分も使ってみたらzshの良さの恩恵を受けられるかなと思ったから。


zshのインストール

Macの場合デフォルトでも入っているけど、新しいのをインストールする。

brew install zsh

brew install zsh-completions

2個目のzsh-completionsは非標準コマンドを補完できるようになる素敵なプラグイン


ログインシェルをzshにする

さらbash(さらば bash)


brewでインストールしたzshをシェル一覧に登録する。

vi /etc/shells

/usr/local/bin/zsh を追加する

# List of acceptable shells for chpass(1).

# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh


デフォルトの変更 -Goodbye bash-

$ chsh -s /usr/local/bin/zsh


  • Zshをデフォルトシェルとして起動するには、ログアウト・ログインが必要


zshの力を40秒で味わう


設定に魔法の2行の追加

vi ~/.zprofile して魔法の2行を付け加える。たぶん新規作成。


~/.zprofile

autoload -U compinit

compinit

.source ~/.zprofile (もしくは、ターミナル再起動して再ログイン)をする。


ls -を入力したらtabキーを押す。

そこには幸せが見えるはず。

rm - tabとか mysql - tab とか git tabとか試したくなるはず。


.zprofile? or .zshrc?

コメントにて@mollifierさんにご指摘頂いたので、本項で補足いたします。ありがとうございます。

漢のzsh初め、先駆者の方々曰く、profileがロードされるのは以下のようなタイミングと順序となる。


ログインシェルとしてzshが起動された場合


1 ~/.zshenv

2 ~/.zprofile

3 ~/.zshrc

4 ~/.zlogin


インタラクティブシェル(ログインシェルとしてではない)としてzshが起動された場合


1 ~/.zshenv

2 ~/.zshrc


シェルスクリプトを実行するコマンドとしてzshが起動された場合


1 ~/.zshenv



そして多くの諸兄たちは.zshrcを推奨しているが、ここではあえて.zprofileに記述することにする。

これはインタラクティブシェルとしてzshを起動した場合、通常にログインした場合との挙動の違いに気が付き設定ファイルを理解して移行したいと思っているため。

コピペなので少しでも自分で考えてprofileを書こうと思う私なりの防御策。

なお、.zshenvに記述するとzshをスクリプトとした場合に、環境固有の設定が読み込まれるため汎用性が損なわれる。


元の設定の移行

PATHの設定等だけであれば .bash_profile がそのまま使えるので、.zprofile に追加する。

ただし、プロンプトとかを弄っている場合はプロンプトの書き方が異なるので注意。

邪道なやり方なのかも知れないけど、これでOK。

cat .bash_profile >> .zprofile

もしくは

echo "source ~/.bash_profile" >> .zpofile

これで今まで使っていたbashのPATHとかを引き継ぎつつzshが使える。


プロンプトを書き換える

shのカスタマイズというとまずはプロンプトでしょ。

と言うか、Mac(Yosemite)の場合、bashのプロンプトの設定は/etc/bashrcに書いてあり、あまり不便は感じない設定である。

当たり前だけどzshにすると /etc/bashrc は読み込まないためプロンプトが今までとは変わる。

恐らくzshのデフォルトだとホスト名しか表示されず、ユーザもカレントディレクトリも表示されない。

Macのデフォルトと同じにするには.zprofileをこんな感じにする。

# prompt

PROMPT='%m:%c %n$ '


使いそうなパラメタ

パラメタ
意味

%M
ホスト名
localhost.localdomain

%m
ホスト名
localhost

%d
カレントディレクトリ(フルパス)
/Users/ktr_type23/work

%~
カレントディレクトリ(フルパス2)
~/work

%C
カレントディレクトリ(相対パス)
ktr_type23

%c
カレントディレクトリ(相対パス)
~

%n
ユーザ名
ktr_type23

%#
ユーザ種別
#(root) %(root以外)

%?
直前のコマンドの戻り値
0

%D
日付(yy-mm-dd)
15-02-10

%W
日付(yy/mm/dd)
15/02/10

%w
日付(day dd)
Tue 10

%*
時間(hh:flag_mm:ss)
12:34:56

%T
時間(hh:mm)
12:34

%t
時間(hh:mm(am/pm))
00:34PM


装飾

なお、%F{色}%f で囲むと、その文字を色付け出来る。

これでカレントディレクトリがgreenに色付けされる。

# prompt

PROMPT='%m:%F{green}%c%f %n$ '

背景を変えたい場合は F(f) ではなく K(k) で囲えば良い。

# prompt

PROMPT='%m:%K{green}%c%k %n$ '

※ backgroundの k らしい。わかんねーよ。。

なお、色の指定は文字だけでなく、数値でも指定出来るらしい。

文字
数値

black
0

red
1

green
2

yellow
3

blue
4

magenta
5

cyan
6

white
7


Tips


最初の.zprofile

.zprofileを晒すと共にメモ。

# zsh最強の2行

autoload -U compinit
compinit

# promptinitを使う場合はこちらを読み込む
# 利用可能なpromptの設定を見る
# $ prompt -l
# promptを設定する
# $ prompt [prompt名]
autoload -U promptinit
promptinit
# promptを独自で変更
PROMPT='%m:%F{green}%c%f %n%# '

# 履歴ファイルの保存先
export HISTFILE=${HOME}/.zhistory
# メモリに保存される履歴の件数
export HISTSIZE=1000
# 履歴ファイルに保存される履歴の件数
export SAVEHIST=100000
# 重複を記録しない
setopt hist_ignore_dups
# 開始と終了を記録
setopt EXTENDED_HISTORY
# historyを共有
setopt share_history
# ヒストリに追加されるコマンド行が古いものと同じなら古いものを削除
setopt hist_ignore_all_dups
# スペースで始まるコマンド行はヒストリリストから削除
setopt hist_ignore_space
# ヒストリを呼び出してから実行する間に一旦編集可能
setopt hist_verify
# 余分な空白は詰めて記録
setopt hist_reduce_blanks
# 古いコマンドと同じものは無視
setopt hist_save_no_dups
# historyコマンドは履歴に登録しない
setopt hist_no_store
# 補完時にヒストリを自動的に展開
setopt hist_expand
# 履歴をインクリメンタルに追加
setopt inc_append_history
# インクリメンタルからの検索
bindkey "^R" history-incremental-search-backward
bindkey "^S" history-incremental-search-forward

# migration .bash_profile
source ~/.bash_profile


幸せに思った事


ヒストリー検索

上記の.zprofileを設定している(正確には以下の設定があれば良い?)場合、

Control + rを入力すると過去のヒストリを検索出来る。

途中まで入力して、Control + r(or s)を入力すると前方一致でインクリメンタルに検索してくれる。

# 履歴ファイルの保存先

export HISTFILE=${HOME}/.zhistory
# 履歴をインクリメンタルに追加
setopt inc_append_history
# インクリメンタルからの検索
bindkey "^R" history-incremental-search-backward
bindkey "^S" history-incremental-search-forward


参考

漢のzsh

ヾ(o゚ω゚o)ノ゙bashからzshに移行して2014年を迎えよう![ログインシェル]

zshのhistoryを便利に使うためのTips