「zsh」の設定

ここでの作業は「Ubuntu」で行った。
Linuxでは大体のディストリビューションで動作するが、当然環境に合わせて多少変更する。
その他の環境ではもう少し修正が必要なものもある。

「zsh」の設定ファイルの呼ばれる順序

設定ファイルの種類

以下の5つの環境設定ファイルがある。
・ .zshenv
・ .zprofile
・ .zshrc
・ .zlogin
・ .zlogout

ログインするとき(例えば、ssh経由やコンソールからのログイン)

~/.zshenv
-/.zprofile
-/.zshrc
-/.zlogin

zshを起動したとき(例えば、ktermを新たに開いたり、zshと打ったりした場合)

~/.zshenv
-/.zshrc

スクリプトを実行した場合(% zsh test.zsh 等の場合)

~/.zshenv

ログインシェルとして起動されたzshからログアウトする場合

~/.zlogout

「zsh」の設定

環境変数の設定

「~/.zshenv」に記述する。

Unix$ vi ~/.zshenv <= 設定ファイルの編集
###############################################
# 環境変数                                    #
###############################################
PATH=$PATH:$HOME/bin  # パスの追加
EDITOR=/usr/bin/vi    # エディタの指定
export EDITOR PATH

# 言語の設定
LANG=ja_JP.UTF-8
export LANG

# 補完リストが多いときに尋ねる数
# -1 : 尋ねない
#  0 : ウィンドウから溢れるときは尋ねる
LISTMAX=0
export LISTMAX


Unix$ source ~/.zshenv <= .zshenvファイルの読み込み

「zsh」の設定

ログイン時に読み込まれる「~/.zshrc」を編集する。
また、「エスケープ」の部分はこのままコピー&ペースト出来ないので、エディタで新たに編集する必要あり。

Unix$ vi ~/.zshrc <= 設定ファイルの編集
###############################################
# キーバインド                                #
###############################################
# viライクキーバインド
bindkey -v
# Emacsライクキーバインド
#bindkey -e

###############################################
# 補完関係                                    #
###############################################
# 標準の補完設定
autoload -U compinit
compinit

# ディレクトリ名を入力するだけでカレントディレクトリを変更
setopt auto_cd

# タブキー連打で補完候補を順に表示
setopt auto_menu

# 自動修正機能(候補を表示)
#setopt correct

# 補完候補を詰めて表示
setopt list_packed

# 補完候補一覧でファイルの種別を識別マーク表示(ls -F の記号)
setopt list_types

# パスの最後に付くスラッシュを自動的に削除しない
setopt noautoremoveslash

# = 以降でも補完できるようにする( --prefix=/usr 等の場合)
setopt magic_equal_subst

# 補完候補リストの日本語を正しく表示
setopt print_eight_bit

# 補完の時に大文字小文字を区別しない(但し、大文字を打った場合は小文字に変換しない)
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# lsコマンドの補完候補にも色付き表示
eval `dircolors`
zstyle ':completion:*:default' list-colors ${LS_COLORS}
# kill の候補にも色付き表示
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([%0-9]#)*=0=01;31'

###############################################
# 履歴関係                                    #
###############################################
# ヒストリー機能
HISTFILE=~/.zsh_history      # ヒストリファイルを指定
HISTSIZE=10000               # ヒストリに保存するコマンド数
SAVEHIST=10000               # ヒストリファイルに保存するコマンド数
setopt hist_ignore_all_dups  # 重複するコマンド行は古い方を削除
setopt hist_ignore_dups      # 直前と同じコマンドラインはヒストリに追加しない
setopt share_history         # コマンド履歴ファイルを共有する
setopt append_history        # 履歴を追加 (毎回 .zsh_history を作るのではなく)
setopt inc_append_history    # 履歴をインクリメンタルに追加
setopt hist_no_store         # historyコマンドは履歴に登録しない
setopt hist_reduce_blanks    # 余分な空白は詰めて記録
#setopt hist_ignore_space    # 先頭がスペースの場合、ヒストリに追加しない

# cd - と入力してTabキーで今までに移動したディレクトリを一覧表示
setopt auto_pushd

# ディレクトリスタックに重複する物は古い方を削除
setopt pushd_ignore_dups

# コマンド履歴の検索機能の設定
# ^[  は「エスケープ」
# viなら    Ctrl-v ESC
# Emacsなら Ctrl-q ESC
# viで編集する場合
# 上2行は Ctrl-v を押下した後、希望のキーを押下
# 下2行は「エスケープ」の後にキーの端末コードを入力
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[OA" history-beginning-search-backward-end
bindkey "^[OB" history-beginning-search-forward-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end
# 複数行コマンドの場合、上記の設定だと少々不都合
# tcshの様にする場合は以下のようにする
#bindkey "^P" history-beginning-search-backward-end
#bindkey "^N" history-beginning-search-forward-end

# インクリメンタルサーチの設定
bindkey "^R" history-incremental-search-backward
bindkey "^S" history-incremental-search-forward

# 全履歴の一覧を出力する
function history-all { history -E 1 }

###############################################
# プロンプト関係                              #
###############################################
# プロンプトに escape sequence (環境変数) を通す
setopt prompt_subst

# ^[  は「エスケープ」
PROMPT="%B%{^[[36m%}%n@%m %c %#%{^[[m%}%b " # 通常のプロンプト
PROMPT2="%B%_>%b "                          # forやwhile/複数行入力時などに表示されるプロンプト
SPROMPT="%r is correct? [n,y,a,e]: "        # 入力ミスを確認する場合に表示されるプロンプト
RPROMPT="%T"                                # 右に表示したいプロンプト(24時間制での現在時刻)

setopt transient_rprompt                    # 右プロンプトに入力がきたら消す

# ターミナルのタイトル
case "${TERM}" in
kterm*|xterm)
    precmd() {
        echo -ne "\033]0;${USER}@${HOST%%.*}:${PWD}\007"
    }
    ;;
esac

###############################################
# その他                                      #
###############################################
# ファイル作成時のパーミッション
umask 022

setopt no_beep               # ビープ音を消す
#setopt nolistbeep           # 補完候補表示時などにビープ音を鳴らさない

#setopt interactive_comments # コマンドラインで # 以降をコメントとする

setopt numeric_glob_sort     # 辞書順ではなく数値順でソート

setopt no_multios            # zshのリダイレクト機能を制限する

unsetopt promptcr            # 改行コードで終らない出力もちゃんと出力する
#setopt ignore_eof           # Ctrl-dでログアウトしない

setopt no_hup                # ログアウト時にバックグラウンドジョブをkillしない
setopt no_checkjobs          # ログアウト時にバックグラウンドジョブを確認しない
setopt notify                # バックグラウンドジョブが終了したら(プロンプトの表示を待たずに)すぐに知らせる

#setopt rm_star_wait         # rm * を実行する前に確認
setopt rm_star_silent        # rm * を実行する前に確認しない
#setopt no_clobber           # リダイレクトで上書きを禁止
unsetopt no_clobber          # リダイレクトで上書きを許可

#setopt chase_links          # シンボリックリンクはリンク先のパスに変換してから実行
#setopt print_exit_value     # 戻り値が 0 以外の場合終了コードを表示
#setopt single_line_zle      # デフォルトの複数行コマンドライン編集ではなく、1行編集モードになる

# カーソル位置から前方削除(Ctrl-u)
bindkey '^U' backward-kill-line

# Ctrl-h で単語ごとに削除
bindkey "^h" backward-kill-word
# / を単語の一部とみなさない記号の環境変数から削除
WORDCHARS='*?_-.[]~=&;!#$%^(){}<>'

#function chpwd() { ls }     # cd の後 ls も実行

###############################################
# エイリアス                                  #
###############################################
# 補完される前にオリジナルのコマンドまで展開してチェックする
setopt complete_aliases

# エイリアス
alias ls='ls --color=auto'
alias h='history -E -32'
alias ll='ls -laF --color | more'


# 他の設定ファイルを読み込む
[ -f $HOME/.zshrc.mine ] && source $HOME/.zshrc.mine


Unix$ source ~/.zshrc <= .zshrcファイルの読み込み

書式の指定

プロンプトの設定でカラー表示しているが、色の指定は
PROMPT="%B%{^[[36m%}%n@%m %c %#%{^[[m%}%b "
の 36 の部分で行う。
書式の指定方法は以下の通り。

書式 番号
通常 00
太字 01
下線 04
点滅 05
前背色反転 07
表示しない 08
ノーマル化 22
下線なし 24
点滅なし 25
前背色反転なし 27
番号(文字) 番号(背景)
30 40
31 41
32 42
33 43
34 44
35 45
シアン 36 46
37 47
デフォルト 39 49

複数指定する場合、以下のようにセミコロンで区切る。

PROMPT="%B%{^[[36;45m%}%n@%m %c %#%{^[[m%}%b "

lsコマンドの補完時にもカラー指定しているが、FreeBSD等はデフォルトのlsコマンドでは、
eval `dircolors`
の部分でエラーとなる。
その為、以下のように変更する。
また、Linux等でもデフォルトから変更したい場合、同様に変更する。

Unix$ vi ~/.zshenv <= 設定ファイルの編集
以下のように変数と書式の対応を指定
LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:ex=01;32:*.tar=01;31'
export LS_COLORS
ここまで

Unix$ vi ~/.zshrc <= 設定ファイルの編集
#eval `dircolors` <= コメントアウト

LS_COLORSの変数で指定している書式の部分は上記を参照。
変数は以下の通り。

変数 内容
no 通常のテキストファイル
fi 通常のファイル
di ディレクトリ
ln シンボリックリンク
or リンク切れのシンボリックリンク
so ソケットファイル
pi FIFOファイル
ex 実行ファイル
bd ブロックスペシャルファイル
cd キャラクタスペシャルファイル
su setuid付き実行ファイル
sg setgid付き実行ファイル
tw スティッキビットありother書込権限付きディレクトリ
ow スティッキビットなしother書込権限付きディレクトリ
*.tar 拡張子(この場合、拡張子が tar)

なお、FreeBSDでデフォルトのlsコマンドでカラー指定している場合、補完候補との整合性を合わせた方が混乱しない。
FreeBSDでのlsコマンドのカラー指定の方法はこちら の「colorlsによるカラー表示」の部分を参照。
なお、上記のリンク先はcshの場合なので、zshでは「~/.zshenv」ファイルにLSCOLORS変数をexportで指定する。

キーの端末コードの確認

コマンド履歴の検索機能では矢印キーを利用した。
矢印キーなどのキーの確認方法は、Ctrl-v を押下した後目的のキーを押下する。
自分の環境では以下のように表示された。

Unix$ [A <= 上矢印キーを押下
Unix$ [B <= 下矢印キーを押下
Unix$ [C <= 右矢印キーを押下
Unix$ [D <= 左矢印キーを押下

エスケープシーケンス

プロンプトの表示等で利用しているエスケープシーケンスの主なもの。

エスケープシーケンス 説明
${WINDOW:+"[$WINDOW]"} screen 実行時にスクリーン番号を表示 (prompt_subst が必要)
%/ , %d ディレクトリ(0=全て、-1=前方からの数)
%~ ディレクトリ(ホームディレクトリが ~ で短縮表示される)
%h , %! 現在の履歴イベント番号
%L 現在の $SHLVL の値
%M マシンのフルホスト名
%m ホスト名の最初の `.' までの部分
%S (%s) 突出モードの開始 (終了)
%U (%u) 下線モードの開始 (終了)
%B (%b) 太字モードの開始 (終了)
%t , %@ 12 時間制, am/pm 形式での現在時刻
%n , $USERNAME ユーザー ($USERNAME は環境変数なので setopt prompt_subst が必要)
%N シェル名
%i %N によって与えられるスクリプト, ソース, シェル関数で, 現在実行されている行の番号 (debug用)
%T 24 時間制での現在時刻
%* 24 時間制での現在時刻, 秒付き
%w `曜日-日' の形式での日付
%W `月/日/年' の形式での日付
%D `年-月-日' の形式での日付
%D{string} strftime 関数を用いて整形された文字列 (man 3 strftime でフォーマット指定が分かる)
%l ユーザがログインしている端末から, /dev/ プレフィックスを取り除いたもの
%y ユーザがログインしている端末から, /dev/ プレフィックスを取り除いたもの (/dev/tty* はそのまま)
%? プロンプトの直前に実行されたコマンドのリターンコード
%_ パーサの状態
%E 行末までクリア
%# 特権付きでシェルが実行されているならば `#', そうでないならば `%' == %(!.#.%%)
%v psvar 配列パラメータの最初の要素の値
%{...%} リテラルのエスケープシーケンスとして文字列をインクルード
%(x.true-text.false-text) 三つ組の式
%<string<, %>string>, %[xstring] プロンプトの残りの部分に対する, 切り詰めの振る舞い
< の形式は文字列の左側を切り詰め, > の形式は文字列の右側を切り詰め
%c , %. , %C $PWD の後ろ側の構成要素
設定ファイルのコンパイル

zcompileコマンドを利用して、設定ファイルの読み込みを早くする。

Unix$ zcompile ~/.zshrc

これで、~/.zshrc.zwc というファイルが作成される。
.zwcファイルがある場合、優先して読み込まれる。
ただし、この場合設定ファイルを変更するたびにコマンドを実行する必要がある。

「zsh」をログインシェルとして使う

ログインシェルとして使えるシェルは
/etc/shells
に記述しているもののみである。
基本的にインストール時に記述されるが、もし記述されない方法でインストールした場合、追記する。
ファイルはテキストファイルなので、「zsh」のパスを絶対パスで指定する。

▲ページのトップへ