web-dev-qa-db-ja.com

Ansiエスケープシーケンスを使用してxtermの色を変更するにはどうすればよいですか?

コマンドラインからxtermの色(背景、フォント、前景)を変更したいと思います。これはANSIエスケープシーケンスを使用して実行できると聞きました。

これが可能な場合:

  • それはどのように行われますか?
  • 色の名前を使用できますか、それともRGBコードを使用する必要がありますか?
26
Nathan Fellman

ANSIエスケープシーケンスは、エスケープ文字、文字27で始まる文字のシーケンスで構成されます。次の文字は、多くの場合(常にではありませんが)開き角括弧です:[

-eを指定し、エスケープに\eを使用すると、echoコマンドはエスケープ文字を送信できます。

ANSI規格では、8色と明るいモードが定義されており、合計16の可能性があります。シーケンスは次のとおりです。

\e[<number>m

<number>は次のいずれかです。

前景:

  • 30黒
  • 31赤
  • 32緑
  • 33イエロー
  • 34ブルー
  • 35マゼンタ
  • 36シアン
  • 37ホワイト

バックグラウンド:

  • 40黒
  • 41赤
  • 42緑
  • 43イエロー
  • 44ブルー
  • 45マゼンタ
  • 46シアン
  • 47ホワイト

  • 0すべてリセット

  • 1太字

したがって、前景を赤にし、背景を黄色にするには、次のようにします。

$ echo -e "\e[31m\e[43m"

そして太字を有効にする:

$ echo -e "\e[1m"

もちろん、それらをすべて組み合わせることができます。

$ echo -e "\e[31m\e[43m\e[1m"

他のことを行うための他の多くのエスケープコードがあります。

たとえば、画面をクリアしてカーソルを左上に移動します。

$ echo -e "\e[2J\e[1;1H"

これは、色を変更するときに役立ちます。

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

これにより、色が変わり、画面がクリアされ、カーソルが左上に置かれます。さて、ほぼ左上。 Echoはキャリッジリターンを挿入するため、1行下に移動します。うるさい場合は、-nをエコーに追加してこれを防ぐことができます。

すべてをめちゃくちゃにして、何を入力しているのかわからない場合は、次のキーを押して端末の色を通常にリセットできます。

Ctrl+v[mReturn

あなたが望むのはコマンドプロンプトです。それは未知のコマンドについて何とかしますが、あなたはあなたが再びやっていることを見ることができます。

29
Majenko

最新のXtermは32ビットカラーをサポートしています。

簡単な例。値#53186fのニースの濃い紫色の背景(ねえ、それぞれ独自のもの)を設定するには、次のようにします。

echo -ne "\033]11;#53186f\007"

これは、後続のテキストだけでなく、ウィンドウ全体の色を即座に変更することに注意してください。これは、サーバーにsshした後でウィンドウを明らかに異なるものにするために特に便利です(たとえば)。上記の「エコー」を.bashrcに挿入すると、そのサーバーにログインすると、端末の色が自動的に変更されます(ただし、Ctrl-Dを押しても元に戻りません)。

あなたはこれを探すためにHOURSをネットで過ごすことができます-ほとんどのドキュメントはオリジナルの16 ANSIカラーについてのみ話します。

出典: http://www.steike.com/code/xterm-colors/ および http://rtfm.etla.org/xterm/ctlseq.html (look 「オペレーティングシステムコントロール」の下)

注意:上記のエスケープシーケンスはXTermsで有効であり、XTermのように見える「XTermのような」ウィンドウターミナルエミュレータの他の実装では機能しない場合があります。たとえば、「gnome-terminal」または「konsole」ではエスケープシーケンスが異なるか、色の変更がまったく実装されていない場合があります。

28
Greg

はい。 ANSI端末は ANSIエスケープコード をサポートしています。次の形式の各_Control Sequence Introducer_(CSI)コード:

_ESC[<<<CODE>>>
_

16進数のアスキー文字_27_(ESC文字)または_1b_、その後に左大括弧、次に使用するアクションを示す文字。

_;_で区切られたパラメーターのリストは、_<<<CODE>>>_パラメーターの直前に指定できることに注意してください。

現在、色はCSIコードのサブセットである_Select Graphic Rendition_コードを使用しています。これらは次の形式です。

_ESC[<<<SGR>>>m
_

SGRコードは、パラメーターとしてCSIとして渡されます。あなたの質問に関連するのは、SGRコード30-49です。コード30〜39は前景色を設定します。コード40〜49は背景色を設定します。

_30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White
_

コード38と48は特別なコードです。これらは、RGB値を使用できるようにするものです。これらの形式は次のとおりです。

_ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)
_

注:別の用途には_\x1b[<3 or 4>8;5;<web safe color index>m_があります。この使用法では、完全に異なるカラーエンコーディングがあります。詳細については、この回答の上部にあるリンクを参照してください。

コード39と49は、前景色と背景色をデフォルトに設定します。デフォルトは、端末ごとに定義されています。

実際には、30-37 40-47の色は、ラベルの色とは少し異なります。

_0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey
_

明るい色を取得するには、太字のSGI、_1_を使用します。太字は誤解を招く名前です。フォントを太字にしません。実際にはテキストの明るさが増します。太字を適用すると、色は次のようになります。

_0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White
_

注意:色の最後の2つのブロックは、前景と背景の両方に関連しています(<index> + (30 or 40))。

すべてのスタイルを削除するには(デフォルト/通常モードに戻す)、SGR 0を使用します。

CSIコードはすべてグラフィカルではありません。たとえば、_ESC[2J_は端末をクリアします。 _ESC[<y>;<x>H_は、カーソル位置を設定します(1インデックス)。詳細については、ウィキペディアの記事を参照してください。

注:これらをテストするには、_echo -e_またはprintfを使用します。

3
Élektra

注:「^ [」はエスケープ文字であり、CTRL-V、CTRL- [で挿入され、^ Gはベル文字で、CTRL-V、CTRL-Gで挿入されます

次のブロックは.bash_profileにあり、このシステムのxtermが、色を変更した可能性のある別のシステムにログオンした後でも、常に黒地に白であることを保証します。

Perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${Host}: ${PWD}^G^[[40m${USER}@${Host}:${PWD}
--> '
2
Mike

プロジェクトもチェックしてください ScriptEchoColor
完全にbashスクリプトで作成されています
ubuntu用のパッケージがあります here
ただし、方法がわかっていれば、これらのスクリプトを任意のディストリビューションにインストールできます(最新のgitからダウンロードすることもできます)。

次のような短縮または拡張された色名を使用できます。

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

サンプル: enter image description here

また、xterm自体(文字だけでなく)をより詳細に制御するには、必ず xtermcontrol を確認してください。

0
Aquarius Power

多くのANSI CSIコード の中には、SGR(Select Graphic Rendition)と呼ばれるものがあります。これはESC、[、parameters、mです。ここで、パラメーターはセミコロンで区切られたASCII形式の1つ以上の整数です。多くの異なるSGRパラメーターがWikipediaにリストされています上記のページ(すべての詳細については説明していません)。

1(太字または増加した強度)や31(赤いテキスト)などの一部のパラメーターはスタンドアロンであり、個別にまたは組み合わせて使用​​できます。たとえば、ESC[31mまたはESC[1;31mのように、それぞれ標準の赤と太字の赤の前景テキストを指定できます。

他のパラメータは、コードの後に​​セミコロンで区切られた数値として提供されるパラメータ自体を受け取ります。したがって、たとえば、ESC[38;5;219mはフォアグラウンドのテキストを拡張カラー番号219で表示し、ESC[38;2;150;100;50mはRGB値150、100、50のカラーで表示します。この場合、38は「拡張されたフォアグラウンドカラーの設定」コマンドです。常にサブコマンドが続きます。サブコマンド2は、赤、緑、青のコンポーネントの値の3つのパラメーターを取ります。別の方法として、サブコマンド5は、もう1つの値(0から255までの数値)を取り、端末が構成されているテーブルから色を指定します。

次のシェル関数は、これらのコードを使用するのに便利です。

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

次のように使用できます。

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

sgr()にパラメーターを指定しない場合、デフォルトでSGRコード0に設定されます。これは、すべての属性をオフにし、テキストをその端末のデフォルトにリセットします。

0
cjs