こいつを~/.zshrcへコピーだ

これまで、zshの基本となる設定を説明してきた。設定ファイルにエスケープコードを含めておいたためか「そのままコピー&ペーストしたんだけど使えねぇよ!!」という憂き目に遭った読者がいらっしゃったようだ。zshを学び始めるにあたって、この経験はまずい。「ネットで見つけた設定ファイルをコピペしたら、ヒャッホイ!動いたぜ!!」というくらいじゃないとモチベーションは上がらない。

そのようなわけで、今回はそのままコピー&ペーストすれば使える~/.zshrcファイルについて述べておく。zshを始めたばかりのユーザ、またはこれから始めようというユーザは、こいつをコピー&ペースしてとりあえずzshの底力を満喫してほしい。なお、zsherが多いと想定されるLinux、FreeBSD、Mac OS X上で動作するように調整しておいた。

以前設定ファイルをまとめた後に公開したコラムの内容も反映させている。「コラムの内容読むの、面倒くさいなぁ」という読者も、これをコピー&ペースして使ってみると良いだろう。

リスト1.1 コピー&ペースト対応 ~/.zshrc ファイル - LInux/FreeBSD/Mac OS X 対応版

# users generic .zshrc file for zsh(1)

## Environment variable configuration
#
# LANG
#
export LANG=ja_JP.UTF-8

## Default shell configuration
#
# set prompt
#
autoload colors
colors
case ${UID} in
0)
  PROMPT="%B%{${fg[red]}%}%/#%{${reset_color}%}%b "
  PROMPT2="%B%{${fg[red]}%}%_#%{${reset_color}%}%b "
  SPROMPT="%B%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%}%b "
  [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
    PROMPT="%{${fg[white]}%}${HOST%%.*} ${PROMPT}"
  ;;
*)
  PROMPT="%{${fg[red]}%}%/%%%{${reset_color}%} "
  PROMPT2="%{${fg[red]}%}%_%%%{${reset_color}%} "
  SPROMPT="%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%} "
  [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
    PROMPT="%{${fg[white]}%}${HOST%%.*} ${PROMPT}"
  ;;
esac

# auto change directory
#
setopt auto_cd

# auto directory pushd that you can get dirs list by cd -[tab]
#
setopt auto_pushd

# command correct edition before each completion attempt
#
setopt correct

# compacked complete list display
#
setopt list_packed

# no remove postfix slash of command line
#
setopt noautoremoveslash

# no beep sound when complete list displayed
#
setopt nolistbeep

## Keybind configuration
#
# emacs like keybind (e.x. Ctrl-a goes to head of a line and Ctrl-e goes
# to end of it)
#
bindkey -e

# historical backward/forward search with linehead string binded to ^P/^N
#
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 "^p" history-beginning-search-backward-end
bindkey "^n" history-beginning-search-forward-end
bindkey "\\ep" history-beginning-search-backward-end
bindkey "\\en" history-beginning-search-forward-end

## Command history configuration
#
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt hist_ignore_dups # ignore duplication command history list
setopt share_history # share command history data

## Completion configuration
#
autoload -U compinit
compinit

## Alias configuration
#
# expand aliases before completing
#
setopt complete_aliases # aliased ls needs if file/dir completions work

alias where="command -v"
alias j="jobs -l"

case "${OSTYPE}" in
freebsd*|darwin*)
  alias ls="ls -G -w"
  ;;
linux*)
  alias ls="ls --color"
  ;;
esac

alias la="ls -a"
alias lf="ls -F"
alias ll="ls -l"

alias du="du -h"
alias df="df -h"

alias su="su -l"

## terminal configuration
#
unset LSCOLORS
case "${TERM}" in
xterm)
  export TERM=xterm-color
  ;;
kterm)
  export TERM=kterm-color
  # set BackSpace control character
  stty erase
  ;;
cons25)
  unset LANG
  export LSCOLORS=ExFxCxdxBxegedabagacad
  export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
  zstyle ':completion:*' list-colors \
    'di=;34;1' 'ln=;35;1' 'so=;32;1' 'ex=31;1' 'bd=46;34' 'cd=43;34'
  ;;
esac

# set terminal title including current directory
#
case "${TERM}" in
kterm*|xterm*)
  precmd() {
    echo -ne "\033]0;${USER}@${HOST%%.*}:${PWD}\007"
  }
  export LSCOLORS=exfxcxdxbxegedabagacad
  export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
  zstyle ':completion:*' list-colors \
    'di=34' 'ln=35' 'so=32' 'ex=31' 'bd=46;34' 'cd=43;34'
  ;;
esac

## load user .zshrc configuration file
#
[ -f ~/.zshrc.mine ] && source ~/.zshrc.mine

基本的にこれまで説明してきた設定内容だが、新しい設定や変更、修正が加えてあるので以降で説明する。

色付プロンプト

色付プロンプトの設定を示す。

リスト2.1 色付プロンプトの設定

autoload colors
colors
case ${UID} in
0)
  PROMPT="%B%{${fg[red]}%}%/#%{${reset_color}%}%b "
  PROMPT2="%B%{${fg[red]}%}%_#%{${reset_color}%}%b "
  SPROMPT="%B%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%}%b "
  [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
    PROMPT="%{${fg[white]}%}${HOST%%.*} ${PROMPT}"
  ;;
*)
  PROMPT="%{${fg[red]}%}%/%%%{${reset_color}%} "
  PROMPT2="%{${fg[red]}%}%_%%%{${reset_color}%} "
  SPROMPT="%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%} "
  [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
    PROMPT="%{${fg[white]}%}${HOST%%.*} ${PROMPT}"
  ;;
esac

背景色が白でも黒でもそれなりに見える色を選んでおいた。これまではエスケープを使っていたが、それではコピー&ペーストで動かないので、colorsをロードして変数を使うようにした。これでコピー&ペーストで使える。

プロンプトにはカレントパスが表示される。リモートログインしている場合はホスト名も表示される。多くの場合でそれなりに使える設定だが、プロンプトは最も癖が出るところなので、適宜変更して自分流に変えるとよい。

シェルの挙動を設定

以下はシェルの挙動の設定である。

リスト3.1 細かにシェルの挙動を調整だ!!

# auto change directory
#
setopt auto_cd

# auto directory pushd that you can get dirs list by cd -[tab]
#
setopt auto_pushd

# command correct edition before each completion attempt
#
setopt correct

# compacked complete list display
#
setopt list_packed

# no remove postfix slash of command line
#
setopt noautoremoveslash

# no beep sound when complete list displayed
#
setopt nolistbeep

setopt auto_pushdでパスを自動的に記録しておくので、cd - [tab]でこれまで記録したパスが補完表示される。これはなかなか便利だ。

これまで説明していなかった設定として、setopt noautoremoveslashを追加してある。これはパスの最後に付くスラッシュ(/)を自動的に削除させないためのものである。デフォルトでは自動的に削除されるのだが、それではコマンドの意味が変わってしまうことがある。この設定は有効にしておいた方が無難だろう。

キー流儀

zshを使うようなユーザの多くはEmacs風のショートカットキーになれている。必須といったところだ。

リスト4.1 キーの流儀はEmacs風

bindkey -e

コマンド履歴とショートカットキー

以下にコマンド履歴の有効化と検索用のショートカットの設定を示す。

リスト5.1 コマンド履歴の有効化と検索用のショートカットの設定

# historical backward/forward search with linehead string binded to ^P/^N
#
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 "^p" history-beginning-search-backward-end
bindkey "^n" history-beginning-search-forward-end
bindkey "\\ep" history-beginning-search-backward-end
bindkey "\\en" history-beginning-search-forward-end

## Command history configuration
#
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt hist_ignore_dups # ignore duplication command history list
setopt share_history # share command history data

[Ctrl] - p/nまたは[ESC] - p/nで操作できるようにしてある。この設定があればbash/tcshから移行してきたユーザも、それなりに同じように使えるだろう。

最強補完呪文コンプイニット

zshを最強にする呪文コンプイニットはなにがあっても実行しておこう。これがzshをして最強たらしめている。もはや説明もいらないだろう。

リスト6.1 zsh最強の補完呪文コンプイニット

autoload -U compinit
compinit

エイリアスと必須オプション

以下にエイリアスとエイリアス用の必須オプションを示す。

リスト7.1 エイリアスとエイリアス用の必須オプション

setopt complete_aliases # aliased ls needs if file/dir completions work

alias where="command -v"
alias j="jobs -l"

case "${OSTYPE}" in
freebsd*|darwin*)
  alias ls="ls -G -w"
  ;;
linux*)
  alias ls="ls --color"
  ;;
esac

alias la="ls -a"
alias lf="ls -F"
alias ll="ls -l"

alias du="du -h"
alias df="df -h"

alias su="su -l"

エイリアスは好きなように設定すればよいが、setopt complete_aliasesを忘れないよう、注意して欲しい。setopt complete_aliasesを設定しておけば、補完される前にオリジナルのコマンドまで展開してチェックされる(ただし、表示はエイリアスのまま)。例えば、上記の例では色付lsコマンドのエイリアスを設定しているが、このままでは[Tab]キーを使ったファイルやディレクトリの補完が行われない。setopt complete_aliasesを設定しておけば、エイリアスがlsコマンドまで展開されるので補完の対象となり。[Tab]キーでファイルやディレクトリが補完されるようになる。

lsと補完表示に色付け、ターミナルタイトルにパスを表示

リスト8.1では、ターミナルごとにlsコマンドと補完表示の色設定をしている。これでlsコマンドや[Tab]キーで補完表示させた場合に色が付く。環境変数TERMの値をxtermからxterm-colorに設定し直しているのは、xterm-colorでないと色付けしないプラットフォームやターミナルがあるからだ。

リスト8.1 ls色付け、補完候補に色付け、ターミナルタイトルにパスを表示

## terminal configuration
#
unset LSCOLORS
case "${TERM}" in
xterm)
  export TERM=xterm-color
  ;;
kterm)
  export TERM=kterm-color
  # set BackSpace control character
  stty erase
  ;;
cons25)
  unset LANG
  export LSCOLORS=ExFxCxdxBxegedabagacad
  export LS_COLORS='di=01;34:ln=01;35:so=01;32:ex=01;31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
  zstyle ':completion:*' list-colors \
    'di=;34;1' 'ln=;35;1' 'so=;32;1' 'ex=31;1' 'bd=46;34' 'cd=43;34'
  ;;
esac

# set terminal title including current directory
#
case "${TERM}" in
kterm*|xterm*)
  precmd() {
    echo -ne "\033]0;${USER}@${HOST%%.*}:${PWD}\007"
  }
  export LSCOLORS=exfxcxdxbxegedabagacad
  export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'
  zstyle ':completion:*' list-colors \
    'di=34' 'ln=35' 'so=32' 'ex=31' 'bd=46;34' 'cd=43;34'
  ;;
esac

ウィンドウプラットフォームの場合、ターミナルのタイトルに「ユーザ名@ホスト名:カレントパス」も表示されるようになる。

俺設定は~/.zshrc.mineへ分離だ

リスト9.1では、ホームディレクトリに~/.zshrc.mineファイルがあればそれを読み込むようにしている。ベースとなる設定と切り分けることで、その場限りの設定、期限がある設定、ホストごとの設定、実験的な設定などを切り分けることができる。これは設定ファイルを整理しつつ実験していく上で有用なので、活用して欲しい。

リスト9.1 俺設定は~/.zshrc.mineへ分離だ

[ -f ~/.zshrc.mine ] && source ~/.zshrc.mine

以上、zsherとして出発するにはよい感じにまとまった設定ファイルではないかと思う。読者の皆さんも、思う存分zsherを楽しむべし!!