「Zsh」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
 
(2人の利用者による、間の22版が非表示)
4行目: 4行目:
 
[[es:Zsh]]
 
[[es:Zsh]]
 
[[fa:Zsh]]
 
[[fa:Zsh]]
[[fr:Zsh]]
 
 
[[pt:Zsh]]
 
[[pt:Zsh]]
 
[[ru:Zsh]]
 
[[ru:Zsh]]
31行目: 30行目:
 
$ zsh-newuser-install -f
 
$ zsh-newuser-install -f
   
{{Note|仮想端末のサイズが少なくとも 72×15 であることを確認してください。そうでないと ''zsh-newuser-install'' は実行されません。}}
+
{{Note|あなたのターミナルのサイズが少なくとも 72×15 であることを確認してください。そうでないと ''zsh-newuser-install'' は実行されません。}}
   
 
=== Zsh をデフォルトのシェルにする ===
 
=== Zsh をデフォルトのシェルにする ===
54行目: 53行目:
 
* {{ic|/etc/zsh/zshenv}} すべてのユーザに対して[[環境変数]]を設定するために使用されます。このファイルには、出力を行うコマンドや、シェルが TTY に接続されていることを期待するコマンドを含めるべきではありません。このファイルが存在する場合、このファイルは '''''常に''''' 読み込まれます。この挙動を上書きすることはできません。
 
* {{ic|/etc/zsh/zshenv}} すべてのユーザに対して[[環境変数]]を設定するために使用されます。このファイルには、出力を行うコマンドや、シェルが TTY に接続されていることを期待するコマンドを含めるべきではありません。このファイルが存在する場合、このファイルは '''''常に''''' 読み込まれます。この挙動を上書きすることはできません。
 
* {{ic|$ZDOTDIR/.zshenv}} ユーザの[[環境変数]]を設定するために使用されます。このファイルには、出力を行うコマンドや、シェルが TTY に接続されていることを期待するコマンドを含めるべきではありません。このファイルが存在する場合、このファイルは '''''常に''''' 読み込まれます。
 
* {{ic|$ZDOTDIR/.zshenv}} ユーザの[[環境変数]]を設定するために使用されます。このファイルには、出力を行うコマンドや、シェルが TTY に接続されていることを期待するコマンドを含めるべきではありません。このファイルが存在する場合、このファイルは '''''常に''''' 読み込まれます。
* {{ic|/etc/zsh/zprofile}} すべてのユーザに対して起動時にコマンドを実行するために使用されます。'''''ログインシェル'''''として起動した場合に、このファイルは読み込まれます。Arch Linux においては、このファイルには、{{ic|/etc/profile}} を source する [https://github.com/archlinux/svntogit-packages/blob/packages/zsh/trunk/zprofile 1行] がデフォルトで含まれていることを留意しておいてください。その行を削除したい場合は以下の警告を先に読んでください!
+
* {{ic|/etc/zsh/zprofile}} すべてのユーザに対して起動時にコマンドを実行するために使用されます。'''''ログインシェル'''''として起動した場合に、このファイルは読み込まれます。Arch Linux においては、このファイルには、{{ic|/etc/profile}} を source する [https://gitlab.archlinux.org/archlinux/packaging/packages/zsh/-/blob/main/zprofile 1行]がデフォルトで含まれていることを留意しておいてください。その行を削除したい場合は以下の警告を先に読んでください!
 
** {{ic|/etc/profile}} POSIX sh 互換のシェルはすべて、このファイルをログイン時に source する必要があります。このファイルは {{ic|$PATH}} や他の環境変数を設定し、ログイン時にはアプリケーション固有 ({{ic|/etc/profile.d/*.sh}}) の設定を行います。
 
** {{ic|/etc/profile}} POSIX sh 互換のシェルはすべて、このファイルをログイン時に source する必要があります。このファイルは {{ic|$PATH}} や他の環境変数を設定し、ログイン時にはアプリケーション固有 ({{ic|/etc/profile.d/*.sh}}) の設定を行います。
 
* {{ic|$ZDOTDIR/.zprofile}} 起動時にユーザのコマンドを実行するために使用されます。'''''ログインシェル'''''として起動した場合に、このファイルは読み込まれます。通常、グラフィカルセッションを自動起動し、セッションの環境変数を設定するために使用されます。
 
* {{ic|$ZDOTDIR/.zprofile}} 起動時にユーザのコマンドを実行するために使用されます。'''''ログインシェル'''''として起動した場合に、このファイルは読み込まれます。通常、グラフィカルセッションを自動起動し、セッションの環境変数を設定するために使用されます。
68行目: 67行目:
 
{{Note|{{ic|$HOME/.profile}} は Zsh のスタートアップファイルの一部ではありません。さらに、Zsh によって '''source されません''' (Zsh が {{ic|sh}} か {{ic|ksh}} として実行され、ログインシェルとして起動しない限り)。sh や [[ksh]] との互換性モードに関する詳細は {{man|1|zsh|COMPATIBILITY}} を見てください。}}
 
{{Note|{{ic|$HOME/.profile}} は Zsh のスタートアップファイルの一部ではありません。さらに、Zsh によって '''source されません''' (Zsh が {{ic|sh}} か {{ic|ksh}} として実行され、ログインシェルとして起動しない限り)。sh や [[ksh]] との互換性モードに関する詳細は {{man|1|zsh|COMPATIBILITY}} を見てください。}}
   
{{Warning|{{ic|/etc/zsh/zprofile}} 内にデフォルトで存在する [https://github.com/archlinux/svntogit-packages/blob/packages/zsh/trunk/zprofile 一行] を削除しないでください。さもないと、{{ic|/etc/profile.d/}} 内へスクリプトを提供するパッケージの整合性が破壊されてしまいます。}}
+
{{Warning|{{ic|/etc/zsh/zprofile}} 内にデフォルトで存在する [https://gitlab.archlinux.org/archlinux/packaging/packages/zsh/-/blob/main/zprofile 一行]を削除しないでください。さもないと、{{ic|/etc/profile.d/}} 内へスクリプトを提供するパッケージの整合性が破壊されてしまいます。}}
   
 
== Zsh の設定 ==
 
== Zsh の設定 ==
114行目: 113行目:
 
}}
 
}}
   
上記の設定には ssh/scp/sftp ホスト名の保管が含まれていますが、この機能を動作させるためにはユーザは ssh のホスト名ハッシュ化 (つまり、ssh クライアントの設定の {{ic|HashKnownHosts}} オプション) を有効化してはなりません。
+
上記の設定には ssh/scp/sftp ホスト名の補完が含まれていますが、この機能を動作させるためにはユーザは ssh のホスト名ハッシュ化 (つまり、ssh クライアントの設定の {{ic|HashKnownHosts}} オプション) を有効化してはなりません。
   
 
矢印キーを使うインターフェイスで自動補完を行うには、以下を追加してください:
 
矢印キーを使うインターフェイスで自動補完を行うには、以下を追加してください:
138行目: 137行目:
 
Zsh は [[readline]] を使用しません。代わりに、よりパワフルな独自の Zsh Line Editor (ZLE) を使用します。ZLE は {{ic|/etc/inputrc}} と {{ic|~/.inputrc}} のどちらも読み込みません。ZLE 設定のイントロダクションは [https://sgeb.io/posts/2014/04/zsh-zle-custom-widgets/ A closer look at the zsh line editor and creating custom widgets] を読んでください。
 
Zsh は [[readline]] を使用しません。代わりに、よりパワフルな独自の Zsh Line Editor (ZLE) を使用します。ZLE は {{ic|/etc/inputrc}} と {{ic|~/.inputrc}} のどちらも読み込みません。ZLE 設定のイントロダクションは [https://sgeb.io/posts/2014/04/zsh-zle-custom-widgets/ A closer look at the zsh line editor and creating custom widgets] を読んでください。
   
ZLE には [[Emacs]] モードと [[vi]] モードがあります。{{ic|VISUAL}} か {{ic|EDITOR}} のどちらか一方の[[環境変数]]に {{ic|vi}} という文字列が含まれている場合、vi モードが使用されます。それ以外の場合、Emacs モードをデフォルトで使用します。{{ic|bindkey -e}} (Emacs モード) や {{ic|bindkey -v}} (vi モード) でモードを明示的に設定することもできます。
+
ZLE には [[Emacs]] モードと [[vi]] モードがあります。{{ic|VISUAL}} か {{ic|EDITOR}} のどちらか一方の[[環境変数]]に {{ic|vi}} という文字列が含まれている場合、vi モードが使用されます。それ以外の場合、Emacs モードをデフォルトで使用します。{{ic|bindkey -e}} (Emacs モード) や {{ic|bindkey -v}} (vi モード) でモードを明示的に設定することもできます。デフォルトでは、vi モードでの Esc キーを押した時の遅延は 0.4 秒ですが、{{ic|1=export KEYTIMEOUT=5}} でより短く (0.05 秒) することができます。
   
 
キーバインドは、キープレスに対応するエスケープシーケンスを ZLE ウィジェットにマッピングすることにより割り当てます。利用可能なウィジェットは {{man|1|zshzle|STANDARD WIDGETS}} と {{man|1|zshcontrib|ZLE FUNCTIONS}} にリストアップされています (アクションとデフォルトのキーバインドの説明付き)。
 
キーバインドは、キープレスに対応するエスケープシーケンスを ZLE ウィジェットにマッピングすることにより割り当てます。利用可能なウィジェットは {{man|1|zshzle|STANDARD WIDGETS}} と {{man|1|zshcontrib|ZLE FUNCTIONS}} にリストアップされています (アクションとデフォルトのキーバインドの説明付き)。
145行目: 144行目:
   
 
{{hc|~/.zshrc|2=
 
{{hc|~/.zshrc|2=
# zkbd と互換性のあるハッシュを作成し、
+
# zkbd と互換性のあるハッシュテーブルを作成し、
# 他のキーをこのハッシュに追加する (man 5 terminfo を参照)
+
# 他のキーをこのハッシュテーブルに追加する (man 5 terminfo を参照)
 
typeset -g -A key
 
typeset -g -A key
   
325行目: 324行目:
 
xterm 256 color と互換性のあるターミナルエミュレータの色番号 0 から 255 は、[https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg xterm-256color チャート]で見られます。
 
xterm 256 color と互換性のあるターミナルエミュレータの色番号 0 から 255 は、[https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg xterm-256color チャート]で見られます。
   
TERM 環境変数が正しく設定されていれば、ターミナルのサポートする色の最大数は、{{man|5|terminfo}} データベースから {{ic|echoti colors}} を使って確認することができます。[https://gist.github.com/XVilka/8346728 24-bit カラー]の場合は、{{ic|print $COLORTERM}} を使って COLORTERM 環境変数も確認してください。{{ic|24bit}} か {{ic|truecolor}} を返した場合、たとえ terminfo がより少ない数値を表示したとしても、あなたのターミナルは 16777216 (2<sup>24</sup>) 色をサポートしています。
+
TERM 環境変数が正しく設定されていれば、ターミナルのサポートする色の最大数は、{{man|5|terminfo}} データベースから {{ic|echoti colors}} を使って確認することができます。[https://github.com/termstandard/colors/blob/master/README.md 24-bit カラー]の場合は、{{ic|print $COLORTERM}} を使って COLORTERM 環境変数も確認してください。{{ic|24bit}} か {{ic|truecolor}} を返した場合、たとえ terminfo がより少ない数値を表示したとしても、あなたのターミナルは 16777216 (2<sup>24</sup>) 色をサポートしています。
   
 
{{Note|
 
{{Note|
345行目: 344行目:
 
以下のように出力されます:
 
以下のように出力されます:
   
<div style="font-family: monospace; white-space: pre; padding: 1em; background-color: #000; border: 1px solid #bcd; color: #c0c0c0; overflow:hidden;"><span style="float:left;">username@host ~ % </span></div>
+
<div class="mw-no-invert" style="font-family: monospace; white-space: pre; padding: 1em; background-color: #000; border: 1px solid #bcd; color: #c0c0c0; overflow:hidden;"><span style="float:left;">username@host ~ % </span></div>
   
 
これは、色付きの左右両方のプロンプトの例です:
 
これは、色付きの左右両方のプロンプトの例です:
354行目: 353行目:
 
以下のように出力されます:
 
以下のように出力されます:
   
<div style="font-family: monospace; white-space: pre; padding: 1em; background-color: #000; border: 1px solid #bcd; color: #c0c0c0; overflow: hidden;"><span style="float:left;"><span style="color: #008000;">username</span>@<span style="color: #800080;">host</span> <span style="color: #0000ff;">~</span> % </span><span style="float:right;">[<span style="color: #808000;">0</span>]</span></div>
+
<div class="mw-no-invert" style="font-family: monospace; white-space: pre; padding: 1em; background-color: #000; border: 1px solid #bcd; color: #c0c0c0; overflow: hidden;"><span style="float:left;"><span style="color: #008000;">username</span>@<span style="color: #800080;">host</span> <span style="color: #0000ff;">~</span> % </span><span style="float:right;">[<span style="color: #808000;">0</span>]</span></div>
   
 
16-255 の範囲の色は、欲しい色に割り当てた 0 から 255 までの数値を使うことで使用できます。また、24 ビットトゥルーカラーは16進数のカラーコードを使うことで使用できます:
 
16-255 の範囲の色は、欲しい色に割り当てた 0 から 255 までの数値を使うことで使用できます。また、24 ビットトゥルーカラーは16進数のカラーコードを使うことで使用できます:
380行目: 379行目:
 
=== プログラムが異常終了した後、端末の設定を復元する ===
 
=== プログラムが異常終了した後、端末の設定を復元する ===
   
多くのプログラムは端末の状態を変更し、異常終了端末の設定を復元しません (例:SIGINT がクラッシュは検出され場合)
+
多くのプログラムはターミナルの状態を変更し、異常終了したときターミナルの設定を復元しないことがあり (例えば、クラッシュときや、SIGINT を受け取っとき)
   
これは通常、{{man|1|reset}} を実行することで解決できます
+
通常、これは {{man|1|reset}} を実行することで解決できます:
   
 
$ reset
 
$ reset
   
では、端末を手動でリセットする必要方法について説明します。
+
以下セクションでは、手動でターミナルをリセットする手間く方法について説明します。
   
 
==== ttyctl コマンド ====
 
==== ttyctl コマンド ====
   
[http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html#index-tty_002c-freezing ttyctl] コマンドを使って端末を "フリーズ/フリーズ解除" することができます。起動時にインタラクティブシェルをフリーズするには、次のコマンドを使用します。
+
[https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html#index-tty_002c-freezing ttyctl] コマンドを使ってターミナルを "freeze/unfreeze" することができます。起動時にインタラクティブシェルを freeze させるには、以下を使用してください:
   
 
{{hc|~/.zshrc|
 
{{hc|~/.zshrc|
398行目: 397行目:
 
==== エスケープシーケンスで端末をリセットする ====
 
==== エスケープシーケンスで端末をリセットする ====
   
[https://www.in-ulm.de/~mascheck/various/alternate_charset/ 代替の線画文字セット] ttyctl が防ぐことできない方法で端末を台無しにしてしまう可能性があります。
+
[https://www.in-ulm.de/~mascheck/various/alternate_charset/ 代替の線画文字セット]はttyctl が防ぐことできない方法でターミナルを台無しにしてしまうことがあります。
   
簡単な解決法は、{{ic|precmd}} フック関数から端末をリセットするエスケープシーケンスを出力、プロンプトが表示される前に毎回実行されるようにすることです。例えば、 [https://www.in-ulm.de/~mascheck/various/alternate_charset/#solution the escape sequence] {{ic|\e[0m\e(B\e)0\017\e[?5l\e7\e[0;0r\e8}}
+
シンプルな解決法は、ターミナルをリセットするエスケープシーケンスを {{ic|precmd}} フック関数から出力することです。そうすれば、プロンプトが描画される前に毎回、そのエスケープシーケンスが出力されす。例えば、[https://www.in-ulm.de/~mascheck/various/alternate_charset/#solution エスケープシーケンス] {{ic|\e[0m\e(B\e)0\017\e[?5l\e7\e[0;0r\e8}} を使うと:
   
 
{{hc|~/.zshrc|2=
 
{{hc|~/.zshrc|2=
413行目: 412行目:
 
}}
 
}}
   
動作するかどうかをテストには、次のコマンドを実行します。
+
まく行くすには、以下を実行してください:
   
 
$ print '\e(0\e)B'
 
$ print '\e(0\e)B'
421行目: 420行目:
 
==== Dirstack ====
 
==== Dirstack ====
   
Zshは、最後にアクセスしたフォルダ DIRSTACKSIZE を記憶するように構成できます。こ使用すると、非常にすばやく ''cd'' することができます。設定ファイルにいくつかの行を追加する必要があります
+
Zsh は、最後に訪れたフォルダのうち DIRSTACKSIZE を記憶するように設定できます。この機能用すればそれらのフォルダへ非常に素早く ''cd'' することができます。設定ファイルにいくつかの行を追加する必要があります:
   
 
{{hc|~/.zshrc|<nowiki>
 
{{hc|~/.zshrc|<nowiki>
440行目: 439行目:
 
setopt AUTO_PUSHD PUSHD_SILENT PUSHD_TO_HOME
 
setopt AUTO_PUSHD PUSHD_SILENT PUSHD_TO_HOME
   
  +
## 重複するエントリを削除する
## Remove duplicate entries
 
 
setopt PUSHD_IGNORE_DUPS
 
setopt PUSHD_IGNORE_DUPS
   
  +
## +/- 演算子をもとに戻す。
## This reverts the +/- operators.
 
 
setopt PUSHD_MINUS
 
setopt PUSHD_MINUS
 
</nowiki>}}
 
</nowiki>}}
   
  +
これで、以下のコマンドを使えば dirstack を出力できます。
使用する
 
  +
Now use
   
 
$ dirs -v
 
$ dirs -v
   
{{ic|cd -<NUM>}} を使用し、アクセスしたフォルダに移動。ダッシュの後オートコンプリートを使用しますこれは、オートコンプリートメニューを使用する場合に非常に便利です。
+
訪れたフォルダに戻るには {{ic|cd -<NUM>}} を使ください。ダッシュ記号の後オートコンプリートを使ってください。オートコンプリートメニューを使場合に便利です。
   
{{Note|複数の ''zsh'' の場合 セッションを開いていて{{ic|cd}} を実行しようとすると、両方のセッション同じファイルへの書込みが競合するため、この操は機能しません。}}
+
{{Note|2つ以上の ''zsh'' セッションを開いていて {{ic|cd}} をしようとした場合、両方のセッション同じファイルむことで競合が発生するため、これは動作しません。}}
   
 
==== cdr ====
 
==== cdr ====
   
cdr を使用すると、作業ディレクトリーを、自動的に保守されるリストから前の作業ディレクトリ変更することができます。セッション間および (デフォルトで) 現在のセッション内の端末エミュレータ間で維持されるファイルにすべてのエントリが格納されます。
+
cdr により、自動的に管理されるリストを使って現在の作業ディレクトリから前の作業ディレクトリに移動することができます。cdr は、現在のセッションでセッション間および (デフォルトで) ターミナルエミュレータ間で管理されるファイルにすべてのエントリを保存します。
   
セットアップ手順について{{man|1|zshcontrib|REMEMBERING RECENT DIRECTORIES}} を参照してください。
+
セットアップ手順は {{man|1|zshcontrib|REMEMBERING RECENT DIRECTORIES}} をてください。
   
 
==== zoxide ====
 
==== zoxide ====
   
{{Pkg|zoxide}} は、よりスマートな ''cd'' コマンドで、わずかのキーストロークでどこでも移動できます。頻繁に使用るディレクトリを記憶し、スコアリングメカニズムを使用し目的の場所を推測します。
+
{{Pkg|zoxide}} は、よりスマートな ''cd'' コマンドで、数のキーストロークで好きな場所に移動できます。zoxide は、頻繁に使用されるディレクトリを記憶し、スコアリングメカニズムを使、あなたが行きたい場所を推測します。
   
 
=== ヘルプコマンド ===
 
=== ヘルプコマンド ===
   
[[Bash]] とは異なり、Zsh は組み込みコマンド {{ic|help}} 代わりに {{ic|run-help}} を提供します。デフォルトでは、{{ic|run-help}}は{{ic|man}} のエイリアスとなっており、コマンドの前に付けて手動で実行するか、キーボードショートカット {{ic|Alt+h}} または {{ic|Esc}} {{ic|h}} を使用して現在入力されていコマンドに対して呼び出すことできます。
+
[[Bash]] とは違い、Zsh は組み込み {{ic|help}} コマンドを有効化しておらず、代わりに {{ic|run-help}} を提供しています。デフォルトでは、{{ic|run-help}} {{ic|man}} のエイリアスとなっています。コマンドの前に {{ic|run-help}} と付けることで実行できままたは今タイプしたコマンドに対してキーボードショートカット {{ic|Alt+h}} {{ic|Esc}} {{ic|h}} を入力ることでも実行できます。
   
デフォルトでは [[man]] のエイリアスであため、外部コマンドでのみ動作しま。シェルの組み込み関数その他のシェル機能で動作するように変更するには、{{ic|run-help}} 関数を使用する必要があります。{{ic|run-help}} とその補助機能の詳細については{{man|1|zshcontrib}} を参照してください。
+
デフォルトでは [[man]] のエイリアスとなっていので、外部コマンドに対してしか動作しません。シェルの組み込みコマンドやシェルの他の機能で動作するようにするには、{{ic|run-help}} 関数を使必要があります。{{ic|run-help}} 補助関数については {{man|1|zshcontrib}} をてください。
   
まず、{{ic|run-help}} 関数をロードしてから、既存の {{ic|run-help}} エイリアスを削除します。{{ic|help}} は {{ic|run-help}} のエイリアスにできます。たとえば、{{ic|zshrc}} に次の行を追加します。
+
まず、{{ic|run-help}} 関数をロードし、その次に既存の {{ic|run-help}} エイリアスを削除してください。{{ic|help}} は {{ic|run-help}} のエイリアスにすることもできます。えば、以下を {{ic|zshrc}} に追加してください:
   
 
autoload -Uz run-help
 
autoload -Uz run-help
477行目: 477行目:
 
alias help=run-help
 
alias help=run-help
   
アシスタント機能有効する必要があります
+
補助関数は別有効する必要があります:
   
autoload -Uz run-help-git run-help-ip run-help-openssl run-help-p4 run-help-sudo run-help-svk run-help-svn
+
autoload -Uz run-help-git run-help-ip run-help-openssl run-help-p4 run-help-sudo run-help-svk run-help-svn
   
たとえば、{{ic|run-help git commit}} コマンドは {{man|1|git}} の代わりに [[man ページ]] {{man|1|git-commit}} を開きます。
+
えば、{{ic|run-help git commit}} コマンドは{{man|1|git}} ではなく {{man|1|git-commit}} の [[man ページ]]を開きます。
   
=== 続的な再ハッシュ ===
+
=== 続的に rehash する ===
   
通常、compinit は {{ic|$PATH}} 内新しい実行可能ファイルを自動的には見つけません。たとえば、新しいパッケージをインストールした後、{{ic|/usr/bin/}} 内ファイルはすぐにまたは自動的には補完に含まれません。たがってこれらの新しい実行可能ファイルを含めるには、次のコマンドを実行します。
+
通常、compinit は {{ic|$PATH}} 内新しい実行ファイルを自動的には見つけません。えば、新しいパッケージをインストールした後、{{ic|/usr/bin/}} 内に追加された新しいファイルは即座または自動的には補完に含まれないでょう。なのでような新しい実行ファイルを補完に含めるには、以下を実行してください:
   
 
$ rehash
 
$ rehash
   
この ''再ハッシュ'' は自動的に実行されるよう設定できます。[https://github.com/robbyrussell/oh-my-zsh/issues/3440] {{ic|zshrc}} に以下を含めるだけです
+
この 'rehash' は自動的に実行るよう設定できます。[https://github.com/robbyrussell/oh-my-zsh/issues/3440] 以下を {{ic|zshrc}} に追加するだけです:
   
 
{{hc|~/.zshrc|
 
{{hc|~/.zshrc|
495行目: 495行目:
 
}}
 
}}
   
==== オンデマンド再ハッシュ ====
+
==== 必要なときにだけ rehash する ====
   
しかし、上記のように [[pacman]] を [[Pacman#Hooks|hooks]] で設定すると、{{ic|rehash}} を自動的に要求できます。これ上記のような連続的な再ハッシュよるパフォーマンスの低下を招くことはりません。これを有効するには、{{ic|/etc/pacman.d/hooks}} ディレクトリと {{ic|/var/cache/zsh}} フックファイルを作成します。
+
しかし、[[pacman フック]]を使って、自動的に {{ic|rehash}} を要求するように設定できます。こうす先のセクションのように継続的に rehash してパフォーマンスが劣化してしまうようなことは起こりません。これを有効するには、{{ic|/etc/pacman.d/hooks}} ディレクトリと {{ic|/var/cache/zsh}} ディレクトリを作成し、フックファイルを作成してください:
  +
  +
{{hc|head=/etc/pacman.d/hooks/zsh.hook|output=
  +
[Trigger]
  +
Operation = Install
  +
Operation = Upgrade
  +
Operation = Remove
  +
Type = Path
  +
Target = usr/bin/*
  +
[Action]
  +
Depends = zsh
  +
When = PostTransaction
  +
Exec = /usr/bin/install -Dm644 /dev/null /var/cache/zsh/pacman
  +
}}
  +
  +
これは、{{ic|/var/cache/zsh/pacman}} ファイルの変更日時を、最後にパッケージをインストール/アップグレード/アンインストールした時間に合わせます。次に、{{ic|zsh}} のコマンドキャッシュが古くなったときにコマンドキャッシュを rehash するように設定します。以下を {{ic|~/.zshrc}} に追加してください:
   
 
{{hc|~/.zshrc|<nowiki>
 
{{hc|~/.zshrc|<nowiki>
517行目: 532行目:
 
</nowiki>}}
 
</nowiki>}}
   
{{ic|precmd}} フックが {{ic|/var/cache/zsh/pacman}} 更新にトリガーされた場合、新しいプロンプトがされるまで完了できないことがあり{{ic|enter}} などの空のコマンドを実行すれば十分です。
+
{{ic|/var/cache/zsh/pacman}} 更新されるまえ {{ic|precmd}} フックがトリガーされた場合、新しいプロンプトが始るまでが効かないかもしれせんそういうときは、空のコマンドを実行すれば良いはずです (例えば、{{ic|enter}} を押す)
   
==== SIGUSR1 を使用したオンデマンド再ハッシュの代替 ====
+
==== SIGUSR1 を使って必要なときにだけ rehash する ====
   
フックファイルはのようになります。
+
フックファイルは以下のようになります。
   
 
{{hc|/etc/pacman.d/hooks/zsh-rehash.hook|output=
 
{{hc|/etc/pacman.d/hooks/zsh-rehash.hook|output=
538行目: 553行目:
 
}}
 
}}
   
{{Warning|実行中のすべての {{ic|zsh}} インスタンスに SIGUSR1 を送信します。SIGUSR1 のデフォルトの動は終了すので、最初にれを設定すると、以下トラ送信していないすべてのユーザー (ログインシェルを含む) の実行中のすべての {{ic|zsh}} インスタンスが終了します。}}
+
{{Warning|このフックは、実行中の {{ic|zsh}} インスタンスすべてに SIGUSR1 を送信します。注意すべきなのは、SIGUSR1 のデフォルトの動は終了」だということで。なので、この先に設定してしまうと、すべてのユーザの実行中の {{ic|zsh}} インスタンス (ログインシェルも含む) のうち以下のトラップを source していないもの終了してしまいます。}}
   
 
{{hc|~/.zshrc|
 
{{hc|~/.zshrc|
544行目: 559行目:
 
}}
 
}}
   
上記の ''関数トラップ'' は、''トラップのリスト'' {{ic|trap 'rehash' USR1}} 置き換えることできます。トラップのタイプの違いについては{{man|1|zshmisc|Trap Functions}} を参照してください。
+
の ''関数トラップ'' は、''リストトラップ'' {{ic|trap 'rehash' USR1}} 置き換えることできます。トラップの種類の違いについては {{man|1|zshmisc|Trap Functions}} をてください。
   
このメソッドを使用すると、すべての {{ic|rehash}} インスタンス即座に {{ic|zsh}} 、{{ic|precmd}} を起動するために Enter キーを押す必要がなくなりま
+
この方法は、すべての {{ic|zsh}} インスタンス即座に {{ic|rehash}} します。ので、{{ic|precmd}} をトリガーするためにエンターキーを押す必要がりません
   
 
=== ncurses アプリケーションにキーをバインド ===
 
=== ncurses アプリケーションにキーをバインド ===
599行目: 614行目:
 
</nowiki>}}
 
</nowiki>}}
   
=== xterm タイトル ===
+
=== xterm タイトル ===
   
端末エミュレータがサポートしている場合は、タイトルを Zsh から設定できます。これにより、タイトルを動的に変更し、シェルの状態に関する関連情報 (ユーザ名や現在のディレクトリ現在実行中のコマンドなど) を表示できます。
+
あなたのターミナルエミュレータがサポートしていればZsh からターミナルのタイトルを設定できます。これにより、タイトルを動的に変更し、シェルの状態に関する状態 (例えば、ユーザ名とカレントディレクトリ現在実行中のコマンド) を表示できます。
   
xterm のタイトルは [https://www.tldp.org/HOWTO/Xterm-Title-3.html#ss3.1 xterm escape sequence] {{ic|\e]2;}}{{ic|\a}} 例:
+
xterm のタイトルは [https://www.tldp.org/HOWTO/Xterm-Title-3.html#ss3.1 xterm の制御シーケンスオペレーティングシステムコマンド]である {{ic|\e]2;}}{{ic|\a}} か {{ic|\e]2;}}{{ic|\e\\}} で設定します。えば:
   
 
$ print -n '\e]2;My xterm title\a'
 
$ print -n '\e]2;My xterm title\a'
   
タイトルを設定します
+
このコマンドは、タイトルを以下に設定します:
   
 
My xterm title
 
My xterm title
   
動的タイトルを簡単設定するは、{{ic|precmd}} および {{ic|preexec}} フック関数でタイトルを設定します。使用可能なフック関数リストとその説明について{{man|1|zshmisc|Hook Functions}} を参照してください。
+
タイトルを動的にするシンプルな方法は、{{ic|precmd}} フック関数と {{ic|preexec}} フック関数でタイトルを設定することです。用可能なフック関数リストと説明は {{man|1|zshmisc|Hook Functions}} をてください。
   
さらに {{ic|print-P}} を使うと、Zsh のプロンプトエスケープを利することができます。
+
{{ic|print -P}} を使えばさらに Zsh のプロンプトエスケープも使用できます。
   
 
{{Tip|
 
{{Tip|
* タイトルプリント、連続している限り、複数のコマンドに分できます。
+
* タイトルの表示は複数のコマンドに分けることができます。ただし、コマンドは連続していなければなりません
* [[GNU Screen]] xterm のタイトルをハードステータス ({{ic|%h}}) に送。 [https://www.gnu.org/software/screen/manual/html_node/String-Escapes.html string escapes] (例:) 使用したい場合、{{ic|\e_}}{{ic|\e\\}} エスケープシーケンスでハードステータスを設定する必要があります。そうでなければ、文字列エスケープ {{ic|\e] 2;}}{{ic|\a}} と入力すると、Screen の文字列エスケープを解釈できないため、ターミナルエミュレータのタイトルが文字化けします。
+
* [[GNU Screen]] は、xterm のタイトルを hardstatus ({{ic|%h}}) に送信しますScreen [https://www.gnu.org/software/screen/manual/html_node/String-Escapes.html 文字列エスケープ]を使いたい場合 (例えば、色を付けたい場合など)エスケープシーケンス {{ic|\e_}}{{ic|\e\\}} を使って hardstatus を設定する必要があります。文字列エスケープ {{ic|\e]2;}}{{ic|\a}} 内で使用した場合、ターミナルエミュレータは、Screen の文字列エスケープを解釈できないため、タイトルが文字化けしてしまいます。
 
}}
 
}}
   
 
{{Note|
 
{{Note|
* 変数がプロンプトエスケープとして解析されないようにするため、変数を出力するときに {{ic|-P}} の {{ic|-P}} オプション使用しないでください。
+
* 変数を表示するときに {{ic|print}} の {{ic|-P}} オプション使用しないでください。変数がプロンプトエスケープとしてパースされてしまいます
* 変数を出力する {{ic|q}} [http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags パラメータ展開フラグ] を使用してエスケープシーケンスとして解析されないようにします。
+
* 変数を表示するときは、[https://zsh.sourceforge.io/Doc/Release/Expansion.html#Parameter-Expansion-Flags パラメータ展開フラグ] {{ic|q}} を使用してください。変数がエスケープシーケンスとしてパースされないようにするためです。
 
}}
 
}}
   
638行目: 653行目:
 
}
 
}
   
if [[ "$TERM" == (Eterm*|alacritty*|aterm*|gnome*|konsole*|kterm*|putty*|rxvt*|screen*|tmux*|xterm*) ]]; then
+
if [[ "$TERM" == (Eterm*|alacritty*|aterm*|foot*|gnome*|konsole*|kterm*|putty*|rxvt*|screen*|wezterm*|tmux*|xterm*) ]]; then
 
add-zsh-hook -Uz precmd xterm_title_precmd
 
add-zsh-hook -Uz precmd xterm_title_precmd
 
add-zsh-hook -Uz preexec xterm_title_preexec
 
add-zsh-hook -Uz preexec xterm_title_preexec
644行目: 659行目:
 
</nowiki>}}
 
</nowiki>}}
   
==== ターミナルエミュレータのタブのタイトル====
+
==== ターミナルエミュレータのタブのタイトル ====
   
一部のターミナルエミュレータおよびマルチプレクサは、タブのタイトルの設定をサポートしています。エスケープシーケンスは端末によって異なります
+
一部のターミナルエミュレータマルチプレクサは、タブのタイトルの設定をサポートしています。そのためのエスケープシーケンスはターミナルによります:
   
 
{| class="wikitable sortable"
 
{| class="wikitable sortable"
655行目: 670行目:
 
! [[GNU Screen]]
 
! [[GNU Screen]]
 
| {{ic|\ek}}{{ic|\e\\}}
 
| {{ic|\ek}}{{ic|\e\\}}
| Screen' ウィンドウタイトル ({{ic|%t}}).
+
| Screen ウィンドウタイトル ({{ic|%t}})
 
|-
 
|-
 
! [[Konsole]]
 
! [[Konsole]]
 
| {{ic|\e]30;}}{{ic|\a}}
 
| {{ic|\e]30;}}{{ic|\a}}
| Konsole' タブタイトル.
+
| Konsole タブタイトル
 
|}
 
|}
   
 
=== シェル環境の検出 ===
 
=== シェル環境の検出 ===
   
シェル環境を検出するテストについては、[https://gitlab.com/jdorel-documentation/shell-environment-detection a repository about shell environment detection] 参照してください。これには、ログイン/対話シェル、 Xorg セッション、TTY、および SSH セッション含まれます。
+
シェル環境を検出するテストは、[https://gitlab.com/jdorel-documentation/shell-environment-detection shell environment detection のリポジトリ]をてください。これには、ログイン/インタラクティブシェル、Xorg セッション、TTY、SSH セッションの検出も含まれています。
   
=== /dev/tcp equivalent: ztcp ===
+
=== /dev/tcp と等価な ztcp ===
   
{{ic|zsh/net/tcp}} モジュールを使用します。
+
{{ic|zsh/net/tcp}} モジュールを使用してください:
   
 
$ zmodload zsh/net/tcp
 
$ zmodload zsh/net/tcp
   
TCP 接続を確立できるようになりした。
+
これで、TCP 接続を確立できます:
   
 
$ ztcp example.com 80
 
$ ztcp example.com 80
   
  +
詳細は {{man|1|zshmodules|THE_ZSH/NET/TCP_MODULE}} と {{man|1|zshtcpsys}} で見られます。
=== コマンドラインの一部でシェルを終了するショートカット ===
 
   
デフォルトでは、コマンドラインがいっぱいなって {{ic|Ctrl+d}} はシェルを閉じません、次のように修正しま
+
=== コマンドラインに文字あるときにもシェルを終了るショートカット ===
  +
  +
デフォルトでは、コマンドラインに文字が入力されている場合、{{ic|Ctrl+d}} はシェルを終了しません。これを修正するには:
   
 
{{hc|.zshrc|
 
{{hc|.zshrc|
688行目: 705行目:
 
=== pacman -F "command not found" ハンドラー ===
 
=== pacman -F "command not found" ハンドラー ===
   
[[pacman]] には、ファイルを含むパッケージを検索する機能が含まれています。の command-not-found ハンドラは、不明なコマンドが実行されたときに、pacman を直接使用して一致するパッケージを検索します。
+
[[pacman]] には、あるファイルを含むパッケージを検索する機能があります。以下の command-not-found ハンドラは、不明なコマンドが実行されたときに、pacman を直接使用してマッチするパッケージを検索します。
   
 
{{hc|1=~/.zshrc|2=
 
{{hc|1=~/.zshrc|2=
716行目: 733行目:
 
done
 
done
 
fi
 
fi
  +
return 127
 
}
 
}
 
...
 
...
 
}}
 
}}
   
{{Note|pacman のファイルデータベースは通常の同期データベースとは別のもので、{{ic|pacman-Fy}} を使用してフェッチする必要があります。詳細について [[pacman#特定のファイルが含まれているパッケージを検索]] を参照してください。}}
+
{{Note|pacman のファイルデータベースは通常の同期データベースから分離されており、{{ic|pacman -Fy}} を使てフェッチする必要があります。詳細は [[pacman#特定のファイルが含まれているパッケージを検索]] をてください。}}
''pkgfile'' ファイル を使用する別の方法については、[[zsh#"command not found" フック]] を参照してください。
 
   
  +
''pkgfile'' を使う代替としては、[[#pkgfile の "command not found" ハンドラー]] を見てください。
=== キーバインディングによるバックバッファのクリア ===
 
   
  +
=== キーバインドを使ってバックバッファをクリアする ===
デフォルトでは、ほとんどのターミナル・エミュレータで、画面クリアのキーバインドがバックバッファ(上にスクロールしないと見えない部分)をクリアしません。この問題を解決する方法として、次のようなものが考えられます。
 
  +
  +
デフォルトでは、画面をクリアするキーバインドは、ほとんどのターミナルエミュレータでバックバッファ (上にスクロールしないと見えない部分) をクリアしません。この問題の解決策とhしては:
   
 
{{hc|~/.zshrc|2=
 
{{hc|~/.zshrc|2=
749行目: 768行目:
 
{{Note|フレームワークは、抽象化と複雑化のレベルを導入します。それらは未定義の挙動をもたらす可能性があり、シェルが壊れた場合、''最初の'' デバッグステップは、プレーンなシェルに戻ることです。}}
 
{{Note|フレームワークは、抽象化と複雑化のレベルを導入します。それらは未定義の挙動をもたらす可能性があり、シェルが壊れた場合、''最初の'' デバッグステップは、プレーンなシェルに戻ることです。}}
   
  +
* {{App|oh-my-posh|Oh My Posh は、関数か変数でプロンプト文字列を変更することのできる任意のシェルのためのカスタムプロンプトエンジンです。|https://github.com/JanDeDobbeleer/oh-my-posh|{{AUR|oh-my-posh}}}}
 
* {{App|oh-my-zsh|Zsh の設定を管理するためのコミュニティ運営の人気なフレームワークです。たくさんの便利な関数、ヘルパー、プラグイン、テーマをバンドルしています。|https://github.com/ohmyzsh/ohmyzsh|{{AUR|oh-my-zsh-git}}}}
 
* {{App|oh-my-zsh|Zsh の設定を管理するためのコミュニティ運営の人気なフレームワークです。たくさんの便利な関数、ヘルパー、プラグイン、テーマをバンドルしています。|https://github.com/ohmyzsh/ohmyzsh|{{AUR|oh-my-zsh-git}}}}
 
* {{App|Prezto|Zsh 用の設定フレームワークです。モジュールが同梱されており、適切なデフォルト、エイリアス、関数、オートコンプリート、プロンプトテーマでコマンドラインインターフェイス環境を充実させることができます。|https://github.com/sorin-ionescu/prezto|{{AUR|prezto-git}}}}
 
* {{App|Prezto|Zsh 用の設定フレームワークです。モジュールが同梱されており、適切なデフォルト、エイリアス、関数、オートコンプリート、プロンプトテーマでコマンドラインインターフェイス環境を充実させることができます。|https://github.com/sorin-ionescu/prezto|{{AUR|prezto-git}}}}
* {{App|ZI|Zsh Unix シェルにおけるスイスアーミーナイフです。|https://github.com/z-shell/zi}}
 
 
* {{App|ZIM|驚異的なスピードとモジュール式拡張機能の付いた設定フレームワークです。Zim はとても簡単にカスタマイズでき、スピードと機能性を犠牲にせず、モジュールと機能の豊富なセットが付属しています。|https://github.com/zimfw/zimfw|{{AUR|zsh-zim-git}}}}
 
* {{App|ZIM|驚異的なスピードとモジュール式拡張機能の付いた設定フレームワークです。Zim はとても簡単にカスタマイズでき、スピードと機能性を犠牲にせず、モジュールと機能の豊富なセットが付属しています。|https://github.com/zimfw/zimfw|{{AUR|zsh-zim-git}}}}
   
758行目: 777行目:
 
* {{App|Antidote|レガシーな Antibody プラグインマネージャの完全な Zsh 実装です。|https://github.com/mattmc3/antidote|{{AUR|zsh-antidote}}}}
 
* {{App|Antidote|レガシーな Antibody プラグインマネージャの完全な Zsh 実装です。|https://github.com/mattmc3/antidote|{{AUR|zsh-antidote}}}}
 
* {{App|zinit (以前の名称は "zplugin")|柔軟な Zsh プラグインマネージャ。クリーンな fpath、レポート、補完管理、ターボモードが付いています。[https://github.com/zdharma-continuum/I_WANT_TO_HELP 復活しました]|https://github.com/zdharma-continuum/zinit|{{AUR|zinit-git}}}}
 
* {{App|zinit (以前の名称は "zplugin")|柔軟な Zsh プラグインマネージャ。クリーンな fpath、レポート、補完管理、ターボモードが付いています。[https://github.com/zdharma-continuum/I_WANT_TO_HELP 復活しました]|https://github.com/zdharma-continuum/zinit|{{AUR|zinit-git}}}}
  +
* {{App|sheldon|高速で設定可能なシェルプラグインマネージャです。Rust で書かれています。[https://github.com/rossmacarthur/sheldon]|https://github.com/rossmacarthur/sheldon|{{Pkg|sheldon}}}}
 
* {{App|Antigen|Zsh 用のプラグインマネージャ。oh-my-zsh と vundle にインスパイアされました。[https://github.com/zsh-users/antigen/issues/673 放棄されています]|https://github.com/zsh-users/antigen|{{AUR|antigen-git}}}}
 
* {{App|Antigen|Zsh 用のプラグインマネージャ。oh-my-zsh と vundle にインスパイアされました。[https://github.com/zsh-users/antigen/issues/673 放棄されています]|https://github.com/zsh-users/antigen|{{AUR|antigen-git}}}}
 
* {{App|zgen|Zsh 用の軽量でシンプルなプラグインマネージャ。[https://github.com/tarjoilija/zgen/issues/123 放棄されています]|https://github.com/tarjoilija/zgen|{{AUR|zgen-git}}}}
 
* {{App|zgen|Zsh 用の軽量でシンプルなプラグインマネージャ。[https://github.com/tarjoilija/zgen/issues/123 放棄されています]|https://github.com/tarjoilija/zgen|{{AUR|zgen-git}}}}
766行目: 786行目:
 
[[Fish]] には強力なシェルシンタックスハイライトとオートサジェスト機能があります。これらの機能を zsh で使うには、{{pkg|zsh-syntax-highlighting}} と {{pkg|zsh-autosuggestions}} をインストールし、提供されたスクリプトの一方または両方を zshrc から [[source]] してください:
 
[[Fish]] には強力なシェルシンタックスハイライトとオートサジェスト機能があります。これらの機能を zsh で使うには、{{pkg|zsh-syntax-highlighting}} と {{pkg|zsh-autosuggestions}} をインストールし、提供されたスクリプトの一方または両方を zshrc から [[source]] してください:
   
  +
{{hc|1=~/.zshrc|2=
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
 
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
+
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
  +
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
  +
}}
   
 
=== pkgfile の "command not found" ハンドラー ===
 
=== pkgfile の "command not found" ハンドラー ===
790行目: 812行目:
 
* [https://zsh.sourceforge.io/Doc/Release/index-frame.html Z Shell マニュアル] ([https://zsh.sourceforge.io/Doc/ このページ]とは形式が異なります)
 
* [https://zsh.sourceforge.io/Doc/Release/index-frame.html Z Shell マニュアル] ([https://zsh.sourceforge.io/Doc/ このページ]とは形式が異なります)
 
* [https://zsh.sourceforge.io/FAQ/zshfaq01.html Zsh FAQ]
 
* [https://zsh.sourceforge.io/FAQ/zshfaq01.html Zsh FAQ]
* [https://zshwiki.org/home/ Zsh Wiki]
 
 
* {{man|1|zsh-lovers}} ({{pkg|zsh-lovers}} パッケージとして利用可能)
 
* {{man|1|zsh-lovers}} ({{pkg|zsh-lovers}} パッケージとして利用可能)
 
* [[Gentoo: Zsh/Guide]]
 
* [[Gentoo: Zsh/Guide]]
* [http://www.bash2zsh.com/zsh_refcard/refcard.pdf Bash2Zsh Reference Card]
+
* [https://www.bash2zsh.com/zsh_refcard/refcard.pdf Bash2Zsh Reference Card]
  +
  +
{{TranslationStatus|Zsh|2023-09-19|785160}}

2023年9月19日 (火) 18:44時点における最新版

Zsh は対話式シェルとしてもスクリプト言語のインタプリタとしても使えるパワフルなシェルです。POSIX sh と互換性がありながら (デフォルトではありません、emulate sh を実行した時だけです)、タブ補完の改善や グロビングなどの利点があります。

Zsh FAQ には他にも Zsh をあなたのシェルとして使うべき理由が列挙されています。

目次

インストール

インストールをする前に現在使っているシェルが何なのか知っておくとよいでしょう:

$ echo $SHELL

zsh パッケージをインストールしてください。追加の補完定義を使いたい場合は、zsh-completions パッケージもインストールします。

初期設定

ターミナルで次のコマンドを実行して Zsh が正しくインストールされたか確認してください:

$ zsh

基本的な設定を説明する zsh-newuser-install が表示されるはずです。これをスキップしたい場合、q を押して下さい。表示されない場合は、次のコマンドで手動で呼び出すことができます:

$ autoload -Uz zsh-newuser-install
$ zsh-newuser-install -f
ノート: あなたのターミナルのサイズが少なくとも 72×15 であることを確認してください。そうでないと zsh-newuser-install は実行されません。

Zsh をデフォルトのシェルにする

シェルを /usr/bin/zsh に変更してください。コマンドラインシェル#デフォルトシェルを変更する を見てください。

ヒント: bash を置き換える場合、~/.bashrc から ~/.zshrc に (例: プロンプトとエイリアス) また ~/.bash_profile から ~/.zprofile に (例: X Window System を起動するコード) にコードを移動するとよいでしょう。

スタートアップ/シャットダウン ファイル

ヒント: インタラクティブシェルとログインシェルの説明、およびスタートアップファイルに何を入れるかについては、A User's Guide to the Z-Shell を参照してください。
ノート:
  • $ZDOTDIR が設定されていない場合は、代わりに $HOME が使用されます。
  • RCS オプションが以下のファイルのどれかで unset された場合、そのファイル以降、設定ファイルは読み込まれません。
  • GLOBAL_RCS オプションが以下のファイルのどれかで unset された場合、そのファイル以降、グローバルな設定ファイル (/etc/zsh/*) は読み込まれません。

デフォルトで、Zsh は起動時に以下のファイルを以下の順番で実行します (存在しているもののみ実行されます)。

  • /etc/zsh/zshenv すべてのユーザに対して環境変数を設定するために使用されます。このファイルには、出力を行うコマンドや、シェルが TTY に接続されていることを期待するコマンドを含めるべきではありません。このファイルが存在する場合、このファイルは 常に 読み込まれます。この挙動を上書きすることはできません。
  • $ZDOTDIR/.zshenv ユーザの環境変数を設定するために使用されます。このファイルには、出力を行うコマンドや、シェルが TTY に接続されていることを期待するコマンドを含めるべきではありません。このファイルが存在する場合、このファイルは 常に 読み込まれます。
  • /etc/zsh/zprofile すべてのユーザに対して起動時にコマンドを実行するために使用されます。ログインシェルとして起動した場合に、このファイルは読み込まれます。Arch Linux においては、このファイルには、/etc/profile を source する 1行がデフォルトで含まれていることを留意しておいてください。その行を削除したい場合は以下の警告を先に読んでください!
    • /etc/profile POSIX sh 互換のシェルはすべて、このファイルをログイン時に source する必要があります。このファイルは $PATH や他の環境変数を設定し、ログイン時にはアプリケーション固有 (/etc/profile.d/*.sh) の設定を行います。
  • $ZDOTDIR/.zprofile 起動時にユーザのコマンドを実行するために使用されます。ログインシェルとして起動した場合に、このファイルは読み込まれます。通常、グラフィカルセッションを自動起動し、セッションの環境変数を設定するために使用されます。
  • /etc/zsh/zshrc すべてのユーザに対して、インタラクティブシェルを設定したりコマンドを実行したりするために使用されます。インタラクティブシェルとして起動した場合に、このファイルは読み込まれます。
  • $ZDOTDIR/.zshrc ユーザのインタラクティブシェルを設定したり、コマンドを実行したりするために使用されます。インタラクティブシェルとして起動した場合に、このファイルは読み込まれます。
  • /etc/zsh/zlogin すべてのユーザに対して初期化処理の最後にコマンドを実行するために使用されます。ログインシェルとして起動した場合に、このファイルは読み込まれます。
  • $ZDOTDIR/.zlogin 初期化処理の最後にユーザのコマンドを実行するために使用されます。ログインシェルとして起動した場合に、このファイルは読み込まれます。通常、コマンドラインユーティリティを自動起動するために使用されます。グラフィカルセッションを自動起動するために使用するべきではありません (この時点では、インタラクティブシェルにおいてのみ意味を持つ設定がセッションに含まれているかもしれないからです)。
  • $ZDOTDIR/.zlogout ログインシェル終了 する時にコマンドを実行するために使用されます。
  • /etc/zsh/zlogout ログインシェル終了 する時にすべてのユーザに対してコマンドを実行するために使用されます。

the graphic representation を参照してください。

ノート: $HOME/.profile は Zsh のスタートアップファイルの一部ではありません。さらに、Zsh によって source されません (Zsh が shksh として実行され、ログインシェルとして起動しない限り)。sh や ksh との互換性モードに関する詳細は zsh(1) § COMPATIBILITY を見てください。
警告: /etc/zsh/zprofile 内にデフォルトで存在する 一行を削除しないでください。さもないと、/etc/profile.d/ 内へスクリプトを提供するパッケージの整合性が破壊されてしまいます。

Zsh の設定

Zsh は何も設定しなくても使うことができますが、ほとんどのユーザが使いたいと思うようには設定されていないことはほぼ確実です。ただし、Zsh で利用できるカスタマイズの量は膨大で、Zsh を設定するのは大変で時間を浪費する経験となるでしょう。自動的に設定するには #サードパーティ拡張 を見てください。

シンプルな .zshrc

以下は設定ファイルのサンプルです。デフォルトのオプションの適切なセットと共に、Zsh でカスタマイズ可能な方法の例を提供します。この設定を使うには、.zshrc という名前のファイルに保存してください。

ヒント: ログアウトせずに変更を適用するには source ~/.zshrc を実行してください。

これはシンプルな .zshrc です:

~/.zshrc
autoload -Uz compinit promptinit
compinit
promptinit

# デフォルトのプロンプトを walters テーマに設定する
prompt walters

プロンプトテーマシステムに関する詳細は #プロンプトテーマ を見てください。

$PATH の設定

Zsh は PATH 変数を path 配列に結びつけます。これにより、path 配列を変更するだけで PATH 変数を操作することができます。詳細は A User's Guide to the Z-Shell を見てください。

~/.local/bin/PATH に追加するには:

~/.zshenv
typeset -U path PATH
path=(~/.local/bin $path)
export PATH

コマンド補完

Zsh の一番魅力的な機能はおそらく先進的な自動補完機能でしょう。少なくとも .zshrc で自動補完を有効化してください。自動補完を有効にするには、以下を ~/.zshrc に追加してください:

~/.zshrc
autoload -Uz compinit
compinit

上記の設定には ssh/scp/sftp ホスト名の補完が含まれていますが、この機能を動作させるためにはユーザは ssh のホスト名ハッシュ化 (つまり、ssh クライアントの設定の HashKnownHosts オプション) を有効化してはなりません。

矢印キーを使うインターフェイスで自動補完を行うには、以下を追加してください:

~/.zshrc
zstyle ':completion:*' menu select

メニューをアクティブにするには、Tab を2回押してください。

特権が与えられたコマンドで特権環境の自動補完を有効化するには (例えば、sudo で始まるコマンドを補完する場合、補完スクリプトは sudo の補完もしようと試みます)、以下を追加してください:

~/.zshrc
zstyle ':completion::complete:*' gain-privileges 1
警告: これにより、Zsh の補完スクリプトが sudo 特権でコマンドを実行できてしまいます。信頼できない補完スクリプトを使用する場合はこれを有効化すべきではありません。
ノート: この特殊な種類の文脈依存の補完は、少数のコマンドでしか利用できません。

キーバインド

Zsh は readline を使用しません。代わりに、よりパワフルな独自の Zsh Line Editor (ZLE) を使用します。ZLE は /etc/inputrc~/.inputrc のどちらも読み込みません。ZLE 設定のイントロダクションは A closer look at the zsh line editor and creating custom widgets を読んでください。

ZLE には Emacs モードと vi モードがあります。VISUALEDITOR のどちらか一方の環境変数vi という文字列が含まれている場合、vi モードが使用されます。それ以外の場合、Emacs モードをデフォルトで使用します。bindkey -e (Emacs モード) や bindkey -v (vi モード) でモードを明示的に設定することもできます。デフォルトでは、vi モードでの Esc キーを押した時の遅延は 0.4 秒ですが、export KEYTIMEOUT=5 でより短く (0.05 秒) することができます。

キーバインドは、キープレスに対応するエスケープシーケンスを ZLE ウィジェットにマッピングすることにより割り当てます。利用可能なウィジェットは zshzle(1) § STANDARD WIDGETSzshcontrib(1) § ZLE FUNCTIONS にリストアップされています (アクションとデフォルトのキーバインドの説明付き)。

Zsh でキーバインドを設定する方法として推奨されるのは、terminfo(5) の文字列ケーパビリティを使用することです。例えば [1][2]:

~/.zshrc
# zkbd と互換性のあるハッシュテーブルを作成し、
# 他のキーをこのハッシュテーブルに追加する (man 5 terminfo を参照)
typeset -g -A key

key[Home]="${terminfo[khome]}"
key[End]="${terminfo[kend]}"
key[Insert]="${terminfo[kich1]}"
key[Backspace]="${terminfo[kbs]}"
key[Delete]="${terminfo[kdch1]}"
key[Up]="${terminfo[kcuu1]}"
key[Down]="${terminfo[kcud1]}"
key[Left]="${terminfo[kcub1]}"
key[Right]="${terminfo[kcuf1]}"
key[PageUp]="${terminfo[kpp]}"
key[PageDown]="${terminfo[knp]}"
key[Shift-Tab]="${terminfo[kcbt]}"

# 適宜キーを設定する
[[ -n "${key[Home]}"      ]] && bindkey -- "${key[Home]}"       beginning-of-line
[[ -n "${key[End]}"       ]] && bindkey -- "${key[End]}"        end-of-line
[[ -n "${key[Insert]}"    ]] && bindkey -- "${key[Insert]}"     overwrite-mode
[[ -n "${key[Backspace]}" ]] && bindkey -- "${key[Backspace]}"  backward-delete-char
[[ -n "${key[Delete]}"    ]] && bindkey -- "${key[Delete]}"     delete-char
[[ -n "${key[Up]}"        ]] && bindkey -- "${key[Up]}"         up-line-or-history
[[ -n "${key[Down]}"      ]] && bindkey -- "${key[Down]}"       down-line-or-history
[[ -n "${key[Left]}"      ]] && bindkey -- "${key[Left]}"       backward-char
[[ -n "${key[Right]}"     ]] && bindkey -- "${key[Right]}"      forward-char
[[ -n "${key[PageUp]}"    ]] && bindkey -- "${key[PageUp]}"     beginning-of-buffer-or-history
[[ -n "${key[PageDown]}"  ]] && bindkey -- "${key[PageDown]}"   end-of-buffer-or-history
[[ -n "${key[Shift-Tab]}" ]] && bindkey -- "${key[Shift-Tab]}"  reverse-menu-complete

# 最後に、zle がアクティブのときにターミナルがアプリケーションモードになるようにする。
# そのときにだけ、$terminfo の値が有効になる。
if (( ${+terminfo[smkx]} && ${+terminfo[rmkx]} )); then
	autoload -Uz add-zle-hook-widget
	function zle_application_mode_start { echoti smkx }
	function zle_application_mode_stop { echoti rmkx }
	add-zle-hook-widget -Uz zle-line-init zle_application_mode_start
	add-zle-hook-widget -Uz zle-line-finish zle_application_mode_stop
fi

履歴検索

以下の手順を使うには、key 配列を設定し、ZLE がアプリケーションモードとなるようにする必要があります。#キーバインド を見てください。

履歴検索を有効化するには、以下を .zshrc ファイルに追加してください:

~/.zshrc
autoload -Uz up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search

[[ -n "${key[Up]}"   ]] && bindkey -- "${key[Up]}"   up-line-or-beginning-search
[[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-beginning-search

これにより、UpDown を押したときに、現在の行のカーソル位置までにマッチする過去のコマンドだけが表示されます。

修飾キー Shift、Alt、Ctrl、Meta

xterm 互換端末は user_caps(5) からの拡張キー定義を使うことができます。キー定義は、ShiftAltCtrlMeta と、UpDownLeftRightPageUpPageDownHomeEndDel のどれかを組み合わせたものです。修飾キーとキーの組み合わせに推奨される名前の一覧については、zkbd のソース を参照してください。

たとえば、 Ctrl+Left で前の単語の先頭に移動し、Ctrl+Right で次の単語の先頭に移動させるには:

~/.zshrc
key[Control-Left]="${terminfo[kLFT5]}"
key[Control-Right]="${terminfo[kRIT5]}"

[[ -n "${key[Control-Left]}"  ]] && bindkey -- "${key[Control-Left]}"  backward-word
[[ -n "${key[Control-Right]}" ]] && bindkey -- "${key[Control-Right]}" forward-word

プロンプト

Zsh は2つの選択肢を提供します: プロンプトテーマを使用するか、テーマに不満がある (または、テーマの使いやすさを自分で拡張したい) ユーザはカスタムのプロンプトを構築できます。

プロンプトテーマ

プロンプトテーマは、Zsh で色付きのプロンプトを設定するための手っ取り早く簡単な方法です。プロンプトテーマや、プロンプトテーマを自分で記述する方法については zshcontrib(1) § PROMPT THEMES を参照してください。

テーマを使用するには、プロンプトテーマシステムが自動でロードされるように .zshrc で設定されていることを確認してください。自動ロードを行うには、以下の行を追加します:

~/.zshrc
autoload -Uz promptinit
promptinit

以下のコマンドで、利用可能なプロンプトテーマをリストアップできます:

$ prompt -l

例えば、walters テーマを使うには:

$ prompt walters

利用可能なテーマをすべてプレビューするには:

$ prompt -p
プロンプトテーマを手動でインストールする

外部の設定管理ツールを使わずに、テーマを手動でインストールすることもできます。ローカルにインストールする場合、まずフォルダを作成し、そのフォルダのパスを fpath 配列に追加してください。例えば:

$ mkdir ~/.zprompts
$ fpath=("$HOME/.zprompts" "$fpath[@]")

次に、このフォルダ内にテーマファイルのシンボリックリンクを作成します:

$ ln -s mytheme.zsh ~/.zprompts/prompt_mytheme_setup

代わりにテーマをグローバルにインストールする場合は、次のようにします:

# ln -s mytheme.zsh /usr/share/zsh/functions/Prompts/prompt_mytheme_setup

これで、次のコマンドを使ってアクティブ化できるはずです:

$ prompt mytheme

すべてが機能する場合は、.zshrc を適宜編集することができます。

テーマごとにファイルを分けずにプロンプトテーマを追加する

プロンプトテーマは、テーマのファイルを使って追加するだけでなく、ある1つのファイル (例えば .zshrc) 内からテーマを追加することもできます。例えば:

~/.zshrc
# promptinit をロードする
autoload -Uz promptinit && promptinit

# テーマを定義する
prompt_mytheme_setup() {
  PS1="%~%# "
}

# promptsys にそのテーマを追加する
prompt_themes+=( mytheme )

# テーマをロードする
prompt mytheme

プロンプトのカスタマイズ

すべてのシェルで一般的な主要な左側のプロンプト PS1 (PROMPTprompt) に加えて、Zsh では右側のプロンプト RPS1 (RPROMPT) もサポートしています。これら2つの変数は、好きな値にカスタムできます。

他の特殊な目的のためのプロンプト (PS2 (PROMPT2)、PS3 (PROMPT3)、PS4 (PROMPT4)、RPS1 (RPROMPT)、RPS2 (RPROMPT2)、SPROMPT など) は zshparam(1) § PARAMETERS USED BY THE SHELL で説明されています。

すべてのプロンプトは、プロンプトエスケープでカスタマイズできます (例えば、%n はユーザ名になります)。利用可能なプロンプトエスケープは zshmisc(1) § EXPANSION OF PROMPT SEQUENCES でリストアップされています。

Zsh は、Bash とは異なる方法で色を設定します。ANSI エスケープシーケンスや、terminfo(5) のターミナルケーパビリティを多用する必要はありません。Zsh は、前景色、背景色、他の視覚エフェクトを設定するための便利なプロンプトエスケープを提供します。エスケープのリストや説明は zshmisc(1) § Visual effects を見てください。

を指定する方法は3つあります: 10進数の整数、8つの広くサポートされている色の名前、# のあとに16進数の RGB トリプレット。詳細は zshzle(1) § CHARACTER HIGHLIGHTING 内の fg=colour の説明を見てください。

ほとんどのターミナルは以下の色を名前でサポートしています:

名前 番号
black 0
red 1
green 2
yellow 3
blue 4
magenta 5
cyan 6
white 7

xterm 256 color と互換性のあるターミナルエミュレータの色番号 0 から 255 は、xterm-256color チャートで見られます。

TERM 環境変数が正しく設定されていれば、ターミナルのサポートする色の最大数は、terminfo(5) データベースから echoti colors を使って確認することができます。24-bit カラーの場合は、print $COLORTERM を使って COLORTERM 環境変数も確認してください。24bittruecolor を返した場合、たとえ terminfo がより少ない数値を表示したとしても、あなたのターミナルは 16777216 (224) 色をサポートしています。

ノート:
  • 0 から 15 の色は、ターミナルエミュレータやカラースキームごとに異なる場合があります。
  • 多くのターミナルエミュレータは、太文字を明るい色で表示します。
ヒント:
  • プロンプトのエスケープは print -P "prompt escapes" コマンドでテストできます。例えば、
    $ print -P '%B%F{red}co%F{green}lo%F{blue}rs%f%b'
  • 24 ビットカラーを使用する場合、24 ビットカラーをサポートしていないターミナルでは zsh/nearcolor モジュールをロードする必要があるかもしれません。例えば:
    [[ "$COLORTERM" == (24bit|truecolor) || "${terminfo[colors]}" -eq '16777216' ]] || zmodload zsh/nearcolor
    zsh/nearcolor モジュールに関する詳細は zshmodules(1) § THE ZSH/NEARCOLOR MODULE を見てください。

これは、シンプルな色無しのプロンプトの例です:

PROMPT='%n@%m %~ %# '

以下のように出力されます:

username@host ~ %

これは、色付きの左右両方のプロンプトの例です:

PROMPT='%F{green}%n%f@%F{magenta}%m%f %F{blue}%B%~%b%f %# '
RPROMPT='[%F{yellow}%?%f]'

以下のように出力されます:

username@host ~ % [0]

16-255 の範囲の色は、欲しい色に割り当てた 0 から 255 までの数値を使うことで使用できます。また、24 ビットトゥルーカラーは16進数のカラーコードを使うことで使用できます:

PROMPT='%F{2}%n%f@%F{5}%m%f %F{4}%B%~%b%f %# '
RPROMPT='[%F{3}%?%f]'
PROMPT='%F{#c0c0c0}%n%f@%F{#008000}%m%f %F{#800080}%B%~%b%f %# '
RPROMPT='[%F{#0000ff}%?%f]'

サンプルの .zshrc ファイル

さらに見たい場合は ドットファイル#ユーザーリポジトリ を見てください。

ヒントとテクニック

ログイン時に X を自動起動

xinit#ログイン時に X を自動起動を参照してください。

プログラムが異常終了した後、端末の設定を復元する

多くのプログラムはターミナルの状態を変更し、異常終了したときにターミナルの設定を復元しないことがあります (例えば、クラッシュしたときや、SIGINT を受け取ったとき)。

通常、これは reset(1) を実行することで解決できます:

$ reset

以下のセクションでは、手動でターミナルをリセットする手間を省く方法について説明します。

ttyctl コマンド

ttyctl コマンドを使ってターミナルを "freeze/unfreeze" することができます。起動時にインタラクティブシェルを freeze させるには、以下を使用してください:

~/.zshrc
ttyctl -f

エスケープシーケンスで端末をリセットする

代替の線画文字セットは、ttyctl が防ぐことができない方法でターミナルを台無しにしてしまうことがあります。

シンプルな解決法は、ターミナルをリセットするエスケープシーケンスを precmd フック関数から出力することです。そうすれば、プロンプトが描画される前に毎回、そのエスケープシーケンスが出力されます。例えば、エスケープシーケンス \e[0m\e(B\e)0\017\e[?5l\e7\e[0;0r\e8 を使うと:

~/.zshrc
autoload -Uz add-zsh-hook

function reset_broken_terminal () {
	printf '%b' '\e[0m\e(B\e)0\017\e[?5l\e7\e[0;0r\e8'
}

add-zsh-hook -Uz precmd reset_broken_terminal

うまく行くか試すには、以下を実行してください:

$ print '\e(0\e)B'

最近のディレクトリを記憶させる

Dirstack

Zsh は、最後に訪れたフォルダのうち DIRSTACKSIZE 個を記憶するように設定できます。この機能を活用すれば、それらのフォルダへ非常に素早く cd することができます。設定ファイルにいくつかの行を追加する必要があります:

~/.zshrc
autoload -Uz add-zsh-hook

DIRSTACKFILE="${XDG_CACHE_HOME:-$HOME/.cache}/zsh/dirs"
if [[ -f "$DIRSTACKFILE" ]] && (( ${#dirstack} == 0 )); then
	dirstack=("${(@f)"$(< "$DIRSTACKFILE")"}")
	[[ -d "${dirstack[1]}" ]] && cd -- "${dirstack[1]}"
fi
chpwd_dirstack() {
	print -l -- "$PWD" "${(u)dirstack[@]}" > "$DIRSTACKFILE"
}
add-zsh-hook -Uz chpwd chpwd_dirstack

DIRSTACKSIZE='20'

setopt AUTO_PUSHD PUSHD_SILENT PUSHD_TO_HOME

## 重複するエントリを削除する
setopt PUSHD_IGNORE_DUPS

## +/- 演算子をもとに戻す。
setopt PUSHD_MINUS

これで、以下のコマンドを使えば dirstack を出力できます。 Now use

$ dirs -v

訪れたフォルダに戻るには cd -<NUM> を使ってください。ダッシュ記号の後でオートコンプリートを使ってください。オートコンプリートメニューを使う場合に便利です。

ノート: 2つ以上の zsh セッションを開いていて cd をしようとした場合、両方のセッションが同じファイルに書き込むことで競合が発生するため、これは動作しません。

cdr

cdr により、自動的に管理されるリストを使って現在の作業ディレクトリから以前の作業ディレクトリに移動することができます。cdr は、現在のセッションでセッション間および (デフォルトで) ターミナルエミュレータ間で管理されるファイルにすべてのエントリを保存します。

セットアップの手順は zshcontrib(1) § REMEMBERING RECENT DIRECTORIES を見てください。

zoxide

zoxide は、よりスマートな cd コマンドで、数個のキーストロークで好きな場所に移動できます。zoxide は、頻繁に使用されるディレクトリを記憶し、スコアリングメカニズムを使って、あなたが行きたい場所を推測します。

ヘルプコマンド

Bash とは違い、Zsh は組み込みの help コマンドを有効化しておらず、代わりに run-help を提供しています。デフォルトでは、run-helpman のエイリアスとなっています。コマンドの前に run-help と付けることで実行できますし、または今タイプしたコマンドに対してキーボードショートカット Alt+hEsc h を入力することでも実行できます。

デフォルトでは man のエイリアスとなっているので、外部コマンドに対してしか動作しません。シェルの組み込みコマンドやシェルの他の機能でも動作するようにするには、run-help 関数を使う必要があります。run-help や補助関数については zshcontrib(1) を見てください。

まず、run-help 関数をロードし、その次に既存の run-help エイリアスを削除してください。helprun-help へのエイリアスにすることもできます。例えば、以下を zshrc に追加してください:

autoload -Uz run-help
(( ${+aliases[run-help]} )) && unalias run-help
alias help=run-help

補助関数は別で有効化する必要があります:

autoload -Uz run-help-git run-help-ip run-help-openssl run-help-p4 run-help-sudo run-help-svk run-help-svn

例えば、run-help git commit コマンドは、git(1) ではなく git-commit(1)man ページを開きます。

継続的に rehash する

通常、compinit は $PATH 内の新しい実行ファイルを自動的には見つけません。例えば、新しいパッケージをインストールした後、/usr/bin/ 内に追加された新しいファイルは即座に、または自動的には補完に含まれないでしょう。なので、そのような新しい実行ファイルを補完に含めるには、以下を実行してください:

$ rehash

この 'rehash' は、自動的に実行するよう設定できます。[3] 以下を zshrc に追加するだけです:

~/.zshrc
zstyle ':completion:*' rehash true

必要なときにだけ rehash する

しかし、pacman フックを使って、自動的に rehash を要求するように設定できます。こうすれば、先のセクションのように継続的に rehash してパフォーマンスが劣化してしまうようなことは起こりません。これを有効化するには、/etc/pacman.d/hooks ディレクトリと /var/cache/zsh ディレクトリを作成し、フックファイルを作成してください:

/etc/pacman.d/hooks/zsh.hook
[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = Path
Target = usr/bin/*
[Action]
Depends = zsh
When = PostTransaction
Exec = /usr/bin/install -Dm644 /dev/null /var/cache/zsh/pacman

これは、/var/cache/zsh/pacman ファイルの変更日時を、最後にパッケージをインストール/アップグレード/アンインストールした時間に合わせます。次に、zsh のコマンドキャッシュが古くなったときにコマンドキャッシュを rehash するように設定します。以下を ~/.zshrc に追加してください:

~/.zshrc
zshcache_time="$(date +%s%N)"

autoload -Uz add-zsh-hook

rehash_precmd() {
  if [[ -a /var/cache/zsh/pacman ]]; then
    local paccache_time="$(date -r /var/cache/zsh/pacman +%s%N)"
    if (( zshcache_time < paccache_time )); then
      rehash
      zshcache_time="$paccache_time"
    fi
  fi
}

add-zsh-hook -Uz precmd rehash_precmd

/var/cache/zsh/pacman が更新されるまえに precmd フックがトリガーされた場合、新しいプロンプトが始まるまで補完が効かないかもしれません。そういうときは、空のコマンドを実行すれば良いはずです (例えば、enter を押す)。

SIGUSR1 を使って必要なときにだけ rehash する

フックファイルは以下のようになります。

/etc/pacman.d/hooks/zsh-rehash.hook
[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = Path
Target = usr/bin/*

[Action]
Depends = zsh
Depends = procps-ng
When = PostTransaction
Exec = /usr/bin/pkill zsh --signal=USR1
警告: このフックは、実行中の zsh インスタンスすべてに SIGUSR1 を送信します。注意すべきなのは、SIGUSR1 のデフォルトの挙動は「終了」だということです。なので、このフックを先に設定してしまうと、すべてのユーザの実行中の zsh インスタンス (ログインシェルも含む) のうち以下のトラップを source していないものが、終了してしまいます。
~/.zshrc
TRAPUSR1() { rehash }

この 関数トラップ は、リストトラップ trap 'rehash' USR1 に置き換えることもできます。トラップの種類の違いについては zshmisc(1) § Trap Functions を見てください。

この方法は、すべての zsh インスタンスを即座に rehash します。なので、precmd をトリガーするためにエンターキーを押す必要がありません。

ncurses アプリケーションにキーをバインド

ncurses アプリケーションをキーストロークにバインドしますが、対話を受け入れません。これを動作させるには BUFFER 変数を使用します。次の例では、Alt+\ を使用して ncmpcpp を開くことができます。

~/.zshrc
ncmpcppShow() {
  BUFFER="ncmpcpp"
  zle accept-line
}
zle -N ncmpcppShow
bindkey '^[\' ncmpcppShow

アプリケーションを呼び出す前に、行に入力した内容をすべて保持する別の方法

~/.zshrc
ncmpcppShow() {
  ncmpcpp <$TTY
  zle redisplay
}
zle -N ncmpcppShow
bindkey '^[\' ncmpcppShow

ファイルマネージャー風のキーバインド

グラフィックファイルマネージャで使われているようなキーバインドが便利かもしれません。1つ目はディレクトリ履歴 (Alt+Left) に戻り、2つ目はユーザを親ディレクトリ (Alt+Up) に移動させます。また、ディレクトリの内容も表示されます。

~/.zshrc
cdUndoKey() {
  popd
  zle       reset-prompt
  print
  ls
  zle       reset-prompt
}

cdParentKey() {
  pushd ..
  zle      reset-prompt
  print
  ls
  zle       reset-prompt
}

zle -N                 cdParentKey
zle -N                 cdUndoKey
bindkey '^[[1;3A'      cdParentKey
bindkey '^[[1;3D'      cdUndoKey

xterm のタイトル

あなたのターミナルエミュレータがサポートしていれば、Zsh からターミナルのタイトルを設定できます。これにより、タイトルを動的に変更し、シェルの状態に関する状態 (例えば、ユーザ名とカレントディレクトリや現在実行中のコマンド) を表示できます。

xterm のタイトルは xterm の制御シーケンスオペレーティングシステムコマンドである \e]2;\a\e]2;\e\\ で設定します。例えば:

$ print -n '\e]2;My xterm title\a'

このコマンドは、タイトルを以下に設定します:

My xterm title

タイトルを動的にするシンプルな方法は、precmd フック関数と preexec フック関数でタイトルを設定することです。利用可能なフック関数リストと説明は zshmisc(1) § Hook Functions を見てください。

print -P を使えば、さらに Zsh のプロンプトエスケープも使用できます。

ヒント:
  • タイトルの表示は複数のコマンドに分けることができます。ただし、コマンドは連続していなければなりません。
  • GNU Screen は、xterm のタイトルを hardstatus (%h) に送信します。Screen の文字列エスケープを使いたい場合 (例えば、色を付けたい場合など)、エスケープシーケンス \e_\e\\ を使って hardstatus を設定する必要があります。文字列エスケープを \e]2;\a 内で使用した場合、ターミナルエミュレータは、Screen の文字列エスケープを解釈できないため、タイトルが文字化けしてしまいます。
ノート:
  • 変数を表示するときに print-P オプションは使用しないでください。変数がプロンプトエスケープとしてパースされてしまいます。
  • 変数を表示するときには、パラメータ展開フラグ q を使用してください。変数がエスケープシーケンスとしてパースされないようにするためです。
~/.zshrc
autoload -Uz add-zsh-hook

function xterm_title_precmd () {
	print -Pn -- '\e]2;%n@%m %~\a'
	[[ "$TERM" == 'screen'* ]] && print -Pn -- '\e_\005{g}%n\005{-}@\005{m}%m\005{-} \005{B}%~\005{-}\e\\'
}

function xterm_title_preexec () {
	print -Pn -- '\e]2;%n@%m %~ %# ' && print -n -- "${(q)1}\a"
	[[ "$TERM" == 'screen'* ]] && { print -Pn -- '\e_\005{g}%n\005{-}@\005{m}%m\005{-} \005{B}%~\005{-} %# ' && print -n -- "${(q)1}\e\\"; }
}

if [[ "$TERM" == (Eterm*|alacritty*|aterm*|foot*|gnome*|konsole*|kterm*|putty*|rxvt*|screen*|wezterm*|tmux*|xterm*) ]]; then
	add-zsh-hook -Uz precmd xterm_title_precmd
	add-zsh-hook -Uz preexec xterm_title_preexec
fi

ターミナルエミュレータのタブのタイトル

一部のターミナルエミュレータとマルチプレクサは、タブのタイトルの設定をサポートしています。そのためのエスケープシーケンスはターミナルによります:

ターミナル エスケープシーケンス 説明
GNU Screen \ek\e\\ Screen のウィンドウタイトル (%t)。
Konsole \e]30;\a Konsole のタブタイトル。

シェル環境の検出

シェル環境を検出するテストは、shell environment detection のリポジトリを見てください。これには、ログイン/インタラクティブシェル、Xorg セッション、TTY、SSH セッションの検出も含まれています。

/dev/tcp と等価な ztcp

zsh/net/tcp モジュールを使用してください:

$ zmodload zsh/net/tcp

これで、TCP 接続を確立できます:

$ ztcp example.com 80

詳細は zshmodules(1) § THE_ZSH/NET/TCP_MODULEzshtcpsys(1) で見られます。

コマンドラインに文字があるときにもシェルを終了するショートカット

デフォルトでは、コマンドラインに文字が入力されている場合、Ctrl+d はシェルを終了しません。これを修正するには:

.zshrc
exit_zsh() { exit }
zle -N exit_zsh
bindkey '^D' exit_zsh

pacman -F "command not found" ハンドラー

pacman には、あるファイルを含むパッケージを検索する機能があります。以下の command-not-found ハンドラは、不明なコマンドが実行されたときに、pacman を直接使用してマッチするパッケージを検索します。

~/.zshrc
...
function command_not_found_handler {
    local purple='\e[1;35m' bright='\e[0;1m' green='\e[1;32m' reset='\e[0m'
    printf 'zsh: command not found: %s\n' "$1"
    local entries=(
        ${(f)"$(/usr/bin/pacman -F --machinereadable -- "/usr/bin/$1")"}
    )
    if (( ${#entries[@]} ))
    then
        printf "${bright}$1${reset} may be found in the following packages:\n"
        local pkg
        for entry in "${entries[@]}"
        do
            # (repo package version file)
            local fields=(
                ${(0)entry}
            )
            if [[ "$pkg" != "${fields[2]}" ]]
            then
                printf "${purple}%s/${bright}%s ${green}%s${reset}\n" "${fields[1]}" "${fields[2]}" "${fields[3]}"
            fi
            printf '    /%s\n' "${fields[4]}"
            pkg="${fields[2]}"
        done
    fi
    return 127
}
...
ノート: pacman のファイルデータベースは、通常の同期データベースから分離されており、pacman -Fy を使ってフェッチする必要があります。詳細は pacman#特定のファイルが含まれているパッケージを検索 を見てください。

pkgfile を使う代替としては、#pkgfile の "command not found" ハンドラー を見てください。

キーバインドを使ってバックバッファをクリアする

デフォルトでは、画面をクリアするキーバインドは、ほとんどのターミナルエミュレータでバックバッファ (上にスクロールしないと見えない部分) をクリアしません。この問題の解決策とhしては:

~/.zshrc
...
function clear-screen-and-scrollback() {
    echoti civis >"$TTY"
    printf '%b' '\e[H\e[2J' >"$TTY"
    zle .reset-prompt
    zle -R
    printf '%b' '\e[3J' >"$TTY"
    echoti cnorm >"$TTY"
}

zle -N clear-screen-and-scrollback
bindkey '^L' clear-screen-and-scrollback
...

サードパーティ拡張

設定フレームワーク

ノート: フレームワークは、抽象化と複雑化のレベルを導入します。それらは未定義の挙動をもたらす可能性があり、シェルが壊れた場合、最初の デバッグステップは、プレーンなシェルに戻ることです。
  • oh-my-posh — Oh My Posh は、関数か変数でプロンプト文字列を変更することのできる任意のシェルのためのカスタムプロンプトエンジンです。
https://github.com/JanDeDobbeleer/oh-my-posh || oh-my-poshAUR
  • oh-my-zsh — Zsh の設定を管理するためのコミュニティ運営の人気なフレームワークです。たくさんの便利な関数、ヘルパー、プラグイン、テーマをバンドルしています。
https://github.com/ohmyzsh/ohmyzsh || oh-my-zsh-gitAUR
  • Prezto — Zsh 用の設定フレームワークです。モジュールが同梱されており、適切なデフォルト、エイリアス、関数、オートコンプリート、プロンプトテーマでコマンドラインインターフェイス環境を充実させることができます。
https://github.com/sorin-ionescu/prezto || prezto-gitAUR
  • ZIM — 驚異的なスピードとモジュール式拡張機能の付いた設定フレームワークです。Zim はとても簡単にカスタマイズでき、スピードと機能性を犠牲にせず、モジュールと機能の豊富なセットが付属しています。
https://github.com/zimfw/zimfw || zsh-zim-gitAUR

プラグインマネージャー

  • Antidote — レガシーな Antibody プラグインマネージャの完全な Zsh 実装です。
https://github.com/mattmc3/antidote || zsh-antidoteAUR
  • zinit (以前の名称は "zplugin") — 柔軟な Zsh プラグインマネージャ。クリーンな fpath、レポート、補完管理、ターボモードが付いています。復活しました
https://github.com/zdharma-continuum/zinit || zinit-gitAUR
  • sheldon — 高速で設定可能なシェルプラグインマネージャです。Rust で書かれています。[4]
https://github.com/rossmacarthur/sheldon || sheldon
  • Antigen — Zsh 用のプラグインマネージャ。oh-my-zsh と vundle にインスパイアされました。放棄されています
https://github.com/zsh-users/antigen || antigen-gitAUR
https://github.com/tarjoilija/zgen || zgen-gitAUR
https://github.com/zplug/zplug || zplugAUR

Fish のようなシンタックスハイライトとオートサジェスト

Fish には強力なシェルシンタックスハイライトとオートサジェスト機能があります。これらの機能を zsh で使うには、zsh-syntax-highlightingzsh-autosuggestions をインストールし、提供されたスクリプトの一方または両方を zshrc から source してください:

~/.zshrc
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh

pkgfile の "command not found" ハンドラー

pkgfile には、command_not_found_handler 関数を提供する Zsh スクリプトファイルが含まれています。この関数は、認識されないコマンドが入力されたときに、pkgfile のデータベースを自動的に検索します。

この関数を有効化するには、そのスクリプトを source する必要があります。例えば:

~/.zshrc
source /usr/share/doc/pkgfile/command-not-found.zsh
ノート: pkgfile のデータベースは、この機能を使う前に更新が必要な場合があります。詳細は pkgfile#インストール を見てください。

pacman のネイティブな機能を使う代替は、#pacman -F "command not found" ハンドラー を見てください。

参照

翻訳ステータス: このページは en:Zsh の翻訳バージョンです。最後の翻訳日は 2023-09-19 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。