スプーキーズの中の人。

スプーキーズの中の人が徒然なるままに、垂れ流します。

zsh 5.0.0 のコマンドラインハイライトを使う

こんにちは。zsh使いの中山です。

ログインシェルはもちろんzshですよね!

そのzshですが、先日バージョン5.0.0がリリースされました。

これまでzshのバージョンは、4.2系が安定板、4.3系が開発版という位置付けでした。今回の5.0.0は、主に4.3系の成果を安定版としてリリースしたものになります。実際のところ、bashでなく敢えてzshを使うようなアグレッシブなユーザは4.3系を使っていた人達が大半ではないかと思いますので、そういったユーザにとっては5.0.0での大きな変化はありません。

そうは言ってもzshにはまだまだ知らない機能が多いので、今回は5.0.0の新機能として謳われている中の一つの、コマンドラインハイライトについて調べてみました。

コマンドラインハイライトとは

コマンドラインハイライトとは、ユーザによる入力文字列に対して、動的にカラーやスタイルを適用できる機能です。この機能は、以下の2つのシェル変数によって設定を変更することができます。

  • zle_highlight — 既定の文字列種別に対してグローバルにハイライトを設定するための配列変数
  • region_highlight — 現在の入力文字列に対してプログラマブルにハイライトを設定するための配列変数

zle_highlight

まずzle_highlightですが、これは大雑把にコマンドラインの文字列種別ごとのハイライト設定をするための変数です。新しい文字列種別を自分で定義することはできないので、自由度はあまり高くありません。この変数にハイライト設定をすると、そのシェルプロセスの生存期間中は常にその設定が適用されます。

まず、物は試しに設定をしてみましょう。以下のコードを、zshのコマンドラインで実行して下さい。

[shell] zle_highlight=(default:fg=blue isearch:bold,fg=red) [/shell]

以下のように、普通の文字色が青になったでしょうか。またControl-Rでコマンド履歴をインクリメンタル検索すると、マッチした部分が赤い太字になります。 zle_highlight

zle_highlightの書式

zle_highlightは配列変数です。zshには配列 (ordinary array) と連想配列 (associative array) があります。一見key-valueな連想配列のように見えますが、要素が文字列なだけのordinary arrayですので注意して下さい。

配列の各要素の書式は 文字列種別:ハイライトタイプ[,ハイライトタイプ] のようになります。一つの文字列種別に対して複数の書式を設定する場合は、カンマ区切りで記述します。

文字列種別とハイライトタイプには、以下のような値を設定できます。

文字列種別

  • default — 通常文字列
  • isearch — インクリメンタル検索でマッチした文字列
  • region — 選択中の文字列
  • special — コントロールコードや、zshが表示できないマルチバイト文字
  • suffix — 補完によって入力された未確定の末尾文字(ディレクトリ末尾の/等)

ハイライトタイプ

  • none — ハイライトなし
  • fg=color — 前面色。同時にstandoutを設定していなければ文字色。カラーはblack, red, green, yellow, blue, magenta, cyan, whiteなど。
  • bg=color — 背景色。使えるカラーはfgと同様。
  • bold — ボールドスタイルにする。
  • standout — 強調する。大半のターミナルソフトウェアでは、前面色と背景色が入れ替わる。
  • underline — 下線を引く。

ちなみに、zle_highlightが空な場合は、デフォルトで以下の設定相当になります。

[shell] zle_highlight=(region:standout special:standout suffix:bold isearch:underline) [/shell]

デフォルト設定のハイライトも完全に無効にしたい場合は、以下のようにします。 [shell] zle_highlight=(none) [/shell]

region_highlight

次はregion_highlightです。 これは、現在のコマンドラインの入力文字列に対してのみ、ハイライト設定を行うための変数です。単純に何文字目から何文字目までにこのスタイルを適用する、といった低レベルな設定が可能なため、その気になれば自由自在にハイライト設定ができますが、その分自前で例レベルな部分から実装を行う必要があります。

再び物は試しです。以下のコードをzshのコマンドラインで実行し、その後適当に10文字ほど入力した状態でControl-Tを押してみて下さい。

[shell] highlight_first_five_characters() { region_highlight=('0 5 bold,fg=red') } zle -N highlight_first_five_characters bindkey '^T' highlight_first_five_characters [/shell]

以下のように最初の5文字が赤い太字になったでしょうか。region_highlightはコマンドラインの「現在の入力文字列」に対して設定を行うため、region_highlightに値を代入するコードはコマンドライン入力以外の方法で実行する必要があります。そのため、上記のサンプルではキーバインドによって呼びだすようにしています。実用では、zshの各種イベントフック等に登録するパターンが多いかと思います。 region_highlight

region_highlightに設定した値は、現在の入力文字列の再描画時にハイライトとして反映され、値は即座に消えます。ハイライトタイプに設定可能な値はzle_highlightと同様です。

実際のところ、region_highlightを使って自前で一から実装をするのは大変です。ありがたいことに、有志によって作成されたシンタックスハイライトをするためのスクリプトが公開されています。

それでは皆さんも素敵なzshライフを!

参考: man page zshzle section 1