Mac ターミナル zsh の設定・カスタマイズ(シェルオプション)
macOS Catalina 以降ではターミナルの標準シェルが bash から zsh に変更になりました。
以下は Mac のターミナルでの zsh の設定方法(設定ファイルやシェルオプション)についての覚書です。
作成日:2022年1月30日
関連ページ
- Mac ターミナルの基本的な使い方・操作方法(1)設定やコマンド、パイプ、リダイレクトなど
- Mac ターミナルの基本的な使い方・操作方法(2)エディタ: nano と vim
- Mac ターミナルの基本的な使い方・操作方法(3):シェル シェルスクリプト
- Mac ターミナルの基本的な使い方・操作方法(4):プロセス、シグナル、ファイルの圧縮と展開、ソフトウェアのインストール、ネットワークの基本コマンド
- Mac ターミナル defaults コマンドの使い方
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> が付いています。
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 には以下が記述されています。
# 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 部分の抜粋です。
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)などの設定も合わせて記述しています。
#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 環境変数は、シェルがコマンドを実行するときに検索するディレクトリのリストを保持)