Edited at

zshのオプション設定の分かりにくいところまとめ

More than 3 years have passed since last update.

zshには「オプション」というものがある。オプションとは、zshの動作を切り替えるためのオン/オフのフラグのこと。zshを使ってる人は何かしらオプションを設定して、使いやすいようにカスタマイズしてると思う。このオプションを設定したり、設定した値を確認する方法がちょっと分かりにくいので、ここでまとめておく。


オプションを有効にする

オプションを有効にするには、setoptコマンドを使う。これは次のように、setopt <オプション名>という形で使う。

# AUTO_CDオプションを有効にする

setopt AUTO_CD


オプションを無効にする

オプションを無効にするには、unsetoptコマンドを使う。これは次のように、unsetopt <オプション名>という形で使う。

# AUTO_CDオプションを無効にする

unsetopt AUTO_CD

または、オプション名の先頭にNO_を追加してsetoptコマンドを呼び出してもよい。

# AUTO_CDオプションを無効にする

setopt NO_AUTO_CD

これでもオプションが無効になる。


オプション名の基本ルール

setopt, unsetoptでオプション名を指定するときは、オプション名の大文字小文字の違いは区別されないし、オプション名に含まれる_はすべて無視される。

例えば、次の例はすべてAUTO_CDオプションを有効にしている。

setopt AUTO_CD

setopt auto_cd
setopt autocd
setopt AutoCd
setopt _AU__TO_CD

ちなみに、man zshoptionsでは、オプション名はすべて大文字、_区切りの形式で書いてある。


オプションの設定状態を確認する

setoptコマンドを引数を付けずに呼び出すと、有効に設定しているオプション一覧が表示される。

% setopt

autocd
autopushd
nobeep
extendedglob
extendedhistory
... 以下省略 ...

unsetoptコマンドを呼び出すと、無効に設定しているオプション一覧が表示される。

% unsetopt

noaliases
allexport
noalwayslastprompt
alwaystoend
noappendhistory
... 以下省略 ...

ただし、この出力で先頭に「no...」と付いているオプションは有効/無効が逆になっていることに注意。つまり、「noオプションを有効にする」、というのは「オプションを無効にする」という意味になる。

上の例で言うと、setoptの出力にnobeepが含まれているので、「nobeepオプションが有効」になっている。これはつまり、beepというオプションが無効に設定されていることを表している。

同じように「noオプションを無効にする」というのは「オプションを有効にする」のと同じ意味になる。上の例ではunsetoptの出力にnoaliasesが含まれている。これは「noaliasesオプションが無効」、つまり「aliasesオプションが有効」という意味になる。

なんでこんな分かりにくい形式になっているのかは知らない。

有効/無効含めてすべてのオプションの設定を一覧表示したいときは、set -oを使う。

set -o

noaliases off
allexport off
noalwayslastprompt off
alwaystoend off
noappendhistory off
autocd on
autocontinue off
noautolist off
... 以下省略 ...

これですべてのオプションの状態がわかる。setoptコマンドと同じように、先頭にnoが付いているオプションはon/offが逆になる。

on/off逆で分かりにくいという人は、次の記事が参考になる。

これぐらい知っておけば設定方法について迷わないと思うので、参考にしてください!