「Zsh」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
337行目: 337行目:
 
}}
 
}}
   
===== サンプル =====
+
===== =====
   
以下のようにするとで左右両側にプロンプトを表示きます:
+
れは、シンプルな色無しのプロンプトの例です:
PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg_no_bold[yellow]%}%1~ %{$reset_color%}%#"
 
RPROMPT="[%{$fg_no_bold[yellow]%}%?%{$reset_color%}]"
 
   
  +
PROMPT='%n@%m %~ %# '
次のようになります (色は省略):
 
  +
username@host ~ % [0]
 
  +
以下のように出力されます:
  +
  +
<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>
  +
  +
これは、色付きの左右両方のプロンプトの例です:
  +
  +
PROMPT='%F{green}%n%f@%F{magenta}%m%f %F{blue}%B%~%b%f %# '
  +
RPROMPT='[%F{yellow}%?%f]'
  +
  +
以下のように出力されます:
  +
  +
<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>
  +
  +
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 ファイル ===
 
=== サンプルの .zshrc ファイル ===

2022年10月21日 (金) 17:58時点における版

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 モード) でモードを明示的に設定することもできます。

キーバインドは、キープレスに対応するエスケープシーケンスを 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 でリストアップされています。

Colors

Zsh sets colors differently than Bash; You do not need to use profuse ANSI escape sequences or terminal capabilities from terminfo(5). Zsh provides convenient prompt escapes to set the foreground color, background color and other visual effects; see zshmisc(1) § Visual effects for a list of them and their descriptions.

Colors can be specified using a decimal integer, the name of one of the eight most widely-supported colors or as a # followed by an RGB triplet in hexadecimal format. See the description of fg=colour in zshzle(1) § CHARACTER HIGHLIGHTING for more details.

Most terminals support the following colors by name:

Name Number
black 0
red 1
green 2
yellow 3
blue 4
magenta 5
cyan 6
white 7

Color numbers 0–255 for terminal emulators compatible with xterm 256 colors can be found in the xterm-256color chart.

With a correctly set TERM environment variable, the terminal's supported maximum number of colors can be found from the terminfo(5) database using echoti colors. In the case of 24-bit colors, also check the COLORTERM environment variable with print $COLORTERM. If it returns 24bit or truecolor then your terminal supports 16777216 (224) colors even if terminfo shows a smaller number.

ノート:
  • The colors 0–15 may differ between terminal emulators and their used color schemes.
  • Many terminal emulators display bold with a brighter color.
ヒント:
  • Prompt escapes can be tested with command print -P "prompt escapes", for example:
    $ print -P '%B%F{red}co%F{green}lo%F{blue}rs%f%b'
  • If you use 24-bit colors, you might want to load the zsh/nearcolor module in terminals that do not support them. E.g.:
    [[ "$COLORTERM" == (24bit|truecolor) || "${terminfo[colors]}" -eq '16777216' ]] || zmodload zsh/nearcolor
    See zshmodules(1) § THE ZSH/NEARCOLOR MODULE for details about 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 コマンドを使って端末を "フリーズ/フリーズ解除" することができます。起動時にインタラクティブシェルをフリーズするには、次のコマンドを使用します。

~/.zshrc
ttyctl -f

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

代替の線画文字セット は ttyctl が防ぐことのできない方法で端末を台無しにしてしまう可能性があります。

簡単な解決方法は、precmd フック関数から端末をリセットするエスケープシーケンスを出力し、プロンプトが表示される前に毎回実行されるようにすることです。例えば、 the escape sequence \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

## Remove duplicate entries
setopt PUSHD_IGNORE_DUPS

## This reverts the +/- operators.
setopt PUSHD_MINUS

使用する

$ dirs -v

cd -<NUM> を使用して、アクセスしたフォルダに移動。ダッシュの後にオートコンプリートを使用します。これは、オートコンプリートメニューを使用する場合に非常に便利です。

ノート: 複数の zsh の場合 セッションを開いていて、cd を実行しようとすると、両方のセッションで同じファイルへの書込みが競合するため、この操作は機能しません。

cdr

cdr を使用すると、作業ディレクトリーを、自動的に保守されるリストから前の作業ディレクトリーに変更することができます。セッション間および (デフォルトでは) 現在のセッション内の端末エミュレータ間で維持されるファイルに、すべてのエントリが格納されます。

セットアップ手順については、zshcontrib(1) § REMEMBERING RECENT DIRECTORIES を参照してください。

zoxide

zoxide は、よりスマートな cd コマンドで、わずか数回のキーストロークでどこにでも移動できます。頻繁に使用するディレクトリを記憶し、スコアリングメカニズムを使用して目的の場所を推測します。

ヘルプコマンド

Bash とは異なり、Zsh は組み込みコマンド help の代わりに run-help を提供します。デフォルトでは、run-helpman へのエイリアスとなっており、コマンドの前に付けて手動で実行するか、キーボードショートカット Alt+h または Esc 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) の代わりに man ページ git-commit(1) を開きます。

永続的な再ハッシュ

通常、compinit は $PATH 内で新しい実行可能ファイルを自動的には見つけません。たとえば、新しいパッケージをインストールした後、/usr/bin/ 内のファイルはすぐにまたは自動的には補完に含まれません。したがって、これらの新しい実行可能ファイルを含めるには、次のコマンドを実行します。

$ rehash

この 再ハッシュ は自動的に実行されるように設定できます。[3] zshrc に以下を含めるだけです。

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

オンデマンド再ハッシュ

しかし、上記のように pacmanhooks で設定すると、rehash を自動的に要求できます。これは、上記のような連続的な再ハッシュによるパフォーマンスの低下を招くことはありません。これを有効にするには、/etc/pacman.d/hooks ディレクトリと /var/cache/zsh フックファイルを作成します。

~/.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

precmd フックが /var/cache/zsh/pacman の更新前にトリガーされた場合、新しいプロンプトが開始されるまで完了できないことがあります。enter などの空のコマンドを実行すれば十分です。

SIGUSR1 を使用したオンデマンド再ハッシュの代替

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

/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 インスタンスが終了します。
~/.zshrc
TRAPUSR1() { rehash }

上記の 関数トラップ は、トラップのリスト trap 'rehash' USR1 で置き換えることができます。トラップのタイプの違いについては、zshmisc(1) § Trap Functions を参照してください。

このメソッドを使用すると、すべての rehash インスタンスが即座に zsh になり、precmd を起動するために Enter キーを押す必要がなくなります。

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 escape sequence \e]2;\a 例:

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

タイトルを設定します

My xterm title

動的タイトルを簡単に設定するには、precmd および preexec フック関数でタイトルを設定します。使用可能なフック関数のリストとその説明については、zshmisc(1) § Hook Functions を参照してください。

さらに print-P を使うと、Zsh のプロンプトエスケープを利用することができます。

ヒント:
  • タイトルプリントは、連続している限り、複数のコマンドに分割できます。
  • GNU Screen で xterm のタイトルをハードステータス (%h) に送る。 string escapes (例:色) を使用したい場合は、\e_\e\\ エスケープシーケンスでハードステータスを設定する必要があります。そうでなければ、文字列エスケープが \e] 2;\a と入力すると、Screen の文字列エスケープを解釈できないため、ターミナルエミュレータのタイトルが文字化けします。
ノート:
  • 変数がプロンプトエスケープとして解析されないようにするため、変数を出力するときに -P-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*|gnome*|konsole*|kterm*|putty*|rxvt*|screen*|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' タブタイトル.

シェル環境の検出

シェル環境を検出するテストについては、a repository about shell environment detection を参照してください。これには、ログイン/対話シェル、 Xorg セッション、TTY、および SSH セッションが含まれます。

/dev/tcp equivalent: ztcp

zsh/net/tcp モジュールを使用します。

$ zmodload zsh/net/tcp

TCP 接続を確立できるようになりました。

$ ztcp example.com 80

コマンドラインの一部でシェルを終了するショートカット

デフォルトでは、コマンドラインがいっぱいになっても Ctrl+d はシェルを閉じません、次のように修正します。

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

pacman -F コマンドが見つかりません ハンドラー

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
}
...
ノート: pacman のファイル・データベースは通常の同期データベースとは別のもので、pacman-Fy を使用してフェッチする必要があります。詳細については、 pacman#特定のファイルが含まれているパッケージを検索 を参照してください。

pkgfile ファイル を使用する別の方法については、zsh#"command not found" フック を参照してください。

キーバインディングによるバックバッファのクリア

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

~/.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-zsh は Zsh の設定を管理するための、人気のあるコミュニティドリブンなフレームワークです。便利な関数、ヘルパー、プラグイン、テーマが山ほどバンドルされています。
  • Prezto - Instantly Awesome Zsh (AUR の prezto-gitAUR でインストール可能) は Zsh の設定フレームワークです。デフォルトでリッチなコマンドラインインターフェース環境を構築するモジュール・エイリアス・関数・自動補完・プロンプトテーマが付いています。
  • Zim (AUR の zsh-zim-gitAUR でインストール可能) は、驚異的な速度とモジュラー拡張機能を備えたZsh構成フレームワークです。

プラグインマネージャー

  • Antibody — Antigen に似たパフォーマンス重視のプラグインマネージャー
https://github.com/getantibody/antibody || antibodyAUR
  • zinit (previously "zplugin") — 柔軟で高速な Zsh プラグインマネージャー
http://github.com/zdharma/zinit || zsh-zplugin-gitAUR
  • zr — Rust で書かれたシンプルで高速なプラグインマネージャー
https://github.com/jedahan/zr || zr-gitAUR
  • sheldon — Rust で書かれた高速で柔軟なプラグインマネージャー
https://github.com/rossmacarthur/sheldon || sheldon-binAUR
  • zpm — キャッシュを生成し柔軟で高速なプラグインマネージャー
https://github.com/zpm-zsh/zpm || zpm-gitAUR
  • Antigen — oh-my-zsh と vundle に触発された Zsh のプラグインマネージャー ABANDONED
https://github.com/zsh-users/antigen || antigen-gitAUR
  • zgen — Zsh 用の軽量でシンプルなプラグインマネージャー ABANDONED
https://github.com/tarjoilija/zgen || zgen-gitAUR
  • zplug — Zsh 用の次世代プラグインマネージャー ABANDONED
https://github.com/zplug/zplug || zplugAUR

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

Fish には強力なシェルシンタックスハイライトとオートサジェスト機能があります。これを zsh で使うには、公式リポジトリから zsh-syntax-highlightingzsh-autosuggestions 両方もしくは必要な方一つをインストールして以下を zshrc に追加します:

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

"command not found" フック

pkgfile には、認識できないコマンドを入力したときに、自動的に公式リポジトリを検索する command_not_found_handler 関数を提供する Zsh スクリプトファイルが含まれています。

有効にするには、スクリプトを source する必要があります。例:

~/.zshrc
source /usr/share/doc/pkgfile/command-not-found.zsh
ノート: pkgfile データベースの更新が必要な場合があります。pkgfile#Installation で詳細をご確認ください。

参照