Zsh
Zsh は対話式シェルとしてもスクリプト言語のインタプリタとしても使えるパワフルなシェルです。POSIX sh と互換性がありながら (デフォルトではありません、emulate sh
を実行した時だけです)、タブ補完の改善や グロビングなどの利点があります。
Zsh FAQ には他にも Zsh をあなたのシェルとして使うべき理由が列挙されています。
目次
- 1 インストール
- 2 スタートアップ/シャットダウン ファイル
- 3 Zsh の設定
- 4 ヒントとテクニック
- 5 サードパーティ拡張
- 6 参照
インストール
インストールをする前に現在使っているシェルが何なのか知っておくとよいでしょう:
$ echo $SHELL
zsh パッケージをインストールしてください。追加の補完定義を使いたい場合は、zsh-completions パッケージもインストールします。
初期設定
ターミナルで次のコマンドを実行して Zsh が正しくインストールされたか確認してください:
$ zsh
基本的な設定を説明する zsh-newuser-install が表示されるはずです。これをスキップしたい場合、q
を押して下さい。表示されない場合は、次のコマンドで手動で呼び出すことができます:
$ autoload -Uz zsh-newuser-install $ zsh-newuser-install -f
Zsh をデフォルトのシェルにする
シェルを /usr/bin/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 を参照してください。
Zsh の設定
Zsh は何も設定しなくても使うことができますが、ほとんどのユーザが使いたいと思うようには設定されていないことはほぼ確実です。ただし、Zsh で利用できるカスタマイズの量は膨大で、Zsh を設定するのは大変で時間を浪費する経験となるでしょう。自動的に設定するには #サードパーティ拡張 を見てください。
シンプルな .zshrc
以下は設定ファイルのサンプルです。デフォルトのオプションの適切なセットと共に、Zsh でカスタマイズ可能な方法の例を提供します。この設定を使うには、.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 は 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 モードがあります。VISUAL
か EDITOR
のどちらか一方の環境変数に vi
という文字列が含まれている場合、vi モードが使用されます。それ以外の場合、Emacs モードをデフォルトで使用します。bindkey -e
(Emacs モード) や bindkey -v
(vi モード) でモードを明示的に設定することもできます。
キーバインドは、キープレスに対応するエスケープシーケンスを ZLE ウィジェットにマッピングすることにより割り当てます。利用可能なウィジェットは zshzle(1) § STANDARD WIDGETS と zshcontrib(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
これにより、Up
か Down
を押したときに、現在の行のカーソル位置までにマッチする過去のコマンドだけが表示されます。
修飾キー Shift、Alt、Ctrl、Meta
xterm 互換端末は user_caps(5) からの拡張キー定義を使うことができます。キー定義は、Shift
、Alt
、Ctrl
、Meta
と、Up
、Down
、Left
、Right
、PageUp
、PageDown
、Home
、End
、Del
のどれかを組み合わせたものです。修飾キーとキーの組み合わせに推奨される名前の一覧については、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
(PROMPT
、prompt
) に加えて、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 環境変数も確認してください。24bit
か truecolor
を返した場合、たとえ terminfo がより少ない数値を表示したとしても、あなたのターミナルは 16777216 (224) 色をサポートしています。
例
これは、シンプルな色無しのプロンプトの例です:
PROMPT='%n@%m %~ %# '
以下のように出力されます:
これは、色付きの左右両方のプロンプトの例です:
PROMPT='%F{green}%n%f@%F{magenta}%m%f %F{blue}%B%~%b%f %# ' RPROMPT='[%F{yellow}%?%f]'
以下のように出力されます:
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 ファイル
- 月次 ISO リリース (デフォルトで Zsh を使用します) と同じセットアップにするには、grml-zsh-config をインストールしてください。これには、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 がクラッシュまたは検出された場合)
これは通常、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>
を使用して、アクセスしたフォルダに移動。ダッシュの後にオートコンプリートを使用します。これは、オートコンプリートメニューを使用する場合に非常に便利です。
cdr
cdr を使用すると、作業ディレクトリーを、自動的に保守されるリストから前の作業ディレクトリーに変更することができます。セッション間および (デフォルトでは) 現在のセッション内の端末エミュレータ間で維持されるファイルに、すべてのエントリが格納されます。
セットアップ手順については、zshcontrib(1) § REMEMBERING RECENT DIRECTORIES を参照してください。
zoxide
zoxide は、よりスマートな cd コマンドで、わずか数回のキーストロークでどこにでも移動できます。頻繁に使用するディレクトリを記憶し、スコアリングメカニズムを使用して目的の場所を推測します。
ヘルプコマンド
Bash とは異なり、Zsh は組み込みコマンド help
の代わりに run-help
を提供します。デフォルトでは、run-help
はman
へのエイリアスとなっており、コマンドの前に付けて手動で実行するか、キーボードショートカット Alt+h
または Esc
h
を使用して現在入力されているコマンドに対して呼び出すことができます。
デフォルトでは man へのエイリアスであるため、外部コマンドでのみ動作します。シェルの組み込み関数やその他のシェル機能で動作するように変更するには、run-help
関数を使用する必要があります。run-help
とその補助機能の詳細については、zshcontrib(1) を参照してください。
まず、run-help
関数をロードしてから、既存の run-help
エイリアスを削除します。help
は run-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
オンデマンド再ハッシュ
しかし、上記のように pacman を hooks で設定すると、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
~/.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 のプロンプトエスケープを利用することができます。
~/.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 } ...
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 に似たパフォーマンス重視のプラグインマネージャー
- zinit (previously "zplugin") — 柔軟で高速な Zsh プラグインマネージャー
- zr — Rust で書かれたシンプルで高速なプラグインマネージャー
- sheldon — Rust で書かれた高速で柔軟なプラグインマネージャー
- zpm — キャッシュを生成し柔軟で高速なプラグインマネージャー
- Antigen — oh-my-zsh と vundle に触発された Zsh のプラグインマネージャー ABANDONED
- zgen — Zsh 用の軽量でシンプルなプラグインマネージャー ABANDONED
- zplug — Zsh 用の次世代プラグインマネージャー ABANDONED
Fish のようなシンタックスハイライトとオートサジェスト
Fish には強力なシェルシンタックスハイライトとオートサジェスト機能があります。これを zsh で使うには、公式リポジトリから zsh-syntax-highlighting と zsh-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
参照
- Wikipedia:ja:Z Shell
- Z Shell イントロダクション
- ZSH ユーザガイド
- Z Shell マニュアル (このページとは形式が異なります)
- Zsh FAQ
- Zsh Wiki
- zsh-lovers(1) (zsh-lovers パッケージとして利用可能)
- Gentoo: Zsh/Guide
- Bash2Zsh Reference Card