前回の記事では、Zshのプラグイン管理方法とおすすめのプラグインについて紹介しました。 今回は、Zshをより使いやすくカスタマイズするための基本的な設定について紹介します。

スクリーンショット

スクリーンショットでは見た目しか伝わりませんが、参考までに筆者のターミナル環境を示します。

Zshをカスタマイズすることで、入力モードをviモードにしたり、コマンド名に色をつけたりすることができます。 このようにカスタマイズする方法について紹介していきます。

動作環境

この記事の内容を検証している動作環境は次のとおりです。

  • OS X 10.11.6
  • Zsh 5.0.8

基本設定

それでは、おすすめの基本設定を紹介します。 設定の種類はいくつかあるので、それぞれの項目ごとに示します。

まず、setoptコマンドによる設定についてです。 設定と、あわせて簡単な説明を示します。

# 補完候補を一覧で表示する
setopt auto_list

# 補完キー連打で候補順に自動で補完する
setopt auto_menu

# cd 時に自動でディレクトリスタックに追加する
setopt auto_pushd

# コマンド履歴に実行時間も記録する
setopt extended_history

# 履歴中の重複行をすべて削除する
setopt hist_ignore_all_dups

# 直前と重複するコマンドを記録しない
setopt hist_ignore_dups

# コマンド中の余分なスペースは削除して履歴に記録する
setopt hist_reduce_blanks

# 履歴と重複するコマンドを記録しない
setopt hist_save_no_dups

# ^D でシェルを終了しない
setopt ignore_eof

# 履歴をすぐに追加する(通常はシェル終了時)
setopt inc_append_history

# # 以降をコメントとして扱う
setopt interactive_comments

# ビープを無効にする
setopt no_beep
setopt no_hist_beep
setopt no_list_beep

# = 以降も補完する(例:--option=value)
setopt magic_equal_subst

# バックグラウンド処理の状態変化をすぐに通知する
setopt notify

# 8bit文字を有効にする
setopt print_eight_bit

# 終了ステータスが0以外の場合にステータスを表示する
setopt print_exit_value

# VCS情報の表示を有効にする
setopt prompt_subst

# ディレクトリスタックと重複したディレクトリをスタックに追加しない
setopt pushd_ignore_dups

# rm * の前に確認をとる
setopt rm_star_wait

# Zsh間で履歴を共有する
setopt share_history

# コマンド実行後は右プロンプトを消す
setopt transient_rprompt

autoload

autoloadコマンドは、実際に実行されるまで関数本体の読み込みを遅らせる際に使用します。 こうすることで、Zshの起動を速くすることができます。

# フック機能を有効にする
autoload -Uz add-zsh-hook

# コマンドのオプションや引数を補完する
autoload -Uz compinit && compinit -u

# URLをエスケープする
autoload -Uz url-quote-magic

# VCS情報の表示を有効にする
autoload -Uz vcs_info

-Uオプションは、呼び出し側で定義したエイリアスの影響を受けないための設定で、-zはZsh形式で読み込むための設定です。 autoloadは基本的に-Uzオプションをつけておけば問題ありません。

また、URLのエスケープには、あわせて次の設定も必要です。

# 文字入力時にURLをエスケープする
zle -N self-insert url-quote-magic

zleは、関数をコマンドラインから利用できるウィジェットとして登録するためのコマンドです。 また、self-insertは文字入力時に実行されるもので、これにより文字入力時にURLをエスケープするようになります。

環境変数

Zshでは、特別な名前の環境変数に値をセットすることで、動作を変更することができます。

# ls 時の色を設定する
export CLICOLOR=true
export LSCOLORS='exfxcxdxbxGxDxabagacad'
export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=36;01:cd=33;01:su=31;40;07:sg=36;40;07:tw=32;40;07:ow=33;40;07:'

# 標準エディタを設定する
export EDITOR=vim

# コマンド履歴を保存するファイルを指定する
export HISTFILE=~/.zhistory

# メモリに保存する履歴の件数を指定する
export HISTSIZE=1000

# ファイルに保存する履歴の件数を指定する
export SAVEHIST=1000000

# 文字コードを設定する
export LANG=ja_JP.UTF-8

キーバインド

Zshでも、tmuxやVimなどと同じようにキーバインドを定義することができます。

Zshにはコマンドラインの操作方法としてEmacsとViを選択でき、また各モードに応じたキーバインドを設定することもできます。

# コマンドラインの編集モードをViにする
bindkey -v

# バックスペースキーで文字を削除する
bindkey -v '^?' backward-delete-char

# Shift-Tabで候補を逆順に補完する
bindkey '^[[Z' reverse-menu-complete

以下の2つはanyframeを導入している場合にのみ有効ですが、かなり強力なキーバインドです。

# ghq で管理しているリポジトリから検索・移動する
bindkey '^@' anyframe-widget-cd-ghq-repository

# コマンドを履歴から検索・実行する
bindkey '^r' anyframe-widget-put-history

エイリアス

エイリアスを設定することで、よく利用するコマンドを簡単に入力することができます。

筆者はhistory+pecoからの入力を頻繁に利用するため、エイリアスはあまり設定しませんが、lsgitコマンドなどのエイリアスを設定するのが一般的なようです。

# vi コマンドでVimを実行する
alias vi='vim'

モジュール

Zshではいくつかの機能はコアから切り離され、モジュールとして提供されています。

そういった機能の見た目に関する設定は、zstyleで変更することができます。 各設定の説明は省略しますが、詳細はStandard Stylesで確認できます。

# 補完の表示方法を変更する
zstyle ':completion:*' completer _complete _match _approximate
zstyle ':completion:*' group-name ''
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
zstyle ':completion:*' use-cache true
zstyle ':completion:*' verbose yes
zstyle ':completion:*:default' menu select=2
zstyle ':completion:*:descriptions' format '%F{yellow}-- %d --%f'
zstyle ':completion:*:options' description 'yes'

設定のすべて

以上がおすすめの基本設定となります。

前回の記事とあわせた設定ファイルの内容すべてを次に示します。

~/.zshrc:

#
# zplug
#

source ~/.zplug/init.zsh

zplug 'zsh-users/zsh-autosuggestions'
zplug 'zsh-users/zsh-completions'
zplug 'zsh-users/zsh-syntax-highlighting', nice:10
zplug 'mollifier/anyframe'

if ! zplug check --verbose; then
  printf 'Install? [y/N]: '
  if read -q; then
    echo; zplug install
  fi
fi

zplug load --verbose

#
# Autoloadings
#

autoload -Uz add-zsh-hook
autoload -Uz compinit && compinit -u
autoload -Uz url-quote-magic
autoload -Uz vcs_info

#
# ZLE settings
#

zle -N self-insert url-quote-magic

#
# General settings
#

setopt auto_list
setopt auto_menu
setopt auto_pushd
setopt extended_history
setopt hist_ignore_all_dups
setopt hist_ignore_dups
setopt hist_reduce_blanks
setopt hist_save_no_dups
setopt ignore_eof
setopt inc_append_history
setopt interactive_comments
setopt no_beep
setopt no_hist_beep
setopt no_list_beep
setopt magic_equal_subst
setopt notify
setopt print_eight_bit
setopt print_exit_value
setopt prompt_subst
setopt pushd_ignore_dups
setopt rm_star_wait
setopt share_history
setopt transient_rprompt

#
# Exports
#

export CLICOLOR=true
export LSCOLORS='exfxcxdxbxGxDxabagacad'
export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=36;01:cd=33;01:su=31;40;07:sg=36;40;07:tw=32;40;07:ow=33;40;07:'
export EDITOR=vim
export HISTFILE=~/.zhistory
export HISTSIZE=1000
export SAVEHIST=1000000
export LANG=ja_JP.UTF-8

#
# Key bindings
#

bindkey -v
bindkey -v '^?' backward-delete-char
bindkey '^[[Z' reverse-menu-complete
bindkey '^@' anyframe-widget-cd-ghq-repository
bindkey '^r' anyframe-widget-put-history

#
# Aliases
#

alias vi='vim'

#
# Module settings
#

# Completion
zstyle ':completion:*' completer _complete _match _approximate
zstyle ':completion:*' group-name ''
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
zstyle ':completion:*' use-cache true
zstyle ':completion:*' verbose yes
zstyle ':completion:*:default' menu select=2
zstyle ':completion:*:descriptions' format '%F{yellow}-- %d --%f'
zstyle ':completion:*:options' description 'yes'

おわりに

今回まででVim、tmux、Zshといったターミナル環境のカスタマイズについて紹介しました。

次回は、これらドットファイルをGitHubで管理するための方法について書きたいと思います。