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

色付きのテキストを Linux 端末に出力するにはどうすればよいですか?

ANSI カラーコードを出力する必要があります。すべての端末がこれをサポートしているわけではないことに注意してください。カラー シーケンスがサポートされていない場合、ゴミが表示されます。

例:

 cout << "\033[1;31mbold red text\033[0m\n";

ここで、\033 は ESC 文字、ASCII 27 です。その後に [ が続きます。 、次に ; で区切られた 0 個以上の数字 、そして最後に文字 m .数字は、その時点から切り替える色と形式を示しています。

前景色と背景色のコードは次のとおりです:

         foreground background
black        30         40
red          31         41
green        32         42
yellow       33         43
blue         34         44
magenta      35         45
cyan         36         46
white        37         47

さらに、これらを使用できます:

reset             0  (everything back to normal)
bold/bright       1  (often a brighter shade of the same colour)
underline         4
inverse           7  (swap foreground and background colours)
bold/bright off  21
underline off    24
inverse off      27

あまり広くサポートされていないその他のコードについては、ウィキペディアの表を参照してください。

端末がカラー シーケンスをサポートしているかどうかを判断するには、TERM の値を読み取ります。 環境変数。使用する特定の端末タイプを指定する必要があります (例:vt100gnome-terminalxtermscreen 、...)。それから terminfo データベースを調べてください。 colors を確認してください


必要な色を出力する前に、ターミナルにいることを確認してください:

[ -t 1 ] && echo 'Yes I am in a terminal'  # isatty(3) call in C

次に、色をサポートするかどうか端末の機能を確認する必要があります

terminfo のシステムで (Linux ベース) サポートされている色の数量を次のように取得できます

Number_Of_colors_Supported=$(tput colors)

termcap のシステムで (BSD ベース) サポートされている色の数量を次のように取得できます

Number_Of_colors_Supported=$(tput Co)

次に、決定を下します:

[ ${Number_Of_colors_Supported} -ge 8 ] && {
    echo 'You are fine and can print colors'
} || {
    echo 'Terminal does not support color'
}

ところで、以前に ESC 文字で提案されたように色付けを使用しないでください。特定の端末がサポートする正しい色を割り当てる標準の端末機能への呼び出しを使用してください。

BSD ベース
fg_black="$(tput AF 0)"
fg_red="$(tput AF 1)"
fg_green="$(tput AF 2)"
fg_yellow="$(tput AF 3)"
fg_blue="$(tput AF 4)"
fg_magenta="$(tput AF 5)"
fg_cyan="$(tput AF 6)"
fg_white="$(tput AF 7)"
reset="$(tput me)"
Linux ベース
fg_black="$(tput setaf 0)"
fg_red="$(tput setaf 1)"
fg_green="$(tput setaf 2)"
fg_yellow="$(tput setaf 3)"
fg_blue="$(tput setaf 4)"
fg_magenta="$(tput setaf 5)"
fg_cyan="$(tput setaf 6)"
fg_white="$(tput setaf 7)"
reset="$(tput sgr0)"
echo -e "${fg_red}  Red  ${fg_green} Bull ${reset}"
として使用

基本

出力の前景色と背景色を設定するために使用できる C++ クラスを作成しました。このサンプル プログラムは、This ->word<- is red. を出力する例です。 word の前景色になるようにフォーマットします は赤です。

#include "colormod.h" // namespace Color
#include <iostream>
using namespace std;
int main() {
    Color::Modifier red(Color::FG_RED);
    Color::Modifier def(Color::FG_DEFAULT);
    cout << "This ->" << red << "word" << def << "<- is red." << endl;
}

ソース

#include <ostream>
namespace Color {
    enum Code {
        FG_RED      = 31,
        FG_GREEN    = 32,
        FG_BLUE     = 34,
        FG_DEFAULT  = 39,
        BG_RED      = 41,
        BG_GREEN    = 42,
        BG_BLUE     = 44,
        BG_DEFAULT  = 49
    };
    class Modifier {
        Code code;
    public:
        Modifier(Code pCode) : code(pCode) {}
        friend std::ostream&
        operator<<(std::ostream& os, const Modifier& mod) {
            return os << "\033[" << mod.code << "m";
        }
    };
}

上級

クラスに機能を追加したい場合があります。たとえば、マゼンタの色や boldface のようなスタイルを追加することも可能です .これを行うには、Code へのエントリをもう 1 つ追加します。 列挙。これは参考になります。


Linux
  1. Linuxでファイルの終わりにテキストを追加する方法

  2. Linuxコマンドの出力を変数に割り当てる方法

  3. Linuxでコマンド出力をファイルに保存する方法

  1. プログラムは、カラー出力を使用するかどうかをどのように決定しますか?

  2. Linux X11 のバージョンを確認するには?

  3. vi を使用して Linux のターミナルでコマンドを編集するには?

  1. Linuxでターミナルセッションを記録する方法

  2. 端末でテキスト ファイルを編集する方法

  3. Linux コンソールで、出力をラップしない方法