Mac ターミナル zsh の設定・カスタマイズ(シェルオプション)

macOS Catalina 以降ではターミナルの標準シェルが bash から zsh に変更になりました。

以下は Mac のターミナルでの zsh の設定方法(設定ファイルやシェルオプション)についての覚書です。

作成日:2022年1月30日

関連ページ

zsh の設定ファイル

エイリアスやシェルオプションなどの常に使用する設定は zsh の場合、基本的にはユーザのホームディレクトリの環境設定ファイル .zshrc に記述します。

zsh 設定ファイルの種類

zsh には以下のような設定ファイルがあります(以下の全てのファイルが存在するわけではありません)。

全てのユーザ 個々のユーザ ログインシェル インタラクティブシェル シェルスクリプト
/etc/zshenv .zshenv
/etc/zprofile .zprofile
/etc/zshrc .zshrc
/etc/zlogin .zlogin
/etc/zlogout .zlogout

参考元:Moving to zsh, part 2: Configuration Files

/etc/ 内のファイルは、それらが存在する場合、すべてのユーザーに対して起動されます。

.z から始まるファイルは個々のユーザー専用の設定ファイルです。

デフォルトでは zsh はホームディレクトリのルート($HOME)でユーザーの .z から始まるファイルを探しますが、この動作は、ZDOTDIR 環境変数で別のディレクトリに変更できます。

また、ターミナルを起動したときに立ち上がるシェルのことをログインシェル、コマンドラインで bash や zsh と入力した時に起動するシェルのことをインタラクティブシェルと呼びます。

bash の場合は、ログインシェルに .bash_profile を、インタラクティブシェルに .bashrc を使用するので、.bashrc を .bash_profile で読み込む設定を記述するのが一般的です。

zsh の場合は上記表に記載されているファイルが存在する場合、コンテキスト(ログインシェル、インタラクティブシェル)に応じて適切なファイルを実行します。

設定ファイルの読み込む順番

zsh は最初に /etc/zshenv を読み込み、次にユーザーの .zshenv を読み込みます。 zshenv ファイルは #!/bin/zsh を記述したスクリプトの場合でも、存在する場合は常に使用されます。 zshenv に適用された変更はすべてのコンテキストで zsh の動作に影響を与えるため、変更には注意が必要です。

次に、シェルがログインシェルの場合、zshは /etc/zprofile と .zprofile を実行します。そしてインタラクティブシェル(およびログインシェル)の場合は /etc/zshrc および .zshrc を実行します。 次に、ログインシェルの場合は /etc/zlogin と .zlogin を実行します。

最後に、ユーザーの .zlogout が最初に読み取られ、次に /etc/zlogout が読み取られます(zlogout はログインシェルが終了する際にクリーンアップに使用できるファイル)。 シェルが外部プロセスによって終了された場合、これらのファイルは実行されない可能性があります。

Mac の設定ファイル

Mac の場合、/etc/zprofile と /etc/zshrc に基本的な(システムワイドの)設定がされています。また、/etc/zshrc_Apple_Terminal というファイルも存在します。

% ls /etc | grep 'z'  return  #/etc で z が付くファイルをリスト
zprofile
zshrc
zshrc_Apple_Terminal

Mac の場合、初期状態ではユーザの設定ファイル(~/.zshrc)は存在しないので自分で作成します。

~/.zshrc の「~」は現在ログインしているユーザーのホームディレクトリを表します。また、ドット(.)が最初に付いたファイルは隠しファイルなので、Shift + Command + . を押して表示させることができます。ls コマンドの場合は -a オプションを付けます。

% ls -a ~| grep 'z'  return  #ホームディレクトリで z が付くファイルをリスト
.zsh_history
.zsh_sessions
#.zshrc などのユーザの設定ファイルは初期状態では存在しない

どの設定ファイルを使うのか →.zshrc

~/.zshrc に設定を記述します(必要に応じて他のファイルを使うこともできます)。

.zshrc がまだ作成されていない場合は作成します。

touch ~/.zshrc   return  # .zshrc をホームディレクトリに作成

関連項目:zsh のプロンプトの変更

シェルオプション

シェルオプションはシェルの動作の設定に使われ、zsh には多くのシェルオプションがあります。

シェルオプションを設定することで、zsh の動作をカスタマイズすることができます。

どのようなオプションがあるかや詳細は man zshoptions などで確認できます。デフォルトのオプションには <D>、zsh 固有のデフォルトオプションには <Z> が付いています。

man zshoptions
ZSHOPTIONS(1)                General Commands Manual               ZSHOPTIONS(1)

NAME
       zshoptions - zsh options

SPECIFYING OPTIONS
       Options are primarily referred to by name.  These names are case
       insensitive and underscores are ignored.  For example, `allexport' is
       equivalent to `A__lleXP_ort''.

       ・・・中略・・・

DESCRIPTION OF OPTIONS
       In the following list, options set by default in all emulations are
       marked <D>; those set by default only in csh, ksh, sh, or zsh emulations
       are marked <C>, <K>, <S>, <Z> as appropriate.  When listing options (by
       `setopt', '`unsetopt', '`set -o' or `set +o'),' those turned on by default
       appear in the list prefixed with `no'. ' Hence (unless KSH_OPTION_PRINT is
       set), `setopt' 'shows all options whose settings are changed from the
       default.

   Changing Directories
       AUTO_CD (-J) #ディレクトリ名だけでディレクトリを移動できるようにするオプション
              If a command is issued that can''t be executed as a normal command,
              and the command is the name of a directory, perform the cd command
              to that directory.  This option is only applicable if the option
              SHIN_STDIN is set, i.e. if commands are being read from standard
              input.  The option is designed for interactive use; it is
              recommended that cd be used explicitly in scripts to avoid
              ambiguity.

       AUTO_PUSHD (-N) #自動的に元のディレクトリをディレクトリスタックに積み上げるオプション
              Make cd push the old directory onto the directory stack.

       ・・・以下省略・・・

[参考] zsh 関連の man ページは例えば、man zsh と入力して tab キーを押すと候補が表示されます。

以下は zshcompsys(補完関連) と zshparam(パラメータ関連)の man ページを表示する例です。

% man zsh tab
zsh          zshcompctl   zshcontrib   zshmodules   zshroadmap   zshzle
zshall       zshcompsys   zshexpn      zshoptions   zshtcpsys
zshbuiltins  zshcompwid   zshmisc      zshparam     zshzftpsys

% man zshcompsys  return  #completion system のマニュアルを表示

ZSHCOMPSYS(1)                General Commands Manual               ZSHCOMPSYS(1)

NAME
       zshcompsys - zsh completion system

DESCRIPTION
       This describes the shell code for the new completion system, referred
       to as compsys.  It is written in shell functions based on the features
       described in zshcompwid(1).

       #・・・以下省略・・・(man ページを終了するには q を押します)

% man zshparam  return  #parameters のマニュアルを表示

ZSHPARAM(1)                  General Commands Manual                 ZSHPARAM(1)

NAME
       zshparam - zsh parameters

DESCRIPTION
       A parameter has a name, a value, and a number of attributes.  A name may
       be any sequence of alphanumeric characters and underscores, or the single
       characters `*', `@', `#', `?', `-', `$', or `!'.`  A parameter whose name
       begins with an alphanumeric or underscore is also referred to as a
       variable.

      #・・・以下省略・・・(man ページを終了するには q を押します)

オプションを有効にする

setopt コマンドでオプションを設定することができます。オプションを有効(on)にするには、setopt コマンドにオプション名を指定します。

setopt オプション名

他のシェルとの互換性のために、set -o を使って有効にすることもできます。 以下は同じことです。

set -o AUTO_CD
setopt AUTO_CD

オプション名

オプション名は大文字と小文字は区別されず、またアンダースコアは無視されます。

オプション名は、man ページなどでは全て大文字で記述されていますが、setopt などのコマンドで表示されるオプションのリストは全て小文字(及びアンダースコアなし)で記述されています。

以下はいずれも同じことになります。

setopt AUTO_CD
setopt Auto_Cd
setopt autocd
setopt auto_cd
setopt autoCD

オプションを無効にする

オプションを無効(off)にするには unsetopt コマンドや set +o を使います。

または、接頭辞として NO または no を付けて、オプションを無効にすることもできます。

以下はすべて、以前に設定したオプション AUTO_CD を無効にします。

unsetopt AUTO_CD
set +o AUTO_CD
unsetopt autocd
setopt NO_AUTO_CD
setopt noautocd

現在のオプションの確認

setopt コマンドを引数無しで実行して、既存のシェルオプションを一覧表示できます。

引数無しの setopt コマンドで表示されるリストには、zsh のデフォルトのオプションセットから変更されたオプションのみが表示されます。以下はオプションをまだ何も設定していない場合の例です。

% setopt  return #デフォルトのオプションから変更されたオプションを一覧表示
combiningchars
interactive
login
monitor
shinstdin
zle

unsetopt コマンドを引数無しで実行すると、無効に設定しているオプションの一覧が表示されます。

% unsetopt  return #無効に設定しているオプションの一覧表示
noaliases
aliasfuncdef
allexport
noalwayslastprompt
alwaystoend
appendcreate
noappendhistory
autocd
autocontinue
noautolist
noautomenu
・・・以下省略・・・

※ オプションの一覧の出力で先頭に「no」と付いているオプションは有効/無効が逆になります。

例えば、上記は無効のリストなので、noaliases は「無効が no →無効ではない」を意味し、「aliases オプションが有効」という意味になります。

以下を実行して、すべてのデフォルトの zsh オプションのリストを表示することもできます。

% emulate -lLR zsh  return  #デフォルトの zsh オプションのリストを表示
aliases
noaliasfuncdef
noallexport
alwayslastprompt
noalwaystoend
noappendcreate
appendhistory
noautocd
noautocontinue
autolist
automenu
noautonamedirs
autoparamkeys
・・・以下省略・・・

また、set -o コマンドですべてのオプションの設定を一覧表示することもできます。

この場合も、先頭に「no」と付いているオプションは有効/無効が逆になります。以下の場合、「noaliases は off」なので「aliases オプションが on」を意味します。

% set -o  return  #すべてのオプションの設定を一覧表示
noaliases             off
aliasfuncdef          off
allexport             off
noalwayslastprompt    off
alwaystoend           off
appendcreate          off
noappendhistory       off
autocd                off
autocontinue          off
noautolist            off
noautomenu            off
・・・以下省略・・・

grep などを使えば特定のオプションを確認できます。

% set -o | grep 'autopushd' return  #autopushd
autopushd             off

set -o | grep 'pushd'   return  #pushd を含むオプション
autopushd             off
pushdignoredups       off
pushdminus            off
pushdsilent           off
pushdtohome           off

オプションの設定

コマンドラインで setopt コマンドや unsetopt コマンドで一時的にオプションを有効・無効にすることもできます(ログアウトするとそれらの設定は保存されません)。

コマンドラインでオプションを有効や無効にして、どのような動作になるかを確認することができます。

以下は AUTO_CD(autocd)を有効・無効にして動作を確認する例です。autocd を有効にすると、ディレクトリ名だけで(cd コマンドなしで)ディレクトリを移動できるようになります。

% setopt AUTO_CD   return  #AUTO_CD を有効に

% set -o |grep 'autocd'   return  #現在のオプションを確認
autocd                on    #有効

% bin   return  #ディレクトリ名だけで移動(上記により可能)

% unsetopt AUTO_CD   return  #AUTO_CD を無効に

% set -o |grep 'autocd'   return  #現在のオプションを確認
autocd                off    #無効

% bin   return  #ディレクトリ名だけで移動(autocd がオフなのでエラーになる)
zsh: command not found: bin

但し、ターミナルを再起動すると、コマンドラインで設定したオプションは保存されません。

設定の保存

常に有効にするオプションはユーザーの .zshrc(~/.zshrc)に記述して保存します。

~/.zshrc に記述を保存したら、以下のように source コマンドまたは .(ドット)コマンドを実行するか、ターミナルを再起動して変更を反映させます。

% source ~/.zshrc  return  #変更を反映

コメントアウトなどで編集した場合は、source コマンドでは変更が反映されないので、一旦ログアウトして再ログインするか、以下を実行してシェルを再起動します。

exec $SHELL -l  return  #シェルを再起動して変更を反映
cd / pushd 関連のオプション

以下は cd や pushd (ディレクトリの移動関連)のオプションの一部です。

オプション 説明
AUTO_CD
autocd
ディレクトリ名だけ(cdコマンドなし)でディレクトリを移動
AUTO_PUSHD
autopushd
cd でディレクトリを移動する際に、pushd を実行するのと同じように自動的に元のディレクトリをディレクトリスタックに積み上げる。
PUSHD_IGNORE_DUPS
pushdignoredups
ディレクトリスタックに重複したディレクトリを追加しない。
PUSHD_SILENT
pushdsilent
pushd コマンドの移動の際にディレクトリスタックを表示しない

また、DIRSTACKSIZE にディレクトリスタックに保存するディレクトリの上限数(サイズ)を指定することができます。

変数 説明
DIRSTACKSIZE ディレクトリスタックに保存するディレクトリの上限数。例 DIRSTACKSIZE=30

以下はコマンドラインで AUTO_PUSHD を有効にして動作を確認する例です。

「cd -」の直後に tab キーを押すとスタックにあるディレクトリの候補が表示されるので、続けて番号を入力して return すればそのディレクトリに移動できます。

また、pushd コマンドのように cd +番号 も使えます。「cd +」の直後に tab キーを押すと「cd -」とは逆順に候補が表示されます。

% setopt AUTO_PUSHD  return  # AUTO_PUSHD を有効に

% cd Desktop/sample  return  # Desktop/sample へ移動

% cd foo  return # foo へ移動

% dirs -v   return# ディレクトリスタックを表示
0	~\/Desktop/sample/foo
1	~\/Desktop/sample
2	~

% cd ../bar  return  # bar へ移動

% dirs -v  return # ディレクトリスタックを表示
0	~\/Desktop/sample/bar
1	~\/Desktop/sample/foo
2	~\/Desktop/sample
3	~

% cd -  tab #「cd -」tab キーで候補を表示(dirs -v とは逆順)
0 -- ~
1 -- ~\/Desktop/sample
2 -- ~\/Desktop/sample/foo

% cd -1  return  #1 を選択(~/Desktop/sample へ移動)

% dirs -v  return  # ディレクトリスタックを表示
0	~\/Desktop/sample
1	~\/Desktop/sample/bar
2	~\/Desktop/sample/foo
3	~

% cd +2   return   #ディレクトリスタックの2へ移動
~\/Desktop/sample/foo

% dirs -v  return # ディレクトリスタックを表示
0	~\/Desktop/sample/foo
1	~\/Desktop/sample
2	~\/Desktop/sample/bar
3	~

以下は .zshrc への記述例です。

setopt AUTO_PUSHD  #自動的にディレクトリスタックに追加
setopt PUSHD_IGNORE_DUPS  #ディレクトリスタックに重複したディレクトリを追加しない
DIRSTACKSIZE=20  #ディレクトリスタックの上限数を20に
パス名展開(Glob)

以下はグロブ(Glob)関連のオプションの一部です。

オプション 説明
CASE_GLOB グロブ(Glob)を case-sensitive(大文字・小文字を区別する)にする(デフォルト)。オフにすると大文字小文字を区別しません。
GLOB_COMPLETE オンにすると、* や ? などのグロブパターンを指定して tab キーを押した場合、展開の全ての結果を挿入するのではなく候補を1つずつ挿入します。

zsh では例えば、以下のように ls コマンドの引数に任意の文字列にマッチする * を指定して tab キーを押すと、マッチする全てのパスが引数に補完されます。

GLOB_COMPLETE を有効にすると1つずつマッチしたパスが引数に挿入されます。

% ls ~/D* tab #tabキーを押すと以下のように引数に全てのマッチが挿入される

% ls /Users/foo/Desktop /Users/foo/Documents /Users/foo/Downloads

% setopt GLOB_COMPLETE  return #GLOB_COMPLETE を有効に

% ls ~/D* tab #tabキーを押すと以下のように1つずつ候補が挿入される

% ls ~\/Desktop/ tab #次の候補が補完される
Desktop/  Documents/  Downloads/

% ls ~\/Documents/ tab #次の候補が補完される
Desktop/  Documents/  Downloads/

% ls ~\/Downloads/
Desktop/  Documents/  Downloads/

デフォルトでは大文字小文字を区別しますが、CASE_GLOB を無効にすると大文字小文字を区別しません。

% ls ~/d*  tab #マッチしないので展開されない

% unsetopt CASE_GLOB  return  # CASE_GLOB を無効に
# または setopt NO_CASE_GLOB でも同じこと

% ls ~\/d*  tab #tab を押す(大文字小文字を区別しないグロブ)

#以下のように引数に全てのマッチが補完される
% ls /Users/foo/Desktop /Users/foo/Documents /Users/foo/Downloads 

以下は .zshrc への記述例です。

setopt NO_CASE_GLOB  #グロブで大文字小文字を区別しない
#または unsetopt CASE_GLOB
オートコレクト(自動補正)

コマンドやパスを誤って入力した場合にスペルを修正(チェック)するオプションには以下があります。

オプション 説明
CORRECT コマンドのスペルをチェックします(正しい可能性のある候補を表示します)
CORRECT_ALL コマンドラインのすべての引数のスペルをチェックします

コマンドやパスを誤って入力すると、通常はエラーになりますが、CORRECT オプションを有効にすると、シェルは入力する意味を推測し、代わりに候補を表示して実行するかどうかを尋ねます。

% hitsory  return  #スペルミス
zsh: command not found: hitsory  #エラー

% setopt CORRECT  return  #CORRECT を有効に

% hitsory   return   #間違ったスペルを実行すると以下のように尋ねられる
zsh: correct 'hitsory' to 'history' [nyae]?  y  #y を押して候補のコマンドを実行

表示される [nyae] には以下のような意味があります。

[nyae] 説明
n 修正せずにタイプした通りに実行
y 候補に表示されたコマンドを実行
a 中止して何もしない
e プロンプトに戻って編集を続行

CORRECT オプションを有効にすると、コマンドはチェックされますが、引数部分はチェックされません。

CORRECT_ALL オプションを有効にすると、コマンドラインのすべての引数のスペルをチェックします。

% setopt CORRECT  return  #CORRECT を有効に

% cd Dekstop  return  #間違ったスペルの引数を指定して実行
cd: no such file or directory: Dekstop  #エラー(修正されない)

% setopt CORRECT_ALL return  #CORRECT_ALL も有効に

% cd Dekstop  return  #間違ったスペルの引数で実行すると以下のように尋ねられる
zsh: correct 'Dekstop' to 'Desktop' [nyae]? y  #y を押して候補の引数で実行

% cd ~

% ks Dekstop return  #間違ったスペルのコマンドと引数で実行
zsh: correct 'ks' to 'ls' [nyae]? y  #y を押して候補のコマンドを実行
zsh: correct 'Dekstop' to 'Desktop' [nyae]? y  #y を押して候補の引数で実行

以下は .zshrc への記述例です。

setopt CORRECT  #コマンドのスペルをチェックして修正候補を表示
setopt CORRECT_ALL  #コマンドラインのすべての引数のスペルをチェックして修正候補を表示
特定の自動補正を無効にする

自動補正は便利ですが、時には煩わしい場合もあります。

以下は git config コマンドの例ですが、毎回以下のような確認が出て鬱陶しいことがあります。

% git config -l
zsh: correct 'config' to '.config' [nyae]? n // 自動補正(毎回 n を押す)
credential.helper=osxkeychain
user.name=foo
user.email=foo@example.com

nocorrect

Precommand Modifiers(プリコマンド修飾子?)の nocorrect の後にコマンドを指定して実行すると、そのコマンドに対して自動補正をしません。

特定のコマンドで自動補正を無効にするにはエイリアスを設定して、nocorrect を指定して自動補正をしないようにすることができます。

例えば、git コマンドでの自動補正を無効にするには以下を ~/.zshrc に記述します。

# git コマンドは自動補正をしない
alias git="nocorrect git"

但し、エイリアスの別名にスペースを入れることはできないので、例えば、git config を別名としてエイリアスを設定しても期待通りには動作しません。

# 以下は機能しない
alias git config="nocorrect git config"

サブコマンドの自動補正を無効にする

git config や git status などのサブコマンドの自動補正を全て無効にするには、setopt CORRECT_ALL の記述を削除する方法もあります。但し、この場合、git だけではなく全てのコマンドの引数の自動補正を無効にすることになります。

履歴(history)関連のオプション

以下は履歴関連のオプションの一部です。

オプション 説明
SHARE_HISTORY 複数の zsh セッション間で履歴を共有(入力したコマンドを履歴ファイルに追加)。INC_APPEND_HISTORY を有効にするのと同様の効果があるので、このプションを有効にした場合は、INC_APPEND_HISTORY はオフにします。
APPEND_HISTORY 履歴リストを置き換えるのではなく、履歴ファイルに追加(デフォルトで有効)
INC_APPEND_HISTORY このオプションは APPEND_HISTORY と同様に機能しますが、シェルが終了するまで待機するのではなく、(入力されるとすぐに)新しい履歴行が $HISTFILE に段階的(incrementally)に追加される点が異なります。
HIST_EXPIRE_DUPS_FIRST 履歴の保存上限に達したときにまず重複する履歴を削除
HIST_IGNORE_DUPS 直前のコマンドと重複する場合、履歴に保存しない
HIST_IGNORE_ALL_DUPS 新しいコマンドラインが古いコマンドラインと重複している場合、古いコマンドはリストから削除
HIST_FIND_NO_DUPS 履歴の検索の際に重複した履歴を表示しない
HIST_REDUCE_BLANKS 履歴から余分な空白を削除
EXTENDED_HISTORY timestamp から始まる形式で履歴を保存

macOS の /etc/zshrc には以下が記述されています。

/etc/zshrc
# Save command history
HISTFILE=${ZDOTDIR:-$HOME}/.zsh_history  #履歴ファイルの保存先
HISTSIZE=2000  #メモリ上に保存される履歴の数
SAVEHIST=1000  #HISTFILE で指定したファイルに保存される履歴の数

${ZDOTDIR:-$HOME} は ZDOTDIR が設定されている場合は ZDOTDIR の値を使用し、それ以外の場合は $HOME の値を使用することを意味するので、ZDOTDIR が設定されていなければ HISTFILE は ~/.zsh_history になります。

実際の設定は以下で確認できます。

% echo $HISTFILE  return
/Users/foo/.zsh_sessions/7FB850D5-A066-4015-905C-5B97A1C1920E.historynew

% echo $HISTSIZE  return
2000

% echo $SAVEHIST  return
1000

~/.zsh_history とは別にセッションごとにファイル(history list?)が作成されていて、現在のセッションの履歴は最後が .historynew になっているようです。そして「おそらく」デフォルトではセッションが終了すると ~/.zsh_history に履歴が追加(上書き?)されるようです(定かではありません)。

% ls ~/.zsh_sessions   return
0178F105-54D7-473B-9EB1-CC39C2F57D69.history
0178F105-54D7-473B-9EB1-CC39C2F57D69.session
01ADE2EE-C279-4DE6-942F-E4E74E4CAE88.history
01ADE2EE-C279-4DE6-942F-E4E74E4CAE88.session
032D6E84-4B43-4021-94C9-2EF986A30538.history
032D6E84-4B43-4021-94C9-2EF986A30538.session
・・・中略・・・
7FB850D5-A066-4015-905C-5B97A1C1920E.historynew  #現在のセッションの履歴
・・・中略・・・
FD222B4C-609B-442C-8E26-5E122EDDDFD4.history
FD222B4C-609B-442C-8E26-5E122EDDDFD4.session
_expiration_check_timestamp

% cat ~/.zsh_sessions/FD222B4C-609B-442C-8E26-5E122EDDDFD4.session  return
echo Restored session: "$(/bin/date -r 1643418302)"

% cat ~/.zsh_sessions/FD222B4C-609B-442C-8E26-5E122EDDDFD4.history  return
#コマンドの履歴が表示される(省略)

デフォルトでは、zsh は各コマンドを履歴ファイル(.zsh_history)の独自の行に書き込むだけで、ファイルの内容は任意のテキストエディタで表示できます。以下は tail で最後の20行を表示する例です。

% tail -n 20 ~/.zsh_history  return #.zsh_history  の最後の20行を表示

上限に達すると、最も古いコマンドがメモリまたは履歴ファイルから削除されます。

必要に応じて履歴に保存する件数の上限を HISTSIZE と SAVEHIST でユーザの設定ファイル(~/.zshrc)に設定することができます。

SAVEHIST=5000  #メモリ上に保存される履歴の数(history コマンドで確認できる履歴の数)
HISTSIZE=3000  #履歴ファイルに保存される履歴の数

デフォルトでは、zsh を終了すると(例えば、ターミナルウィンドウやタブを閉じることによって)、zsh のインスタンスは、既存の履歴ファイルをその履歴で上書きするので、複数のターミナルウィンドウまたはタブを開いている場合、互いの履歴を上書きします。

以下を設定することで、セッション全体で単一の共有履歴ファイルを使用し、上書きするのではなくファイルに追加するように指示できます。

setopt SHARE_HISTORY   #複数の zsh セッション間で履歴を共有
setopt APPEND_HISTORY  #履歴リストを置き換えるのではなく、履歴ファイルに追加(デフォルトで有効。省略可能) 

以下は man zshoptions からの SHARE_HISTORY と APPEND_HISTORY 部分の抜粋です。

man zshoptions
SHARE_HISTORY <K>  #ksh ではデフォルト

  This option both imports new commands from the history file, and
  also causes your typed commands to be appended to the history file
  (the latter is like specifying INC_APPEND_HISTORY, which should be
  turned off if this option is in effect).  The history lines are
  also output with timestamps ala EXTENDED_HISTORY (which makes it
  easier to find the spot where we left off reading the file after
  it gets re-written).

  By default, history movement commands visit the imported lines as
  well as the local lines, but you can toggle this on and off with
  the set-local-history zle binding.  It is also possible to create
  a zle widget that will make some commands ignore imported
  commands, and some include them.

  If you find that you want more control over when commands get
  imported, you may wish to turn SHARE_HISTORY off,
  INC_APPEND_HISTORY or INC_APPEND_HISTORY_TIME (see above) on, and
  then manually import commands whenever you need them using `fc
  -RI'. '`

APPEND_HISTORY <D>  #デフォルト
  If this is set, zsh sessions will append their history list to the
  history file, rather than replace it. Thus, multiple parallel zsh
  sessions will all have the new entries from their history lists
  added to the history file, in the order that they exit.  The file
  will still be periodically re-written to trim it when the number
  of lines grows 20% beyond the value specified by $SAVEHIST (see
  also the HIST_SAVE_BY_COPY option).

以下は .zshrc への記述例です。

setopt SHARE_HISTORY
setopt APPEND_HISTORY  #デフォルトで有効。省略可能
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_REDUCE_BLANKS
setopt EXTENDED_HISTORY
入力補完

zsh のデフォルトの tab キーによる入力補完はベーシックなものですが、compsys という補完システムを使うと様々な入力補完が可能になります。

デフォルトでは compsys は有効ではないので、有効にするには ~/.zshrc に以下のコマンドを記述します。

autoload -Uz compinit && compinit

autoload はシェル関数をロードするシェルの組み込み関数で、-U オプションは関数をロードする際にユーザのエイリアスを展開しないようにするオプションで、-z オプションは zsh 形式での読込を指定するもののようです。

compsys や autoload の man ページは以下で表示できます。

% man zshcompsys   return #compsys の man ページを表示

% man zshbuiltins   return #autoload の man ページを表示

compsys を有効にすると、例えば以下のようにパスに部分的な文字列を指定して補完することができます。

% ls /u/lo/b tab #以下に補完されます

% ls /usr/local/bin/

また、zstyle コマンドを使ってより詳細な補完方法を設定することができます。

例えば、補完で小文字でも大文字にマッチさせるには以下のように記述できるようです。2つ目のスタイルは Moving to zsh, part 5: Completions から引用されていただいています。

zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

#または以下のようなスタイルも検索したら出てきました
zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} l:|=* r:|=*' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} l:|=* r:|=*' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} l:|=* r:|=*'

以下は less と cd の引数入力時に小文字で入力した文字列を補完する際に、小文字大文字両方のファイル名にマッチさせる例です。zshの補完 補完スタイル から引用させていただいています(リンクのページには zstyle コマンドの説明など、zshの補完についての解説があります)。

zstyle ':completion:*:(cd|less):*' matcher 'm:{a-z}={A-Z}'

※ .zshrc への zstyle コマンドを使った補完スタイルの記述は、autoload -Uz compinit の前に記述したほうが良い(安全な)ようです。

zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
autoload -Uz compinit && compinit
ビープ音を消す

以下はビープ音関連のオプションです。

オプション 説明
LIST_BEEP あいまいな補完(completion)をビープ音で鳴らします。デフォルトで有効
HIST_BEEP 存在しない履歴エントリにアクセスしようとしたときにビープ音で鳴らします。デフォルトで有効
BEEP エラーの際にビープ音で鳴らします。デフォルトで有効

ターミナルのビープ音を消すには以下を設定します。

setopt NO_BEEP
#または unsetopt beep

.zshrc 設定例

以下は .zshrc の一例で、7〜19行目がシェルオプション関連の設定です。19行目は入力補完(compsys)の有効化の設定です。

プロンプトの設定パスを通す設定、エイリアス関数、プラグイン(nvm)などの設定も合わせて記述しています。

~/.zshrc
#prompt プロンプトの設定
PROMPT='%1~ %# '
#ユーザの bin ディレクトリへパスを通す
export PATH=$PATH:~/bin

#shell options(シェルオプション)
setopt AUTO_PUSHD
setopt PUSHD_IGNORE_DUPS
DIRSTACKSIZE=100
setopt NO_CASE_GLOB
setopt CORRECT
setopt CORRECT_ALL
setopt SHARE_HISTORY
setopt APPEND_HISTORY  #デフォルトで有効。省略可能
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_REDUCE_BLANKS
setopt EXTENDED_HISTORY
setopt NO_BEEP
autoload -Uz compinit && compinit

#aliases(エイリアスと関数)
alias copy='cp -i'
alias pd=pushd
alias pd2='pushd +2'
alias pd3='pushd +3'
alias pd4='pushd +4'
alias dirs='dirs -v'
alias git="nocorrect git" # git コマンドは自動補正をしない
alias restart='exec $SHELL -l' # シェルを再起動
function xman() { open x-man-page://$@ }
function pdn() { pushd +"$1"}

# 重複したパスを登録しない(注意が必要)
# typeset -U path PATH

#nvm (Node Version Manager をインストールする際に追加)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

例えば、上記のようなオプションが設定されている場合、setopt コマンドを引数なしで実行して現在のオプションを確認すると以下のように表示されます。

% setopt return
autopushd #追加したオプション
nobeep #追加したオプション
nocaseglob #追加したオプション
combiningchars
correct #追加したオプション
correctall #追加したオプション
extendedhistory #追加したオプション
histignorealldups #追加したオプション
histreduceblanks #追加したオプション
interactive
login
monitor
pushdignoredups #追加したオプション
sharehistory #追加したオプション
shinstdin
zle

APPEND_HISTORY はデフォルトなので上記の setopt では表示されていません。

% set -o |grep 'appendhistory'
noappendhistory       off  #NO_APPEND_HISTORY が off → APPEND_HISTORY が on
incappendhistory      off
incappendhistorytime  off
zsh でパスを重複して登録しない

zsh でパスの重複を自動的に削除するには、以下を ~/.zshrc などに記述します。

注意しなければならないのは、一意の値を持つことが必ずしも望ましいとは限らないことです。パスの重複により問題が発生していなければ、おそらく以下は不要です。

特定のプログラムが特定のパスを複数回利用する必要がある場合など、動作に影響が出る可能性もあるため、適切に考慮する必要があります。

typeset -U path PATH

上記コマンドは、zsh シェルの PATH 変数に重複しない要素だけを保持するために使用します。

PATH は検索するディレクトリのリストを保持する環境変数です。typeset -U コマンドは、変数に一意の値のみを設定するためのもので、重複した値がある場合にそれらを1つにまとめます。

  • typeset: 変数の属性を定義するためのコマンド

  • -U: 変数に重複しない値(unique values)のみを保持するように指定

  • path: 変数名(新しい値が重複しないように保持される変数の名前)

  • PATH: 環境変数名(PATH 環境変数は、シェルがコマンドを実行するときに検索するディレクトリのリストを保持)

参考サイト

以下は参考にさせていただいたサイト(ページ)です。