GNU/Linux >> Linux の 問題 >  >> Linux

シェルで制御文字(^ c、^ d、^ [、…)を異なる方法で表示する方法は?

シェルに制御文字を入力すると、「キャレット記法」と呼ばれるものを使用して表示されます。たとえば、エスケープは ^[として記述されます キャレット記法で。

かっこよく見えるように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の出力を制御することはできません。 そこに。

関連:ログインシェルと非ログインシェルの間のconfファイルの読み取りは何ですか?

エコーの場合は 、最初の ^ 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ロケールでは、^�としてレンダリングされます …など


Linux
  1. Wcで各行の文字を数えますか?

  2. Bashシェルスクリプトで改行をエコーする方法

  3. Linux でデフォルトのシェルを変更する方法

  1. Linux シェルで 16 進数を ASCII 文字に変換する方法は?

  2. シェルスクリプトのコマンドラインからExpectに引数を渡す方法

  3. シェル スクリプトの各行から最初の 5 文字を取得する

  1. Linuxシェルのコマンドラインエイリアス

  2. コマンドの出力をシェル変数に割り当てる方法は?

  3. シェルがSshから制御されているかどうかを検出する方法は?