「Zsh」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
 
(6人の利用者による、間の117版が非表示)
1行目: 1行目:
[[Category:コマンドシェル]]
+
[[Category:コマンドラインシェル]]
[[cs:Zsh]]
 
 
[[de:Zsh]]
 
[[de:Zsh]]
 
[[en:Zsh]]
 
[[en:Zsh]]
 
[[es:Zsh]]
 
[[es:Zsh]]
[[fr:Zsh]]
+
[[fa:Zsh]]
  +
[[pt:Zsh]]
 
[[ru:Zsh]]
 
[[ru:Zsh]]
[[zh-CN:Zsh]]
+
[[zh-hans:Zsh]]
[http://www.zsh.org Zsh] は対話式シェルとしてもスクリプト言語のインタプリタとしても使えるパワフルなシェルです。[[Bash]] と互換性がありながら (デフォルトではありません、{{ic|emulate sh}} を実行した時だけです)、Zsh には多くの利点があります:
+
[https://www.zsh.org/ Zsh] は対話式シェルとしてもスクリプト言語のインタプリタとしても使えるパワフルな[[シェル]]です。POSIX sh と互換性がありながら (デフォルトではありません、{{ic|emulate sh}} を実行した時だけです)、[https://zsh.sourceforge.io/Guide/zshguide06.html タブ補完]の改善や [https://zsh.sourceforge.io/Doc/Release/Expansion.html グロビング]などの利点があります
   
  +
[https://zsh.sourceforge.io/FAQ/zshfaq01.html#l4 Zsh FAQ] には他にも Zsh をあなたのシェルとして使うべき理由が列挙されています。
* 高速
 
* 高度なタブ補完
 
* 高度なグロブ
 
* 高度な行列処理
 
* 完全にカスタマイズ可能
 
 
Zsh FAQ には他にも Zsh をあなたのシェルとして使うべき [http://zsh.sourceforge.net/FAQ/zshfaq01.html#l4 理由] が列挙されています。
 
   
 
== インストール ==
 
== インストール ==
23行目: 17行目:
 
$ echo $SHELL
 
$ echo $SHELL
   
[[公式リポジトリ]]にある {{Pkg|zsh}} パッケージを[[pacman|インストール]]してください。追加の補完定義を使いたい場合は、{{pkg|zsh-completions}} パッケージもインストールします。
+
{{Pkg|zsh}} パッケージを[[インストール]]してください。追加の補完定義を使いたい場合は、{{pkg|zsh-completions}} パッケージもインストールします。
   
 
=== 初期設定 ===
 
=== 初期設定 ===
31行目: 25行目:
 
$ zsh
 
$ zsh
   
基本的な設定を説明する '''zsh-newuser-install''' が表示されるはずです。これをスキップしたい場合、{{ic|q}} を押して下さい。手動で呼び出すには:
+
基本的な設定を説明する ''zsh-newuser-install'' が表示されるはずです。これをスキップしたい場合、{{ic|q}} を押して下さい。表示されない場合は、次のコマンドで手動で呼び出すことができます:
   
$ zsh /usr/share/zsh/functions/Newuser/zsh-newuser-install -f
+
$ autoload -Uz zsh-newuser-install
  +
$ zsh-newuser-install -f
  +
  +
{{Note|あなたのターミナルのサイズが少なくとも 72×15 であることを確認してください。そうでないと ''zsh-newuser-install'' は実行されません。}}
   
 
=== Zsh をデフォルトのシェルにする ===
 
=== Zsh をデフォルトのシェルにする ===
   
シェル {{ic|/etc/shells}} に記載されていれば、{{ic|chsh}} コマンドを使って root 権限なしでデフォルトシェルを変更することができます。[[公式リポジトリ]]から Zshインストールしたのなら、既に {{ic|/etc/shells}} にエントリが作られているはずです
+
シェル {{ic|/usr/bin/zsh}} に変更しくださ。[[コマンドラインシェル#デフォルトシェルを変更する]] をください。
 
現在使っているユーザーのデフォルトシェルを変更するには:
 
 
$ chsh -s $(which zsh)
 
 
{{Note|Zsh をデフォルトシェルとして起動するには、一度ログアウトしてからログインしなおす必要があります。}}
 
 
再ログイン後、Bash とは見た目が異なる Zsh のプロンプトが表示されていることに気づくでしょう。また、次のコマンドを実行することで Zsh が現在のシェルになっていることを確認できます:
 
 
$ echo $SHELL
 
   
 
{{Tip|{{Pkg|bash}} を置き換える場合、{{ic|~/.bashrc}} から {{ic|~/.zshrc}} に (例: プロンプトと[[Bash#エイリアス|エイリアス]]) また {{ic|~/.bash_profile}} から {{ic|~/.zprofile}} に (例: [[ログイン時に X を起動|X Window System を起動するコード]]) にコードを移動するとよいでしょう。}}
 
{{Tip|{{Pkg|bash}} を置き換える場合、{{ic|~/.bashrc}} から {{ic|~/.zshrc}} に (例: プロンプトと[[Bash#エイリアス|エイリアス]]) また {{ic|~/.bash_profile}} から {{ic|~/.zprofile}} に (例: [[ログイン時に X を起動|X Window System を起動するコード]]) にコードを移動するとよいでしょう。}}
   
== 設定ファイル ==
+
== スタートアップ/シャットダウン ファイル ==
   
  +
{{Tip|インタラクティブシェルとログインシェルの説明、およびスタートアップファイルに何を入れるかについては、[https://zsh.sourceforge.io/Guide/zshguide02.html A User's Guide to the Z-Shell] を参照してください。
ログイン時、Zsh は以下のファイルをこの順番で読み込みます:
 
  +
}}
;{{ic|/etc/zsh/zshenv}}:このファイルにはグローバルな[[#$PATH の設定|コマンド検索パス]]やシステム共通の[[環境変数]]を設定するコマンドを記述します。出力を発生させるコマンドや tty に基づいているコマンドを含めてはいけません。
 
;{{ic|~/.zshenv}}:このファイルには[[#$PATH の設定|コマンドの検索パス]]を設定するコマンドや、重要な環境変数を含めます; 出力をするコマンドや tty に基づいているコマンドを含めてはいけません。
 
;{{ic|/etc/zsh/zprofile}}:グローバルな設定ファイルであり、ログイン時に読み込まれます。ログイン時に毎回実行するコマンドを記述するのに使われます。Arch Linux では、初めから {{ic|/etc/profile}} を source する[https://projects.archlinux.org/svntogit/packages.git/tree/trunk/zprofile?h=packages/zsh 一行]が入っています。詳しくは[[#全ユーザー共通の設定ファイル|下]]を参照。
 
;{{ic|/etc/profile}}:このファイルはログイン時に Bourne 互換シェルによって読み込まれます: ログイン時やアプリケーション固有の設定 {{ic|/etc/profile.d/*.sh}}) を設定します。
 
;{{ic|~/.zprofile}}:このファイルは一般的にユーザーのスクリプトを自動で実行するために使われます。
 
;{{ic|/etc/zsh/zshrc}}:グローバルな設定ファイルであり、インタラクティブシェルとして起動した場合に読み込まれます。
 
;{{ic|~/.zshrc}}:これは Zsh のメインの設定ファイルです。
 
;{{ic|/etc/zsh/zlogin}}:グローバルな設定ファイルであり、ログインシェルとして起動した場合に、初期化の最後に読み込まれます。
 
;{{ic|~/.zlogin}}:{{ic|/etc/zsh/zlogin}} と同じ設定ファイルですが、ユーザーごとの設定を記述するところが違います。
 
;{{ic|/etc/zsh/zlogout}}:グローバルな設定ファイルであり、ログインシェルが終了するときに読み込まれます。
 
;{{ic|~/.zlogout}}:{{ic|/etc/zsh/zlogout}} と同じ設定ファイルですが、ユーザーごとの設定を記述するところが違います。
 
   
 
{{Note|
 
{{Note|
  +
* {{ic|$ZDOTDIR}} が設定されていない場合は、代わりに {{ic|$HOME}} が使用されます。
* Arch の {{Pkg|zsh}} パッケージで使われているパスは [[man ページ]]で使われているデフォルトのパスとは異なっています。
 
  +
* {{ic|RCS}} オプションが以下のファイルのどれかで unset された場合、そのファイル以降、設定ファイルは読み込まれません。
* {{ic|$ZDOTDIR}} のデフォルトは {{ic|$HOME}} です。
 
  +
* {{ic|GLOBAL_RCS}} オプションが以下のファイルのどれかで unset された場合、そのファイル以降、グローバルな設定ファイル ({{ic|/etc/zsh/*}}) は読み込まれません。
* {{ic|/etc/profile}} は Zsh のスタートアップファイルの標準リストに含まれていませんが、{{Pkg|zsh}} パッケージに入っている {{ic|/etc/zsh/zprofile}} から読み込まれます。{{ic|/etc/profile}} で {{ic|$PATH}} 変数を設定すると {{ic|~/.zshenv}} に設定した {{ic|$PATH}} 変数を全て上書きしてしまうので注意してください。これを防ぐには、{{ic|/etc/zsh/zprofile}} をあなたの作ったファイルに置き換えるか、{{ic|~/.zshrc}} から {{ic|$PATH}} 変数を設定してください。
 
 
}}
 
}}
   
  +
デフォルトで、Zsh は起動時に以下のファイルを以下の順番で実行します (存在しているもののみ実行されます)。
=== 全ユーザー共通の設定ファイル ===
 
   
  +
* {{ic|/etc/zsh/zshenv}} すべてのユーザに対して[[環境変数]]を設定するために使用されます。このファイルには、出力を行うコマンドや、シェルが TTY に接続されていることを期待するコマンドを含めるべきではありません。このファイルが存在する場合、このファイルは '''''常に''''' 読み込まれます。この挙動を上書きすることはできません。
場合によっては Zsh ユーザー全てに設定を適用させたいときもあると思われます。zsh(1) によれば {{ic|/etc/zshrc}} などグローバルな設定ファイルはいくつか存在します。ただし、これは Arch では少し事情が異なっており、代わりに {{ic|/etc/zsh/}} を使うようにコンパイルされています [https://projects.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/zsh#n34]。
 
  +
* {{ic|$ZDOTDIR/.zshenv}} ユーザの[[環境変数]]を設定するために使用されます。このファイルには、出力を行うコマンドや、シェルが TTY に接続されていることを期待するコマンドを含めるべきではありません。このファイルが存在する場合、このファイルは '''''常に''''' 読み込まれます。
  +
* {{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|$ZDOTDIR/.zprofile}} 起動時にユーザのコマンドを実行するために使用されます。'''''ログインシェル'''''として起動した場合に、このファイルは読み込まれます。通常、グラフィカルセッションを自動起動し、セッションの環境変数を設定するために使用されます。
  +
* {{ic|/etc/zsh/zshrc}} すべてのユーザに対して、インタラクティブシェルを設定したりコマンドを実行したりするために使用されます。'''''インタラクティブシェル'''''として起動した場合に、このファイルは読み込まれます。
  +
* {{ic|$ZDOTDIR/.zshrc}} ユーザのインタラクティブシェルを設定したり、コマンドを実行したりするために使用されます。'''''インタラクティブシェル'''''として起動した場合に、このファイルは読み込まれます。
  +
* {{ic|/etc/zsh/zlogin}} すべてのユーザに対して初期化処理の最後にコマンドを実行するために使用されます。'''''ログインシェル'''''として起動した場合に、このファイルは読み込まれます。
  +
* {{ic|$ZDOTDIR/.zlogin}} 初期化処理の最後にユーザのコマンドを実行するために使用されます。'''''ログインシェル'''''として起動した場合に、このファイルは読み込まれます。通常、コマンドラインユーティリティを自動起動するために使用されます。グラフィカルセッションを自動起動するために使用するべきではありません (この時点では、インタラクティブシェルにおいてのみ意味を持つ設定がセッションに含まれているかもしれないからです)。
  +
* {{ic|$ZDOTDIR/.zlogout}} '''''ログインシェル''''' が '''終了''' する時にコマンドを実行するために使用されます。
  +
* {{ic|/etc/zsh/zlogout}} '''''ログインシェル''''' が '''終了''' する時にすべてのユーザに対してコマンドを実行するために使用されます。
   
  +
[https://blog.flowblok.id.au/2013-02/shell-startup-scripts.html#implementation the graphic representation] を参照してください。
従って、ユーザー共通の設定をしたいときは {{ic|/etc/zshrc}} ではなく {{ic|/etc/zsh/zshrc}} を使って下さい。これは {{ic|/etc/zsh/zshenv}}, {{ic|/etc/zsh/zlogin}}, {{ic|/etc/zsh/zlogout}} でも同じです。これらのファイルはデフォルトではインストールされないので、必要なときに作成してください。
 
   
  +
{{Note|{{ic|$HOME/.profile}} は Zsh のスタートアップファイルの一部ではありません。さらに、Zsh によって '''source されません''' (Zsh が {{ic|sh}} か {{ic|ksh}} として実行され、ログインシェルとして起動しない限り)。sh や [[ksh]] との互換性モードに関する詳細は {{man|1|zsh|COMPATIBILITY}} を見てください。}}
唯一の例外は {{ic|zprofile}} で、これは {{ic|/etc/profile}} を使います。
 
   
  +
{{Warning|{{ic|/etc/zsh/zprofile}} 内にデフォルトで存在する [https://gitlab.archlinux.org/archlinux/packaging/packages/zsh/-/blob/main/zprofile 一行]を削除しないでください。さもないと、{{ic|/etc/profile.d/}} 内へスクリプトを提供するパッケージの整合性が破壊されてしまいます。}}
== ~/.zshrc の設定 ==
 
   
  +
== Zsh の設定 ==
Zsh は何も設定しなくても使うことができますが、あなたが使いたい機能はほとんど設定されていないでしょう。ただし Zsh で利用できるカスタム化の道は険しく、Zsh の設定は困難をきわめ多くの時間を浪費するかもしれません。
 
  +
  +
Zsh は何も設定しなくても使うことができますが、ほとんどのユーザが使いたいと思うようには設定されていないことはほぼ確実です。ただし、Zsh で利用できるカスタマイズの量は膨大で、Zsh を設定するのは大変で時間を浪費する経験となるでしょう。自動的に設定するには [[#サードパーティ拡張]] を見てください。
   
 
=== シンプルな .zshrc ===
 
=== シンプルな .zshrc ===
   
サンプルの設定ファイルが含まれており、Zsh カスタマイズの方法の例だけなくデフォルトオプションのセット提供しています。この設定を使うには {{ic|.zshrc}} という名前ファイル保存してください。ログインしなおさなくても次を実行することで変更を適用できます:
+
下は設定ファイルのサンプルす。デフォルトオプションの適切なセットと共に、Zsh でカスタマイズ可能な方法の例を提供します。この設定を使うには{{ic|.zshrc}} という名前ファイル保存してください。
   
  +
{{Tip|ログアウトせずに変更を適用するには {{ic|source ~/.zshrc}} を実行してください。}}
$ source ~/.zshrc
 
   
以下はシンプルな {{ic|.zshrc}} です、基点としてはピッタリでしょう:
+
これはシンプルな {{ic|.zshrc}} です:
   
 
{{hc|~/.zshrc|
 
{{hc|~/.zshrc|
autoload -U compinit promptinit
+
autoload -Uz compinit promptinit
 
compinit
 
compinit
 
promptinit
 
promptinit
   
  +
# デフォルトのプロンプトを walters テーマに設定する
# This will set the default prompt to the walters theme
 
prompt walters}}
+
prompt walters
  +
}}
  +
  +
プロンプトテーマシステムに関する詳細は [[#プロンプトテーマ]] を見てください。
   
 
=== $PATH の設定 ===
 
=== $PATH の設定 ===
   
zsh でユーザーごとにシステムパス設定する方法についての情報はここにります: http://zsh.sourceforge.net/Guide/zshguide02.html#l24
+
Zsh は {{ic|PATH}} 変数 {{ic|path}} 配列結びけます。、{{ic|path}} 配列を変更するだけで {{ic|PATH}} 変数を操作することができます。詳細は [https://zsh.sourceforge.io/Guide/zshguide02.html#l24 A User's Guide to the Z-Shell] を見てください。
   
以下を {{ic|~/.zshenv}} に追加してください:
+
{{ic|~/.local/bin/}} を {{ic|PATH}} に追加するには:
  +
{{hc|~/.zshenv|
 
  +
{{hc|~/.zshenv|2=
typeset -U path
 
  +
typeset -U path PATH
path=(~/bin /other/things/in/path $path[@])}}
 
  +
path=(~/.local/bin $path)
  +
export PATH
  +
}}
   
 
=== コマンド補完 ===
 
=== コマンド補完 ===
   
Zsh の一番魅力的な機能はおそらく先進的な自動補完機能でしょう。少なくとも{{ic|.zshrc}} で自動補完を有効と思うはずです。自動補完を有効にするには、以下を追加してください:
+
Zsh の一番魅力的な機能はおそらく先進的な自動補完機能でしょう。少なくとも {{ic|.zshrc}} で自動補完を有効てください。自動補完を有効にするには、以下を {{ic|~/.zshrc}} に追加してください:
   
 
{{hc|~/.zshrc|
 
{{hc|~/.zshrc|
autoload -U compinit
+
autoload -Uz compinit
compinit}}
+
compinit
 
この設定は ssh/scp/sftp のホスト名の補完も含んでいますが、この機能を動かすには {{ic|~/.ssh/known_hosts}} で ssh がホスト名をハッシュ化しないようにする必要があります。
 
{{Warning|ハッシュ化を解除すると [http://blog.rootshell.be/2010/11/03/bruteforcing-ssh-known_hosts-files/ "Island-hopping" 攻撃] に無防備になります。そのことを前もって知った上で、次の行をコメントアウトするか値を {{ıc|no}} に設定してください:
 
{{hc|/etc/ssh/ssh_config|
 
#HashKnownHosts yes}}
 
これで {{ic|~/.ssh/known_hosts}} をどこか他のところに移動すれば ssh はハッシュ化されてないホスト名を使って新しいファイルを作成します (以前のホストは消失します)。詳細については、[http://nms.lcs.mit.edu/projects/ssh/README.hashed-hosts hashed-hosts] に関する SSH の readme を見て下さい。
 
 
}}
 
}}
   
  +
上記の設定には ssh/scp/sftp ホスト名の補完が含まれていますが、この機能を動作させるためにはユーザは ssh のホスト名ハッシュ化 (つまり、ssh クライアントの設定の {{ic|HashKnownHosts}} オプション) を有効化してはなりません。
矢印キーのインターフェイスを使って自動補完するには、以下を追加して下さい:
 
  +
{{hc|~/.zshrc|
 
  +
矢印キーを使うインターフェイスで自動補完を行うには、以下を追加してください:
zstyle ':completion:*' menu select}}
 
:''メニューを有効にするには、タブを二度押して下さい。''
 
   
エイリアスでコマンドラインの自動補完を切り替えるには、以下を追加して下さい:
 
 
{{hc|~/.zshrc|
 
{{hc|~/.zshrc|
  +
zstyle ':completion:*' menu select
setopt completealiases}}
 
  +
}}
   
  +
メニューをアクティブにするには、{{ic|Tab}} を2回押してください。
=== "command not found" フック ===
 
   
  +
特権が与えられたコマンドで特権環境の自動補完を有効化するには (例えば、[[sudo]] で始まるコマンドを補完する場合、補完スクリプトは sudo の補完もしようと試みます)、以下を追加してください:
[[Pkgfile#.22Command_not_found.22_フック|Pkgfile/"Command not found" フック]] を見て下さい。
 
   
=== 履歴に同じ行が重複するのを避ける ===
 
 
履歴の重複する行を無視するには、以下を追加して下さい:
 
 
{{hc|~/.zshrc|
 
{{hc|~/.zshrc|
  +
zstyle ':completion::complete:*' gain-privileges 1
setopt HIST_IGNORE_DUPS}}
 
  +
}}
   
  +
{{Warning|これにより、Zsh の補完スクリプトが sudo 特権でコマンドを実行できてしまいます。信頼できない補完スクリプトを使用する場合はこれを有効化すべきではありません。}}
既に作成された重複を履歴から取り除くには、次を実行:
 
$ sort -t ";" -k 2 -u ~/.zsh_history | sort -o ~/.zsh_history
 
   
  +
{{Note|この特殊な種類の文脈依存の補完は、少数のコマンドでしか利用できません。}}
=== ttyctl コマンド ===
 
   
  +
=== キーバインド ===
[http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html#index-tty_002c-freezing] には Zsh の {{ic|ttyctl}} コマンドの説明があります。{{ic|ttyctl}} を使うことでターミナルを "freeze/unfreeze" することができます。ターミナルの状態を変更するプログラムは多数存在しますが、終了時にターミナルの設定を元に戻さないことがあります。手動でターミナルをリセットしなくてもいいようにするには、以下を使います:
 
   
  +
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] を読んでください。
{{hc|~/.zshrc|
 
ttyctl -f}}
 
   
  +
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}} にリストアップされています (アクションとデフォルトのキーバインドの説明付き)。
Zsh は readline を使っていません、代わりに自身のパワフルな zle を使っています。zle は {{ic|/etc/inputrc}} や {{ic|~/.inputrc}} を読みません。
 
  +
zle には [[emacs]] モードと [[vi]] モードがあります。デフォルトでは、{{ic|$EDITOR}} 環境変数から emacs と vi どちらのキーをあなたが使いたいのか考えます。この変数が空の場合、デフォルトは emacs モードです。 {{ic|bindkey -v}} や {{ic|bindkey -e}} でモードを変更することが可能です。
 
  +
Zsh でキーバインドを設定する方法として推奨されるのは、{{man|5|terminfo}} の文字列ケーパビリティを使用することです。例えば [https://web.archive.org/web/20180704181216/http://zshwiki.org/home/zle/bindkeys][https://www.zsh.org/mla/users/2010/msg00065.html]:
   
特殊なキーを動作させるには:
 
 
{{hc|~/.zshrc|2=
 
{{hc|~/.zshrc|2=
  +
# zkbd と互換性のあるハッシュテーブルを作成し、
# create a zkbd compatible hash;
 
  +
# 他のキーをこのハッシュテーブルに追加する (man 5 terminfo を参照)
# to add other keys to this hash, see: man 5 terminfo
 
typeset -A key
+
typeset -g -A key
   
key[Home]=${terminfo[khome]}
+
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]}"
   
  +
# 適宜キーを設定する
key[End]=${terminfo[kend]}
 
  +
[[ -n "${key[Home]}" ]] && bindkey -- "${key[Home]}" beginning-of-line
key[Insert]=${terminfo[kich1]}
 
  +
[[ -n "${key[End]}" ]] && bindkey -- "${key[End]}" end-of-line
key[Delete]=${terminfo[kdch1]}
 
  +
[[ -n "${key[Insert]}" ]] && bindkey -- "${key[Insert]}" overwrite-mode
key[Up]=${terminfo[kcuu1]}
 
  +
[[ -n "${key[Backspace]}" ]] && bindkey -- "${key[Backspace]}" backward-delete-char
key[Down]=${terminfo[kcud1]}
 
  +
[[ -n "${key[Delete]}" ]] && bindkey -- "${key[Delete]}" delete-char
key[Left]=${terminfo[kcub1]}
 
  +
[[ -n "${key[Up]}" ]] && bindkey -- "${key[Up]}" up-line-or-history
key[Right]=${terminfo[kcuf1]}
 
  +
[[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-history
key[PageUp]=${terminfo[kpp]}
 
  +
[[ -n "${key[Left]}" ]] && bindkey -- "${key[Left]}" backward-char
key[PageDown]=${terminfo[knp]}
 
  +
[[ -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 がアクティブのときにターミナルがアプリケーションモードになるようにする。
# setup key accordingly
 
  +
# そのときにだけ、$terminfo の値が有効になる。
[[ -n "${key[Home]}" ]] && bindkey "${key[Home]}" beginning-of-line
 
[[ -n "${key[End]}" ]] && bindkey "${key[End]}" end-of-line
+
if (( ${+terminfo[smkx]} && ${+terminfo[rmkx]} )); then
  +
autoload -Uz add-zle-hook-widget
[[ -n "${key[Insert]}" ]] && bindkey "${key[Insert]}" overwrite-mode
 
  +
function zle_application_mode_start { echoti smkx }
[[ -n "${key[Delete]}" ]] && bindkey "${key[Delete]}" delete-char
 
  +
function zle_application_mode_stop { echoti rmkx }
[[ -n "${key[Up]}" ]] && bindkey "${key[Up]}" up-line-or-history
 
  +
add-zle-hook-widget -Uz zle-line-init zle_application_mode_start
[[ -n "${key[Down]}" ]] && bindkey "${key[Down]}" down-line-or-history
 
  +
add-zle-hook-widget -Uz zle-line-finish zle_application_mode_stop
[[ -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
 
 
# Finally, make sure the terminal is in application mode, when zle is
 
# active. Only then are the values from $terminfo valid.
 
if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then
 
function zle-line-init () {
 
printf '%s' "${terminfo[smkx]}"
 
}
 
function zle-line-finish () {
 
printf '%s' "${terminfo[rmkx]}"
 
}
 
zle -N zle-line-init
 
zle -N zle-line-finish
 
 
fi
 
fi
 
}}
 
}}
   
  +
==== 履歴検索 ====
{{Note|To get the proper sequences for certain key combinations, start {{ic|cat}} or {{ic|read}} without any parameters and press them; they should then be printed in the terminal. Both can be closed again via {{ic|Ctrl+c}}.}}
 
   
  +
以下の手順を使うには、{{ic|key}} 配列を設定し、ZLE がアプリケーションモードとなるようにする必要があります。[[#キーバインド]] を見てください。
==== terminfo を使わない方法 ====
 
   
  +
履歴検索を有効化するには、以下を {{ic|.zshrc}} ファイルに追加してください:
{{ic|autoload zkbd}} を実行してから {{ic|zkbd}} を実行して下さい。キーを押せない場合は (例: {{ic|F11}} はウィンドウを最大化します)、スペースを押してスキップして下さい。zkbd が完了した後、以下を {{ic|~/.zshrc}} に追加して下さい:
 
   
{{hc|~/.zshrc|autoload zkbd
+
{{hc|~/.zshrc|
  +
autoload -Uz up-line-or-beginning-search down-line-or-beginning-search
source ~/.zkbd/$TERM-:0.0 # may be different - check where zkbd saved yours
 
  +
zle -N up-line-or-beginning-search
  +
zle -N down-line-or-beginning-search
   
[[ -n ${key[Backspace]} ]] && bindkey "${key[Backspace]}" backward-delete-char
+
[[ -n "${key[Up]}" ]] && bindkey -- "${key[Up]}" up-line-or-beginning-search
[[ -n ${key[Insert]} ]] && bindkey "${key[Insert]}" overwrite-mode
+
[[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-beginning-search
[[ -n ${key[Home]} ]] && bindkey "${key[Home]}" beginning-of-line
 
[[ -n ${key[PageUp]} ]] && bindkey "${key[PageUp]}" up-line-or-history
 
[[ -n ${key[Delete]} ]] && bindkey "${key[Delete]}" delete-char
 
[[ -n ${key[End]} ]] && bindkey "${key[End]}" end-of-line
 
[[ -n ${key[PageDown]} ]] && bindkey "${key[PageDown]}" down-line-or-history
 
[[ -n ${key[Up]} ]] && bindkey "${key[Up]}" up-line-or-search
 
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
 
[[ -n ${key[Down]} ]] && bindkey "${key[Down]}" down-line-or-search
 
[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
 
 
}}
 
}}
   
  +
これにより、{{ic|Up}} か {{ic|Down}} を押したときに、現在の行のカーソル位置までにマッチする過去のコマンドだけが表示されます。
==== ncurses アプリケーションのキーバインド ====
 
   
  +
==== 修飾キー Shift、Alt、Ctrl、Meta ====
ncurses アプリケーションをキーストロークにバインドすることが可能ですが、対話はできません。{{ic|BUFFER}} 変数を使って動作させて下さい。以下の例は {{ic|Alt+\}} で ncmpcpp を開きます:
 
{{hc|~/.zshrc|2=
 
ncmpcppShow() { BUFFER="ncmpcpp"; zle accept-line; }
 
zle -N ncmpcppShow
 
bindkey '^[\' ncmpcppShow
 
}}
 
   
  +
xterm 互換端末は {{man|5|user_caps}} からの拡張キー定義を使うことができます。キー定義は、{{ic|Shift}}、{{ic|Alt}}、{{ic|Ctrl}}、{{ic|Meta}} と、{{ic|Up}}、{{ic|Down}}、{{ic|Left}}、{{ic|Right}}、{{ic|PageUp}}、{{ic|PageDown}}、{{ic|Home}}、{{ic|End}}、{{ic|Del}} のどれかを組み合わせたものです。修飾キーとキーの組み合わせに推奨される名前の一覧については、[https://sourceforge.net/p/zsh/code/ci/master/tree/Functions/Misc/zkbd zkbd のソース] を参照してください。
=== 履歴検索 ===
 
   
  +
たとえば、 {{ic|Ctrl+Left}} で前の単語の先頭に移動し、{{ic|Ctrl+Right}} で次の単語の先頭に移動させるには:
以下の行を .zshrc に追加して下さい:
 
   
{{hc|~/.zshrc|<nowiki>
+
{{hc|~/.zshrc|2=
  +
key[Control-Left]="${terminfo[kLFT5]}"
[[ -n "${key[PageUp]}" ]] && bindkey "${key[PageUp]}" history-beginning-search-backward
 
  +
key[Control-Right]="${terminfo[kRIT5]}"
[[ -n "${key[PageDown]}" ]] && bindkey "${key[PageDown]}" history-beginning-search-forward
 
</nowiki>}}
 
   
  +
[[ -n "${key[Control-Left]}" ]] && bindkey -- "${key[Control-Left]}" backward-word
これを設定すると、現在の入力で始まる過去のコマンドだけが表示されるようになります。
 
  +
[[ -n "${key[Control-Right]}" ]] && bindkey -- "${key[Control-Right]}" forward-word
  +
}}
   
 
=== プロンプト ===
 
=== プロンプト ===
   
Zsh 手軽にカラープロンプトを設定する方法があます。{{ic|.zshrc}} でプロンプトが自動ロードされるように設定してください。以下の行追加すること自動ロードされます:
+
Zsh は2つの選択肢を提供します: プロンプトテーマ使用するか、テーマに不満がある (たは、テーマの使いやさを自分拡張したい) ユーザはカスタムのプロンプトを構築ます
  +
  +
==== プロンプトテーマ ====
  +
  +
プロンプトテーマは、Zsh で色付きのプロンプトを設定するための手っ取り早く簡単な方法です。プロンプトテーマや、プロンプトテーマを自分で記述する方法については {{man|1|zshcontrib|PROMPT THEMES}} を参照してください。
  +
  +
テーマを使用するには、プロンプトテーマシステムが自動でロードされるように {{ic|.zshrc}} で設定されていることを確認してください。自動ロードを行うには、以下の行を追加します:
   
 
{{hc|~/.zshrc|
 
{{hc|~/.zshrc|
autoload -U promptinit
+
autoload -Uz promptinit
 
promptinit
 
promptinit
 
}}
 
}}
   
のコマンドを実行することで利用可能なプロンプトを見ることができます:
+
以下のコマンドで利用可能なプロンプトテーマリストアップできます:
  +
 
 
$ prompt -l
 
$ prompt -l
   
  +
例えば、{{ic|walters}} テーマを使うには:
表示されたコマンドの一つを試すには、prompt コマンドの後に使いたいプロンプトの名前を加えて下さい。例えば、{{ic|walters}} プロンプトを使うには、次のように入力します:
 
   
 
$ prompt walters
 
$ prompt walters
   
全ての利用可能なテーマをプレビューするには次のコマンドを使って下さい:
+
利用可能なテーマをすべてプレビューするには:
   
 
$ prompt -p
 
$ prompt -p
   
=== プロンプトのカスタマイ ===
+
===== プロンプトテーを手動でンストールする =====
  +
  +
外部の設定管理ツールを使わずに、テーマを手動でインストールすることもできます。ローカルにインストールする場合、まずフォルダを作成し、そのフォルダのパスを {{ic|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
  +
  +
すべてが機能する場合は、{{ic|.zshrc}} を適宜編集することができます。
  +
  +
===== テーマごとにファイルを分けずにプロンプトテーマを追加する =====
  +
  +
プロンプトテーマは、テーマのファイルを使って追加するだけでなく、ある1つのファイル (例えば {{ic|.zshrc}}) 内からテーマを追加することもできます。例えば:
  +
  +
{{hc|~/.zshrc|2=
  +
# promptinit をロードする
  +
autoload -Uz promptinit && promptinit
  +
  +
# テーマを定義する
  +
prompt_mytheme_setup() {
  +
PS1="%~%# "
  +
}
  +
  +
# promptsys にそのテーマを追加する
  +
prompt_themes+=( mytheme )
  +
  +
# テーマをロードする
  +
prompt mytheme
  +
}}
  +
  +
==== プロンプトのカスタマイズ ====
  +
  +
すべてのシェルで一般的な主要な左側のプロンプト {{ic|PS1}} ({{ic|PROMPT}}、{{ic|prompt}}) に加えて、Zsh では右側のプロンプト {{ic|RPS1}} ({{ic|RPROMPT}}) もサポートしています。これら2つの変数は、好きな値にカスタムできます。
  +
  +
他の特殊な目的のためのプロンプト ({{ic|PS2}} ({{ic|PROMPT2}})、{{ic|PS3}} ({{ic|PROMPT3}})、{{ic|PS4}} ({{ic|PROMPT4}})、{{ic|RPS1}} ({{ic|RPROMPT}})、{{ic|RPS2}} ({{ic|RPROMPT2}})、{{ic|SPROMPT}} など) は {{man|1|zshparam|PARAMETERS USED BY THE SHELL}} で説明されています。
  +
  +
すべてのプロンプトは、プロンプトエスケープでカスタマイズできます (例えば、{{ic|%n}} はユーザ名になります)。利用可能なプロンプトエスケープは {{man|1|zshmisc|EXPANSION OF PROMPT SEQUENCES}} でリストアップされています。
  +
  +
===== 色 =====
  +
  +
Zsh は、[[Bash/プロンプトのカスタマイズ|Bash]] とは異なる方法で色を設定します。ANSI エスケープシーケンスや、{{man|5|terminfo}} のターミナルケーパビリティを多用する必要はありません。Zsh は、前景色、背景色、他の視覚エフェクトを設定するための便利なプロンプトエスケープを提供します。エスケープのリストや説明は {{man|1|zshmisc|Visual effects}} を見てください。
   
  +
[https://zsh.sourceforge.io/FAQ/zshfaq03.html#l42 色]を指定する方法は3つあります: 10進数の整数、8つの広くサポートされている色の名前、# のあとに16進数の RGB トリプレット。詳細は {{man|1|zshzle|CHARACTER HIGHLIGHTING}} 内の fg=colour の説明を見てください。
上述のプロンプトに満足がいかない(もしくはプロンプトを拡張したい)場合、Zsh にはカスタムプロンプトを作る機能が備わっています。全てのシェルに共通な左側だけのプロンプトに加え、Zsh は左右両側を使うプロンプトをサポートしています。{{ic|1=PROMPT=}} と以下の変数を使うことでプロンプトをカスタマイズできます:
 
   
  +
ほとんどのターミナルは以下の色を名前でサポートしています:
==== プロンプト変数 ====
 
   
 
{| class="wikitable"
 
{| class="wikitable"
! scope="col" width="10%"| コマンド || !scope="col" width="60%"|説明 || !scope="col" width="30%"|コメント
 
 
|-
 
|-
  +
! 名前 !! 番号
! colspan="3" | 一般
 
 
|-
 
|-
|{{ic|%n}} || ユーザー名
+
| {{ic|black}} || {{ic|0}}
 
|-
 
|-
  +
| {{ic|red}} || {{ic|1}}
|{{ic|%m}} || コンピュータのホスト名 (ドットの前の部分まで)
 
 
|-
 
|-
|{{ic|%M}} || コンピュータのホスト名
+
| {{ic|green}} || {{ic|2}}
 
|-
 
|-
|{{ic|%l}} || 現在の tty
+
| {{ic|yellow}} || {{ic|3}}
 
|-
 
|-
  +
| {{ic|blue}} || {{ic|4}}
|{{ic|%?}} || 最後に実行したアプリケーションのリターンコード
 
 
|-
 
|-
  +
| {{ic|magenta}} || {{ic|5}}
|{{ic|%#}} || ユーザー特権によるプロンプト (root なら {{ic|#}} その他なら {{ic|%}})
 
 
|-
 
|-
  +
| {{ic|cyan}} || {{ic|6}}
! colspan="3" | 時間
 
 
|-
 
|-
| {{ic|%T}}|| システム時刻 (HH:MM)
+
| {{ic|white}} || {{ic|7}}
|-
 
| {{ic|%*}}|| システム時刻 (HH:MM:SS)
 
|-
 
| {{ic|%D}}|| システム日付 (YY-MM-DD)
 
|-
 
! colspan="3" | ディレクトリ
 
|-
 
| {{ic|%d}} || カレントディレクトリ。
 
| rowspan="2" | 数字を前に付けることでパスの一部だけを表示することが可能です。例えば {{ic|%1d}} と入力した場合、{{ic|/usr/bin}} にいるときは {{ic|bin}} と表示されます。負の値も使えます: {{ic|%-1d}} は上の例だと {{ic|/}} と表示されます。
 
|-
 
| {{ic|%~}}|| カレントディレクトリ。{{ic|$HOME}} やそのサブディレクトリにいる場合、{{ic|$HOME}} の部分は {{ic|~}} に置き換えられます。
 
|-
 
! colspan="3" | 整形
 
|-
 
| {{ic|%U [...] %u}} || 下線表示の始まりと終わり
 
|-
 
| {{ic|%B [...] %b}} || 太字表示の始まりと終わり
 
|-
 
| {{ic|<nowiki>%{ [...] %}</nowiki>}} || 表示されない領域。色の設定をするときに使います。このタグによって Zsh はタグの中にあるものを全て無視します。使用しないとプロンプトの縁やインデントに妙な影響が出ることがあります。
 
|-
 
! colspan="3" | カラー
 
|-
 
| {{ic|$fg[color]}}||文字色を設定します (red, green, blue など - 太字デフォルト)。
 
| rowspan="4" | Zsh は [[Bash カラープロンプト|Bash]] とは違ったふうに色を設定します。色を使うには {{ic|.zshrc}} で {{ic|1=PROMPT=}} の前に {{ic|autoload -U colors && colors}} を追加してください。通常、カーソルが動かないように色の設定は {{ic|%{ [...] %} }} の中に記述します。
 
|-
 
| {{ic|$fg_no_bold[color]}}|| 太字でない文字色を設定します。
 
|-
 
| {{ic|$fg_bold[color]}}|| 太字の文字色を設定します。
 
|-
 
| {{ic|$reset_color}}|| 文字色をデフォルトの色に戻します。
 
 
|}
 
|}
   
  +
xterm 256 color と互換性のあるターミナルエミュレータの色番号 0 から 255 は、[https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg xterm-256color チャート]で見られます。
{| class="wikitable"
 
|-
 
! colspan="2" | 利用できるカラー
 
|-
 
| {{ic|black}} または {{ic|0}} || {{ic|red}} または {{ic|1}}
 
|-
 
| {{ic|green}} または {{ic|2}} || {{ic|yellow}} または {{ic|3}}
 
|-
 
| {{ic|blue}} または {{ic|4}} || {{ic|magenta}} または {{ic|5}}
 
|-
 
| {{ic|cyan}} または {{ic|6}} || {{ic|white}} または {{ic|7}}
 
|}
 
   
  +
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|太字の文字色は通常の文字色と必ずしも同じ色になるわけではありません。例えば、{{ic|$fg['yellow']}} は褐色や濃黄のようになりますが、{{ic|$fg_bold['yellow']}} はやや明るい普通の黄色のようになります。}}
 
   
  +
{{Note|
==== サンプル ====
 
  +
* 0 から 15 の色は、ターミナルエミュレータやカラースキームごとに異なる場合があります。
  +
* 多くのターミナルエミュレータは、太文字を明るい色で表示します。
  +
}}
   
  +
{{Tip|
以下のようにすることで左右両側にプロンプトを表示できます:
 
  +
* プロンプトのエスケープは {{ic|print -P ''"prompt escapes"''}} コマンドでテストできます。例えば、{{bc|$ print -P '%B%F{red}co%F{green}lo%F{blue}rs%f%b'}}
PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg_no_bold[yellow]%}%1~ %{$reset_color%}%#"
 
  +
* 24 ビットカラーを使用する場合、24 ビットカラーをサポートしていないターミナルでは {{ic|zsh/nearcolor}} モジュールをロードする必要があるかもしれません。例えば: {{bc|<nowiki>[[ "$COLORTERM" == (24bit|truecolor) || "${terminfo[colors]}" -eq '16777216' ]] || zmodload zsh/nearcolor</nowiki>}} {{ic|zsh/nearcolor}} モジュールに関する詳細は {{man|1|zshmodules|THE ZSH/NEARCOLOR MODULE}} を見てください。
RPROMPT="[%{$fg_no_bold[yellow]%}%?%{$reset_color%}]"
 
  +
}}
   
  +
===== 例 =====
次のようになります (色は省略):
 
username@host ~ % [0]
 
   
  +
これは、シンプルな色無しのプロンプトの例です:
=== ディレクトリスタック ===
 
   
  +
PROMPT='%n@%m %~ %# '
Zsh を設定して DIRSTACKSIZE 最後に訪れたフォルダを覚えさせることが可能です。これにより素早く ''cd'' することができます。設定ファイルにいくつか設定を加える必要があります:
 
   
  +
以下のように出力されます:
{{hc|.zshrc|<nowiki>
 
  +
DIRSTACKFILE="$HOME/.cache/zsh/dirs"
 
  +
<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>
if [[ -f $DIRSTACKFILE ]] && [[ $#dirstack -eq 0 ]]; then
 
  +
dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
 
  +
これは、色付きの左右両方のプロンプトの例です:
[[ -d $dirstack[1] ]] && cd $dirstack[1]
 
  +
  +
PROMPT='%F{green}%n%f@%F{magenta}%m%f %F{blue}%B%~%b%f %# '
  +
RPROMPT='[%F{yellow}%?%f]'
  +
  +
以下のように出力されます:
  +
  +
<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進数のカラーコードを使うことで使用できます:
  +
  +
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 ファイル ===
  +
  +
* [https://www.archlinux.jp/download/ 月次 ISO リリース] (デフォルトで Zsh を使用します) と同じセットアップにするには、{{Pkg|grml-zsh-config}} をインストールしてください。これには、[https://grml.org/zsh/ grml] の多くの調整と高度な最適化が含まれています。
  +
* https://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc - ベーシックなセットアップ。動的なプロンプトとウィンドウのタイトル/hardinfo。
  +
* https://github.com/slashbeast/conf-mgmt/blob/master/roles/home_files/files/DOTzshrc - 複数の機能を持つ zshrc。コメントをチェックしてください。特出すべき機能: ユーザーが電源オフ・再起動・ハイバネートをすることを尋ねる関数、プロンプトの GIT サポート (vcsinfo を使わずに実現)、メニューの付いたタブ補完、実行中のコマンドをウィンドウのタイトルバーに表示など。
  +
  +
さらに見たい場合は [[ドットファイル#ユーザーリポジトリ]] を見てください。
  +
  +
== ヒントとテクニック ==
  +
  +
=== ログイン時に X を自動起動 ===
  +
  +
[[xinit#ログイン時に X を自動起動]]を参照してください。
  +
  +
=== プログラムが異常終了した後、端末の設定を復元する ===
  +
  +
多くのプログラムはターミナルの状態を変更し、異常終了したときにターミナルの設定を復元しないことがあります (例えば、クラッシュしたときや、SIGINT を受け取ったとき)。
  +
  +
通常、これは {{man|1|reset}} を実行することで解決できます:
  +
  +
$ reset
  +
  +
以下のセクションでは、手動でターミナルをリセットする手間を省く方法について説明します。
  +
  +
==== ttyctl コマンド ====
  +
  +
[https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html#index-tty_002c-freezing ttyctl] コマンドを使ってターミナルを "freeze/unfreeze" することができます。起動時にインタラクティブシェルを freeze させるには、以下を使用してください:
  +
  +
{{hc|~/.zshrc|
  +
ttyctl -f
  +
}}
  +
  +
==== エスケープシーケンスで端末をリセットする ====
  +
  +
[https://www.in-ulm.de/~mascheck/various/alternate_charset/ 代替の線画文字セット]は、ttyctl が防ぐことができない方法でターミナルを台無しにしてしまうことがあります。
  +
  +
シンプルな解決法は、ターミナルをリセットするエスケープシーケンスを {{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=
  +
  +
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'' することができます。設定ファイルにいくつかの行を追加する必要があります:
  +
  +
{{hc|~/.zshrc|<nowiki>
  +
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
 
fi
chpwd() {
+
chpwd_dirstack() {
print -l $PWD ${(u)dirstack} >$DIRSTACKFILE
+
print -l -- "$PWD" "${(u)dirstack[@]}" > "$DIRSTACKFILE"
 
}
 
}
  +
add-zsh-hook -Uz chpwd chpwd_dirstack
   
DIRSTACKSIZE=20
+
DIRSTACKSIZE='20'
   
setopt autopushd pushdsilent pushdtohome
+
setopt AUTO_PUSHD PUSHD_SILENT PUSHD_TO_HOME
   
  +
## 重複するエントリを削除する
## Remove duplicate entries
 
setopt pushdignoredups
+
setopt PUSHD_IGNORE_DUPS
   
  +
## +/- 演算子をもとに戻す。
## This reverts the +/- operators.
 
setopt pushdminus
+
setopt PUSHD_MINUS
 
</nowiki>}}
 
</nowiki>}}
   
のコマンドでディレクトリスタック表示できます:
+
これで、以下のコマンドを使えば dirstack を出力できます
  +
Now use
dirs -v
 
{{ic|cd -<NUM>}} で訪問済みのフォルダに戻ります。ダッシュの後は自動補完が利用できます。自動補完メニューを使っている場合はとても役に立ちます。
 
   
  +
$ dirs -v
{{Note|''zsh'' セッションを複数開いている場合、{{ic|cd}} しようとしても、両方のセッションによって同一のファイルに書き込む衝突が発生するため機能しません。}}
 
  +
  +
訪れたフォルダに戻るには {{ic|cd -<NUM>}} を使ってください。ダッシュ記号の後でオートコンプリートを使ってください。オートコンプリートメニューを使う場合に便利です。
  +
  +
{{Note|2つ以上の ''zsh'' セッションを開いていて {{ic|cd}} をしようとした場合、両方のセッションが同じファイルに書き込むことで競合が発生するため、これは動作しません。}}
  +
  +
==== cdr ====
  +
  +
cdr により、自動的に管理されるリストを使って現在の作業ディレクトリから以前の作業ディレクトリに移動することができます。cdr は、現在のセッションでセッション間および (デフォルトで) ターミナルエミュレータ間で管理されるファイルにすべてのエントリを保存します。
  +
  +
セットアップの手順は {{man|1|zshcontrib|REMEMBERING RECENT DIRECTORIES}} を見てください。
  +
  +
==== zoxide ====
  +
  +
{{Pkg|zoxide}} は、よりスマートな ''cd'' コマンドで、数個のキーストロークで好きな場所に移動できます。zoxide は、頻繁に使用されるディレクトリを記憶し、スコアリングメカニズムを使って、あなたが行きたい場所を推測します。
   
 
=== ヘルプコマンド ===
 
=== ヘルプコマンド ===
[[bash]] とは違って、''zsh'' は組み込まれている {{ic|help}} コマンドを有効にしていません。zsh で {{ic|help}} を使うには、以下を {{ic|zshrc}} に追加してください:
 
   
  +
[[Bash]] とは違い、Zsh は組み込みの {{ic|help}} コマンドを有効化しておらず、代わりに {{ic|run-help}} を提供しています。デフォルトでは、{{ic|run-help}} は {{ic|man}} のエイリアスとなっています。コマンドの前に {{ic|run-help}} と付けることで実行できますし、または今タイプしたコマンドに対してキーボードショートカット {{ic|Alt+h}} か {{ic|Esc}} {{ic|h}} を入力することでも実行できます。
{{bc|1=
 
  +
autoload -U run-help
 
  +
デフォルトでは [[man]] のエイリアスとなっているので、外部コマンドに対してしか動作しません。シェルの組み込みコマンドやシェルの他の機能でも動作するようにするには、{{ic|run-help}} 関数を使う必要があります。{{ic|run-help}} や補助関数については {{man|1|zshcontrib}} を見てください。
autoload run-help-git
 
  +
autoload run-help-svn
 
  +
まず、{{ic|run-help}} 関数をロードし、その次に既存の {{ic|run-help}} エイリアスを削除してください。{{ic|help}} は {{ic|run-help}} へのエイリアスにすることもできます。例えば、以下を {{ic|zshrc}} に追加してください:
autoload run-help-svk
 
  +
unalias run-help
 
alias help=run-help
+
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
  +
  +
例えば、{{ic|run-help git commit}} コマンドは、{{man|1|git}} ではなく {{man|1|git-commit}} の [[man ページ]]を開きます。
  +
  +
=== 継続的に rehash する ===
  +
  +
通常、compinit は {{ic|$PATH}} 内の新しい実行ファイルを自動的には見つけません。例えば、新しいパッケージをインストールした後、{{ic|/usr/bin/}} 内に追加された新しいファイルは即座に、または自動的には補完に含まれないでしょう。なので、そのような新しい実行ファイルを補完に含めるには、以下を実行してください:
  +
  +
$ rehash
  +
  +
この 'rehash' は、自動的に実行するよう設定できます。[https://github.com/robbyrussell/oh-my-zsh/issues/3440] 以下を {{ic|zshrc}} に追加するだけです:
  +
  +
{{hc|~/.zshrc|
  +
zstyle ':completion:*' rehash true
 
}}
 
}}
   
  +
==== 必要なときにだけ rehash する ====
=== Fish のようなシンタックスハイライト ===
 
   
  +
しかし、[[pacman フック]]を使って、自動的に {{ic|rehash}} を要求するように設定できます。こうすれば、先のセクションのように継続的に rehash してパフォーマンスが劣化してしまうようなことは起こりません。これを有効化するには、{{ic|/etc/pacman.d/hooks}} ディレクトリと {{ic|/var/cache/zsh}} ディレクトリを作成し、フックファイルを作成してください:
[[Fish]] には強力なシェルシンタックスハイライトがあります。これを zsh で使うには、公式リポジトリから {{pkg|zsh-syntax-highlighting}} をインストールして以下を zshrc に追加します:
 
  +
{{bc|
 
  +
{{hc|head=/etc/pacman.d/hooks/zsh.hook|output=
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
 
  +
[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}} に追加してください:
=== サンプル .zshrc ファイル ===
 
   
  +
{{hc|~/.zshrc|<nowiki>
以下は {{ic|.zshrc}} ファイルのリストです。自由に自分のファイルを追加してください:
 
  +
zshcache_time="$(date +%s%N)"
   
  +
autoload -Uz add-zsh-hook
* 公式リポジトリにある {{Pkg|grml-zsh-config}} パッケージは http://grml.org/zsh から取られて来たもので Zshell の多数の調整が含まれた zshrc ファイルが入っています。これは[https://www.archlinux.org/download/ 毎月リリースされている ISO] のデフォルト設定です。
 
* 動的なプロンプトとウィンドウタイトル、hardinfo を使う、基本セットアップ => http://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc
 
* https://github.com/slashbeast/things/blob/master/configs/DOTzshrc - 複数の機能を有効にした zshrc、コメントを見て下さい。特徴: ユーザーが電源オフ・再起動・ハイバネートをすることを確認する関数、プロンプトの GIT サポート (vcsinfo を使わずに実現)、メニューの付いたタブ補完、実行中のコマンドをウィンドウのタイトルバーに表示など。
 
   
  +
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
* [https://github.com/robbyrussell/oh-my-zsh oh-my-zsh] は Zsh の設定を管理するための、人気のあるコミュニティドリブンなフレームワークです。便利な関数、ヘルパー、プラグイン、テーマが山ほどバンドルされています。
 
  +
</nowiki>}}
* [https://github.com/sorin-ionescu/prezto Prezto - Instantly Awesome Zsh] (AUR の {{AUR|prezto-git}} でインストール可能) は Zsh の設定フレームワークです。デフォルトでリッチなコマンドラインインターフェース環境を構築するモジュール・エイリアス・関数・自動補完・プロンプトテーマが付いています。
 
* [https://github.com/zsh-users/antigen Antigen] (AUR の {{AUR|antigen-git}} でインストール可能) - zsh のプラグインマネージャ。oh-my-zsh と vundle の影響を受けています。
 
   
  +
{{ic|/var/cache/zsh/pacman}} が更新されるまえに {{ic|precmd}} フックがトリガーされた場合、新しいプロンプトが始まるまで補完が効かないかもしれません。そういうときは、空のコマンドを実行すれば良いはずです (例えば、{{ic|enter}} を押す)。
=== アプリケーションの自動起動 ===
 
   
  +
==== SIGUSR1 を使って必要なときにだけ rehash する ====
Zsh はいつでも {{ic|/etc/zsh/zshenv}} と {{ic|$ZDOTDIR/.zshenv}} を実行します。なのでこれらのファイルをあまり肥大化させないでください。
 
   
  +
フックファイルは以下のようになります。
シェルがログインシェルの場合、{{ic|/etc/profile}} そして {{ic|$ZDOTDIR/.zprofile}} からコマンドが読み込まれます。次に、シェルがインタラクティブの場合、{{ic|/etc/zsh/zshrc}} さらに {{ic|$ZDOTDIR/.zshrc}} からコマンドが読み込まれます。最後に、シェルがログインシェルの場合、{{ic|/etc/zsh/zlogin}} ついで {{ic|$ZDOTDIR/.zlogin}} が読み込まれます。
 
   
  +
{{hc|/etc/pacman.d/hooks/zsh-rehash.hook|output=
{{ic|man zsh}} の ''STARTUP/SHUTDOWN FILES'' セクションも参照してください。
 
  +
[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
  +
}}
   
  +
{{Warning|このフックは、実行中の {{ic|zsh}} インスタンスすべてに SIGUSR1 を送信します。注意すべきなのは、SIGUSR1 のデフォルトの挙動は「終了」だということです。なので、このフックを先に設定してしまうと、すべてのユーザの実行中の {{ic|zsh}} インスタンス (ログインシェルも含む) のうち以下のトラップを source していないものが、終了してしまいます。}}
Zsh があなたに合わないと感じて Bash に戻りたいときは、Zsh パッケージを削除する前に必ず、まずデフォルトシェルを変更して下さい。
 
   
  +
{{hc|~/.zshrc|
{{Warning|Failure to follow the below procedures will result in all kinds of problems: users will no longer have a working shell program.}}
 
  +
TRAPUSR1() { rehash }
  +
}}
   
  +
この ''関数トラップ'' は、''リストトラップ'' {{ic|trap 'rehash' USR1}} に置き換えることもできます。トラップの種類の違いについては {{man|1|zshmisc|Trap Functions}} を見てください。
ターミナルで次のコマンドを root で実行して下さい:
 
# chsh -s /bin/bash user
 
Zsh を使っている全てのユーザーで実行して下さい。
 
   
  +
この方法は、すべての {{ic|zsh}} インスタンスを即座に {{ic|rehash}} します。なので、{{ic|precmd}} をトリガーするためにエンターキーを押す必要がありません。
これで安全に Zsh パッケージを削除することができます。
 
   
  +
=== ncurses アプリケーションにキーをバインド ===
以上を行わなかった場合、root で {{ic|/etc/passwd}} を編集することで Bash にデフォルトシェルを戻すことができます。
 
   
  +
ncurses アプリケーションをキーストロークにバインドしますが、対話を受け入れません。これを動作させるには {{ic|BUFFER}} 変数を使用します。次の例では、{{ic|Alt+\}} を使用して [[ncmpcpp]] を開くことができます。
{{Warning|It is '''strongly''' recommended to use {{ic|vipw}} when editing user information as it prevents badly formatted entries.}}
 
   
  +
{{hc|~/.zshrc|2=
例:
 
  +
ncmpcppShow() {
  +
BUFFER="ncmpcpp"
  +
zle accept-line
  +
}
  +
zle -N ncmpcppShow
  +
bindkey '^[\' ncmpcppShow
  +
}}
   
  +
アプリケーションを呼び出す前に、行に入力した内容をすべて保持する別の方法
編集前:
 
  +
''username'':x:1000:1000:Full Name,,,:/home/''username'':/bin/zsh
 
  +
{{hc|~/.zshrc|2=
編集後:
 
  +
ncmpcppShow() {
''username'':x:1000:1000:Full Name,,,:/home/''username'':/bin/bash
 
  +
ncmpcpp <$TTY
  +
zle redisplay
  +
}
  +
zle -N ncmpcppShow
  +
bindkey '^[\' ncmpcppShow
  +
}}
  +
  +
=== ファイルマネージャー風のキーバインド ===
  +
  +
グラフィックファイルマネージャで使われているようなキーバインドが便利かもしれません。1つ目はディレクトリ履歴 ({{ic|Alt+Left}}) に戻り、2つ目はユーザを親ディレクトリ ({{ic|Alt+Up}}) に移動させます。また、ディレクトリの内容も表示されます。
  +
  +
{{hc|~/.zshrc|<nowiki>
  +
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
  +
</nowiki>}}
  +
  +
=== xterm のタイトル ===
  +
  +
あなたのターミナルエミュレータがサポートしていれば、Zsh からターミナルのタイトルを設定できます。これにより、タイトルを動的に変更し、シェルの状態に関する状態 (例えば、ユーザ名とカレントディレクトリや現在実行中のコマンド) を表示できます。
  +
  +
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'
  +
  +
このコマンドは、タイトルを以下に設定します:
  +
  +
My xterm title
  +
  +
タイトルを動的にするシンプルな方法は、{{ic|precmd}} フック関数と {{ic|preexec}} フック関数でタイトルを設定することです。利用可能なフック関数リストと説明は {{man|1|zshmisc|Hook Functions}} を見てください。
  +
  +
{{ic|print -P}} を使えば、さらに Zsh のプロンプトエスケープも使用できます。
  +
  +
{{Tip|
  +
* タイトルの表示は複数のコマンドに分けることができます。ただし、コマンドは連続していなければなりません。
  +
* [[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|
  +
* 変数を表示するときに {{ic|print}} の {{ic|-P}} オプションは使用しないでください。変数がプロンプトエスケープとしてパースされてしまいます。
  +
* 変数を表示するときには、[https://zsh.sourceforge.io/Doc/Release/Expansion.html#Parameter-Expansion-Flags パラメータ展開フラグ] {{ic|q}} を使用してください。変数がエスケープシーケンスとしてパースされないようにするためです。
  +
}}
  +
  +
{{hc|~/.zshrc|<nowiki>
  +
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
  +
</nowiki>}}
  +
  +
==== ターミナルエミュレータのタブのタイトル ====
  +
  +
一部のターミナルエミュレータとマルチプレクサは、タブのタイトルの設定をサポートしています。そのためのエスケープシーケンスはターミナルによります:
  +
  +
{| class="wikitable sortable"
  +
! ターミナル
  +
! エスケープシーケンス
  +
! 説明
  +
|-
  +
! [[GNU Screen]]
  +
| {{ic|\ek}}{{ic|\e\\}}
  +
| Screen のウィンドウタイトル ({{ic|%t}})。
  +
|-
  +
! [[Konsole]]
  +
| {{ic|\e]30;}}{{ic|\a}}
  +
| Konsole のタブタイトル。
  +
|}
  +
  +
=== シェル環境の検出 ===
  +
  +
シェル環境を検出するテストは、[https://gitlab.com/jdorel-documentation/shell-environment-detection shell environment detection のリポジトリ]を見てください。これには、ログイン/インタラクティブシェル、Xorg セッション、TTY、SSH セッションの検出も含まれています。
  +
  +
=== /dev/tcp と等価な ztcp ===
  +
  +
{{ic|zsh/net/tcp}} モジュールを使用してください:
  +
  +
$ zmodload zsh/net/tcp
  +
  +
これで、TCP 接続を確立できます:
  +
  +
$ ztcp example.com 80
  +
  +
詳細は {{man|1|zshmodules|THE_ZSH/NET/TCP_MODULE}} と {{man|1|zshtcpsys}} で見られます。
  +
  +
=== コマンドラインに文字があるときにもシェルを終了するショートカット ===
  +
  +
デフォルトでは、コマンドラインに文字が入力されている場合、{{ic|Ctrl+d}} はシェルを終了しません。これを修正するには:
  +
  +
{{hc|.zshrc|
  +
exit_zsh() { exit }
  +
zle -N exit_zsh
  +
bindkey '^D' exit_zsh
  +
}}
  +
  +
=== pacman -F "command not found" ハンドラー ===
  +
  +
[[pacman]] には、あるファイルを含むパッケージを検索する機能があります。以下の command-not-found ハンドラは、不明なコマンドが実行されたときに、pacman を直接使用してマッチするパッケージを検索します。
  +
  +
{{hc|1=~/.zshrc|2=
  +
...
  +
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
  +
}
  +
...
  +
}}
  +
  +
{{Note|pacman のファイルデータベースは、通常の同期データベースから分離されており、{{ic|pacman -Fy}} を使ってフェッチする必要があります。詳細は [[pacman#特定のファイルが含まれているパッケージを検索]] を見てください。}}
  +
  +
''pkgfile'' を使う代替としては、[[#pkgfile の "command not found" ハンドラー]] を見てください。
  +
  +
=== キーバインドを使ってバックバッファをクリアする ===
  +
  +
デフォルトでは、画面をクリアするキーバインドは、ほとんどのターミナルエミュレータでバックバッファ (上にスクロールしないと見えない部分) をクリアしません。この問題の解決策とhしては:
  +
  +
{{hc|~/.zshrc|2=
  +
...
  +
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
  +
...
  +
}}
  +
  +
== サードパーティ拡張 ==
  +
  +
=== 設定フレームワーク ===
  +
  +
{{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|Prezto|Zsh 用の設定フレームワークです。モジュールが同梱されており、適切なデフォルト、エイリアス、関数、オートコンプリート、プロンプトテーマでコマンドラインインターフェイス環境を充実させることができます。|https://github.com/sorin-ionescu/prezto|{{AUR|prezto-git}}}}
  +
* {{App|ZIM|驚異的なスピードとモジュール式拡張機能の付いた設定フレームワークです。Zim はとても簡単にカスタマイズでき、スピードと機能性を犠牲にせず、モジュールと機能の豊富なセットが付属しています。|https://github.com/zimfw/zimfw|{{AUR|zsh-zim-git}}}}
  +
  +
=== プラグインマネージャー ===
  +
  +
* {{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|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|zgen|Zsh 用の軽量でシンプルなプラグインマネージャ。[https://github.com/tarjoilija/zgen/issues/123 放棄されています]|https://github.com/tarjoilija/zgen|{{AUR|zgen-git}}}}
  +
* {{App|zplug|Zsh 用の次世代プラグインマネージャ。[https://github.com/zplug/zplug/issues/403#issuecomment-477520784 放棄されています]|https://github.com/zplug/zplug|{{AUR|zplug}}}}
  +
  +
=== Fish のようなシンタックスハイライトとオートサジェスト ===
  +
  +
[[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
  +
}}
  +
  +
=== pkgfile の "command not found" ハンドラー ===
  +
  +
[[pkgfile]] には、{{ic|command_not_found_handler}} 関数を提供する Zsh スクリプトファイルが含まれています。この関数は、認識されないコマンドが入力されたときに、pkgfile のデータベースを自動的に検索します。
  +
  +
この関数を有効化するには、そのスクリプトを [[source]] する必要があります。例えば:
  +
  +
{{hc|1=~/.zshrc|2=
  +
source /usr/share/doc/pkgfile/command-not-found.zsh
  +
}}
  +
  +
{{Note|pkgfile のデータベースは、この機能を使う前に更新が必要な場合があります。詳細は [[pkgfile#インストール]] を見てください。}}
  +
  +
pacman のネイティブな機能を使う代替は、[[#pacman -F "command not found" ハンドラー]] を見てください。
   
 
== 参照 ==
 
== 参照 ==
   
  +
* [[Wikipedia:ja:Z Shell]]
*[http://zsh.sourceforge.net/Guide/zshguide.html ユーザーガイド]
 
*[http://zsh.sourceforge.net/Doc/Release/index-frame.html The Z Shell Manual] (different format available [http://zsh.sourceforge.net/Doc/ here])
+
* [https://zsh.sourceforge.io/Intro/intro_toc.html Z Shell イントロダクション]
*[http://zsh.sourceforge.net/FAQ/zshfaq01.html Zsh FAQ]
+
* [https://zsh.sourceforge.io/Guide/zshguide.html ZSH ユーザガイド]
  +
* [https://zsh.sourceforge.io/Doc/Release/index-frame.html Z Shell マニュアル] ([https://zsh.sourceforge.io/Doc/ このページ]とは形式が異なります)
*[http://grml.org/zsh/zsh-lovers.html zsh-lovers(1)] (公式リポジトリの {{pkg|zsh-lovers}} で利用できます)
 
*[http://zshwiki.org/home/ Zsh Wiki]
+
* [https://zsh.sourceforge.io/FAQ/zshfaq01.html Zsh FAQ]
  +
* {{man|1|zsh-lovers}} ({{pkg|zsh-lovers}} パッケージとして利用可能)
*[https://wiki.gentoo.org/wiki/Zsh/HOWTO Gentoo Wiki: Zsh/HOWTO]
 
  +
* [[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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。