他の人がzshを使っているのを見ていると、「もっと便利に使えるのに」と、もやっとしたり、「え、その便利な機能ってなに?」と、発見があったりします。だれかに「この設定をすると便利ですよ」と話しやすくするために、今のzshのおすすめ設定をここに記しておきます。Emacsも使っている場合はおすすめEmacs設定もどうぞ。長年漬け込んできたzshの設定がそこそこの量になっているので、以下のようなディレクトリ構成にして分類しています。zsh標準機能の設定と追加パッケージの設定を分けるためにこうしています。シェルを起動する毎に読み込まれる。標準機能の追加設定を行う。ログイン時に一度だけ読み込まれる。zsh関連のファイル置き場。標準機能以外の設定を置くディレクトリ。追加パッケージの設定をするファイル。おすすめ~/.zshrc設定。おすすめ~/.zshenv設定。パッケージ管理システム。パッケージをインストールするディレクトリ。おすすめ設定の使い方このうち、~/.zsh.d/以下にあるzshrc、zshenvは一般的なおすすめ設定となっていて、GitHubに置いてあります。GitHubにあるおすすめ設定は以下のようにして使えます。(以下のコマンドをそのまま実行すると既存の~/.zshrcと~/.zshenvを上書きするので注意してください。読み込んで、その後でカスタマイズすることを想定しています。おすすめ設定を読み込む。これより↓に自分用の設定を書く。おすすめ設定を読み込む。これより↓に自分用の設定を書く。~/.zshrcと~/.zshenvの使い分け~/.zshrcと~/.zshenvは以下のように使い分けます。対話的に使うときだけ必要なものは~/.zshrc。常に使うものは~/.zshenv。対話的以外にどういう場面で使うかというと、例えば、Emacs上からM-!でコマンドを実行するときです。このときは~/.zshenvのみが読み込まれて~/.zshrcは読み込まれません。~/.zshenvのおすすめ設定パスやEmacsなどからも使うページャやgrepなどのコマンドの設定、環境変数の設定などをします。設定の説明はコメントを見てください。パスの設定(N-/)は便利なので覚えておいて損はありません。重複したパスを登録しない。存在しないディレクトリは登録しない。...という条件にマッチするパスのみ残す。NULL_GLOBオプションを設定。globがマッチしなかったり存在しないパスを無視する。シンボリックリンク先のパスを評価。ディレクトリのみ残す。/usr/games(N-/))sudo時のパスの設定sudoを使うときはsbinもパスに入れたいです。ここで設定したからといって実際にsudoで使われるわけではありません。後で~/.zshrcで設定するsudo時の補完用に使います。そのため、~/.zshenvではなく~/.zshrcで設定したほうがよい気もしますが、パスなので~/.zshenvに入れました。-Tは便利なので覚えておいて損はないと思います。SUDO_PATHも一緒に行う。SUDO_PATHとsudo_pathを連動する。重複したパスを登録しない。存在しないディレクトリは登録しない。...という条件にマッチするパスのみ残す。NULL_GLOBオプションを設定。globがマッチしなかったり存在しないパスを無視する。シンボリックリンク先のパスを評価。ディレクトリのみ残す。sudo_path=({,/usr/pkg,/usr/local,/usr}/sbin(N-/))man時のパスの設定(ほとんどありませんが)Emacs上でmanを読むこともあるためman用のパスも~/.zshenvで設定します。重複したパスを登録しない。存在しないディレクトリは登録しない。...という条件にマッチするパスのみ残す。NULL_GLOBオプションを設定。globがマッチしなかったり存在しないパスを無視する。シンボリックリンク先のパスを評価。ディレクトリのみ残す。/usr/share/man(N-/))Rubyの設定Rubyのライブラリを開発するときは./libが$LOAD_PATHに入っていると便利なので、その設定をしています。RUBYLIBも一緒に行う。RUBYLIBとruby_pathを連動する。重複したパスを登録しない。./lib)Pythonの設定Pythonのライブラリを開発するときは./libがsys.pathに入っていると便利なので、その設定をしています。PYTHONPATHも一緒に行う。PYTHONPATHとpython_pathを連動する。重複したパスを登録しない。./lib)pkg-configの設定pkg-configをサポートしたライブラリを使った開発するときの設定です。PKG_CONFIG_PATHも一緒に行う。PKG_CONFIG_PATHとpkg_config_pathを連動する。重複したパスを登録しない。存在しないディレクトリは登録しない。...という条件にマッチするパスのみ残す。NULL_GLOBオプションを設定。globがマッチしなかったり存在しないパスを無視する。シンボリックリンク先のパスを評価。ディレクトリのみ残す。/opt/local/lib/pkgconfig(N-/))ページャの設定エンコーディングを変換できることが便利なのでlvを優先して使います。lvがなかったらlessを使う。「lv」としただけでもいい感じに動くようにします。ANSIエスケープシーケンスの色付けなどを有効にする。1行が長くと折り返されていても1行として扱う。(コピーしたときに余計な改行を入れない。lvがなくてもlvでページャーを起動する。grepを使い、便利な機能は単に「grep」としただけで使えるようにします。便利なのは--color=autoです。grepがあったら優先して使う。バイナリファイルにはマッチさせない。grep対象としてディレクトリを指定したらディレクトリ内を再帰的にgrepする。拡張子が.tmpのファイルは無視する。管理用ディレクトリを無視する。$GREP_OPTIONS"fiエディタの設定visudoなど、エディタが必要になったときはvimを使うようにします。vimがなくてもvimでviを起動する。vim=vifiメールアドレスの設定~/.zsh.d/emailまたは~/.emailにメールアドレスを書いておくと、そのファイルの中身を環境変数EMAILに設定します。メールアドレスはそれぞれ違うためこのように設定するようにしました。~/.emailの順に探して最初に見つかったファイルから読み込む。存在しないファイルは登録しない。...という条件にマッチするパスのみ残す。NULL_GLOBオプションを設定。globがマッチしなかったり存在しないパスを無視する。シンボリックリンク先のパスを評価。通常のファイルのみ残す。補完やaliasなど対話的に使ったときに便利な機能の設定をします。こちらも設定の説明はコメントを見てください。キーバインド環境変数EDITORにvimと設定しているとviキーバインドになってしまうので、Emacsキーバインドを使うように明示的に指定しています。Emacsキーバインドを使う。-eディレクトリ移動cdの機能を拡張します。chpwd_functionsは覚えておいて損はないと思います。chpwdを定義するよりも追加の設定が簡単になります。ディレクトリ名だけでcdする。cdで移動してもpushdと同じようにディレクトリスタックに追加する。移動先を検索するリスト。ディレクトリが変わったらディレクトリスタックを表示。dirs)ヒストリヒストリはとてもよく使うため基本的に過去のコマンドラインは消えないようにします。メモリ上のヒストリ数。大きな数を指定してすべてのヒストリを保存するようにしている。ヒストリファイルにコマンドラインだけではなく実行時刻と実行時間も保存する。同じコマンドラインを連続で実行した場合はヒストリに登録しない。スペースで始まるコマンドラインはヒストリに追加しない。ヒストリファイルに追記する。zshプロセス間でヒストリを共有する。C-s/C-qを使わない。no_flow_controlプロンプト以下のような2段プロンプトにします。1段目にはできるだけ現在情報を多めに表示して、後から実行履歴をさかのぼって見たときに有意義な情報が残るようにします。プロンプト内にコマンドの実行ステータスを入れるようにしているのでprint_exit_statusオプションは設定していません。[~]プロンプトで多くの機能を使えるようにします。PROMPT内で変数展開・コマンド置換・算術演算を実行する。PROMPT内で「%」文字から始まる置換機能を有効にする。コピペしやすいようにコマンド実行後は右プロンプトを消す。transient_rprompt使っていませんが、256色用の色を生成する機能です。"$@")"m"}プロンプトにたくさんの情報を盛り込もうと頑張っています。「%」が多くてとても読みづらいですね。「...」を太字にする。「...」をシアン色の文字にする。太字で白文字で赤背景にする。偽のときはfalse-textになる。最後に実行したコマンドの終了ステータスが0のときに真になる。