シェルに制御文字を入力すると、「キャレット記法」と呼ばれるものを使用して表示されます。たとえば、エスケープは ^[
として記述されます キャレット記法で。
かっこよく見えるようにbashシェルをカスタマイズするのが好きです。たとえば、 PS1
を変更しました およびPS2
色化する。制御文字にも独自の外観を持たせて、通常の文字と区別しやすくしたいと思います。
$ # Here I type CTRL-C to abort the command.
$ blahblah^C
^^ I want these two characters to be displayed differently
シェルのハイライト制御文字を別の方法で表示する方法はありますか?
太字で表示したり、通常のテキストとは異なる色で表示したりすることはできますか?
bashを使用しています ここにシェルがありますが、質問に bash
のタグを付けませんでした 多くの異なるシェルに適用できる解決策があるかもしれないからです。
注 制御文字の強調表示がどのレベルで行われるかはわかりません。私は最初にそれがシェル自体にあると思いました。 readline だと聞きました bashのようなシェルでの制御文字の配置を制御します 。そのため、質問は readline
でタグ付けされます そして私はまだ答えを探しています。
承認された回答:
Ctrl + Xを押したとき 、端末エミュレータは、バイト0x18を疑似端末ペアのマスター側に書き込みます。
次に何が起こるかは、ttyラインディシプリン(マスター側(エミュレーターの制御下)とスレーブ側(ターミナルで実行されているアプリケーションが対話する)の間にあるカーネル内のソフトウェアモジュール)がどのように構成されているかによって異なります。
そのtty行の規律を構成するコマンド stty
です コマンド。
cat
のようなダムアプリケーションを実行する場合 stdinが端末であるかどうかを認識せず、気にしない場合、端末はデフォルトの正規になります。 ttyラインディシプリンが大まかなラインエディタを実装するモード 。
その粗雑なラインエディタ以上のものを必要とするいくつかのインタラクティブなアプリケーション 通常、これらの設定は起動時に変更し、終了時に復元します。現代の砲弾、プロンプトで そのようなアプリケーションの例です。彼らは独自のより高度なラインエディタを実装しています。
通常、コマンドラインを入力している間、シェルはttyラインディシプリンをそのモードにします。Enterキーを押して現在のコマンドを実行すると、シェルは通常のttyモードを復元します(プロンプトを発行する前に有効でした)。
stty -a
を実行した場合 コマンドを押すと、ダムアプリケーションで使用されている現在の設定が表示されます。 。 icanon
が表示される可能性があります 、 echo
およびechoctl
有効になっている設定。
つまり、次のようになります。
-
icanon
:その粗いラインエディタが有効になっています。 エコー
:入力した文字(ターミナルエミュレータがマスター側に書き込む文字)はエコーされます 戻る(ターミナルエミュレータで読み取り可能になります)。-
echoctl
:エコーされるの代わりに asis、制御文字はエコーされます^ X
として 。
したがって、 Aと入力するとします。 B Backspace-aka-Ctrl + H /? C Ctrl + X バックスペース 戻る 。
ターミナルエミュレータは次を送信します: ABbCx18br
。ラインディシプリンはエコーします 戻る: ABb bC ^ Xb bb brn
、およびスレーブ側から入力を読み取るアプリケーション( / dev / pts / x
)は ACn
を読み取ります 。
アプリケーションが認識するのはACn
だけです 、 Enterを押したときのみ そのため、 ^ X
の出力を制御することはできません。 そこに。
エコーの場合は 、最初の ^ H
( ^?コード> 一部の端末では、
Erase
を参照してください 設定)結果として b b
ターミナルに送り返されます。これは、カーソルを戻し、スペースで上書きし、カーソルを再び戻し、2番目の ^ H
のシーケンスです。 結果としてbbb b
これら2つの^
を消去します およびX
文字。
^ X
(0x18)自体は ^
に変換されていました およびX
出力用。 B
のように 、Backspaceで削除したため、アプリケーションに到達しませんでした。
r
(別名 ^ M
)は rn
に翻訳されました ( ^ M ^ J
)エコーの場合、および n
( ^ J
)アプリケーション用。
それで、それらのダムのための私たちのオプションは何ですか アプリケーション:
-
echo
を無効にする (stty -echo
)。これにより、何もエコーしないことで、制御文字のエコー方法が効果的に変更されます。実際には解決策ではありません。 -
echoctl
を無効にします 。これにより、制御文字の方法が変わります(^ H
以外) 、^ M
…およびラインエディタで使用される他のすべてのもの)がエコーされます。その後、エコーされます そのまま。つまり、たとえば、ESC文字はe
として送信されます (^ [
/0x1b
)バイト(端末によってエスケープシーケンスの開始として認識されます)、^ G
a
を送信します (BEL、端末のビープ音を鳴らします)…オプションではありません。 - 粗いラインエディタを無効にします(
stty -icanon
)。粗雑なアプリケーションははるかに使いにくくなるため、実際にはオプションではありません。 - カーネルコードを編集して、ttyラインディシプリンの動作を変更し、 echo 制御文字のは
e[7m ^ Xe [m
を送信します^ X
だけでなく (ここではe [7m
通常、ほとんどの端末でリバースビデオが有効になります。
オプションとして、 rlwrap
のようなラッパーを使用することもできます。 これは、ばかげたアプリケーションに派手なラインエディタを追加するための汚いハックです。そのラッパーは事実上、単純な read()
を置き換えようとします ■端末デバイスからreadlineラインエディタの呼び出し(ttyラインディシプリンのモードを変更します)。
さらに進んで、ターミナルからのすべての入力をハイジャックしてzshのラインエディタ( ^ X
を強調表示する)を通過するこのようなソリューションを試すこともできます。 sリバースビデオ)GNUscreenの:exec
に依存 機能。
独自のラインエディタを実装するアプリケーションの場合、エコーの方法を決定するのはアプリケーションです。 終わらせる。 bash
制御文字のエコー方法をカスタマイズするためのサポートがないものにはreadlineを使用します。
zsh
の場合 、参照:
info --index-search='highlighting, special characters' zsh
zsh
デフォルトでは、印刷できない文字を強調表示します。たとえば、次のように強調表示をカスタマイズできます。
zle_highlight=(special:fg=white,bg=red)
これらの特殊文字の赤の強調表示に白を使用します。
ただし、これらの文字のテキスト表現はカスタマイズできません。
UTF-8ロケールでは、0x18は ^ X
としてレンダリングされます 、 u378
、 U7fffffff
(2つの割り当てられていないUnicodeコードポイント)as <0378>
、 <7FFFFFFF>
、 u200b
(実際には印刷できないUnicode文字)as <200B>
。
x80
iso8859-1ロケールでは、^�
としてレンダリングされます …など