端末用の色付きおよびスタイル設定された文字列。
Crayons は、さまざまな色やスタイルの文字列を端末に簡単に書き込むことができるパッケージです。 16 のシステム カラー、256 色と 24 ビットの True Color 拡張機能の両方、および端末で使用できるさまざまなテキスト スタイルをサポートします。このパッケージは、パフォーマンスが良く、依存関係がなく、高速にロードされるように設計されています (プリコンパイル後のロード時間は約 10 ミリ秒)。
import Pkg; Pkg . add ( " Crayons " )
Crayon
の作成Crayon
キーワードのみのコンストラクターを使用して作成されます。
Crayon (foreground,
background,
reset,
bold,
faint,
italics,
underline,
blink,
negative,
conceal,
strikethrough)
foreground
引数とbackground
引数には、次の 3 つのタイプがあります。
Symbol
。使用可能な色は、 black
、 red
、 green
、 yellow
、 blue
、 magenta
、 cyan
、 light_gray
dark_gray
、 default
、ダークグレー、 light_red
、 light_green
、 light_yellow
、 light_blue
、 light_magenta
、 light_cyan
、およびwhite
です。実際の色を確認するには、 Crayons.test_system_colors()
を試してください。これらの色は、ほぼすべての端末でサポートされています。Integer
。これには 256 色の ANSI エスケープ コードが使用されます。どの番号がどの色に対応するか、また端末が 256 色をサポートしているかどうかを確認するには、 Crayons.test_256_colors(codes=true)
を使用します。Integer
のTuple
。これは(r, g, b)
24 ビット カラーとして解釈されます。端末の 24 ビット カラーのサポートをテストするには、 Crayons.test_24bit_colors(codes=false)
を使用します。これのサポートは現在かなり限定されていますが、端末では継続的に改善されています。ここを参照してください。UInt32
。対応するRGB形式に変換されます。他のキーワード引数はすべてBool
型で、対応するスタイルを明示的に有効にするか無効にするかを決定します。
reset
— すべてのスタイルと色をデフォルトにリセットしますbold
— 太字のテキスト。一部の端末では色も明るくなります。faint
— かすかなテキスト、広くサポートされていないitalics
— 斜体のテキスト、広くサポートされていませんunderline
- 下線付きのテキストblink
— 点滅するテキストnegative
— 前景と背景を交換しますconceal
— テキストを非表示にします。広くサポートされていませんstrikethrough
— テキストの中央を通る水平線。広くサポートされていません。さまざまなスタイルがアクティブになっているテキストを表示するには、 Crayons.test_styles()
を使用します。
キーワード引数にnothing
使用しないと、その色またはスタイルは非アクティブになり、アクティブに有効にも無効にもなりません。
便宜上、16 のシステム カラーの前景/背景バージョンとさまざまなスタイルのCrayon
が事前に作成されており、 Crayons.Box
モジュールに含まれています。前景色/背景色には<COLOR_NAME>_<BG/FG>
という名前があり、さまざまなスタイルには<STYLE>
名前が付いています (大文字に注意してください)。 Crayons.Box
モジュールでusing
呼び出すと、これらすべてがグローバル スコープに組み込まれます。
Crayon
は、文字列マクロcrayon
使用して簡潔な方法で作成することもできます。これらはcrayon"[[fg:]<col>] [bg:<col>] ([[!]<style>] ...)"
を使用して記述されます。
<col>
は、16 進数、 (r,g,b)
タプル (スペースなし)、0 ~ 255 の数値、または 16 の名前付き色のいずれかとして指定される色です。<style>
はスタイルの 1 つです。!
スタイルが明示的に無効になっていることを意味します。(<style> ...)
、スペースで区切られたスタイルの繰り返しを意味します。文字列マクロと同等のコンストラクターの使用例をいくつか以下に示します。
crayon " red " # Crayon(foreground = :red)
crayon " bg:(255,0,255) " # Crayon(background = (255, 0, 255))
crayon " !bold underline 0xff00ff " # Crayon(bold = false, underline = true, foreground = 0xff00ff)
crayon " #0000ff " # Crayon(foreground = 0x0000ff)
Crayon
の使い方Crayon を使用して、色とスタイルを設定したテキストを印刷するプロセスは簡単です。 Crayon
端末に印刷すると、正しいコード シーケンスが端末に送信され、後続の印刷テキストは印刷されたCrayon
の色とスタイルになります。たとえば、REPL で以下のコードを実行してみてください。
print ( Crayon (foreground = :red ), " In red. " , Crayon (bold = true ), " Red and bold " )
print ( Crayon (foreground = 208 , background = :red , bold = true ), " Orange bold on red " )
print ( Crayon (negative = true , underline = true , bold = true ), " Underlined inverse bold " )
print ( Crayon (foreground = ( 100 , 100 , 255 ), background = ( 255 , 255 , 0 )), " Bluish on yellow " )
using Crayons . Box
print (GREEN_FG, " This is in green " )
print (BOLD, GREEN_FG, BLUE_BG, " Bold green on blue " )
作成されたCrayon
に対して呼び出しオーバーロードを使用することもできます。 Crayon
文字列や他のCrayon
を使用して呼び出すことができ、色とスタイルは正しくネストされます。正しい終了シーケンスも印刷されるため、呼び出し範囲外では色とスタイルが無効になります。この機能は、いくつかの例でより明確に示されるでしょう。
using Crayons . Box
print ( UNDERLINE ( " This is underlined. " ), " But this is not " )
print ( RED_FG ( " Hello " , BLUE_BG ( " world " ), " !!! " ), " !!! " )
print ( GREEN_BG ( " We " ,
UNDERLINE ( " are " ,
MAGENTA_FG ( " nesting " ),
" some " ),
" colors " )
)
注:カラー シーケンスを印刷するには、Julia が端末サポートを自動的に検出するか、 --color=yes
引数を指定して Julia を起動することによって、Julia REPL でカラーをアクティブにする必要があります。あるいは、環境変数FORCE_COLOR
存在する場合、またはCrayons.force_color(::Bool)
が有効になっている場合は、何があってもカラー シーケンスが印刷されます。また、完全な 24 ビット カラーをサポートする端末は比較的少ないため、印刷時に 24 ビット クレヨンを 256 色のクレヨンに変換する 256 色モードをアクティブにすることができます。これは、変数環境FORCE_256_COLORS
を定義するか、 Crayons.force_256_colors(::Bool)
を呼び出すことによって行われます。さらに、一部のシステムでは 256 色でも問題が発生しますが、変数FORCE_SYSTEM_COLORS
を定義するか、 Crayons.force_system_colors(::Bool)
を呼び出すことで、16 色のシステム カラーの 1 つに変換できます。 16 色 (8 + 8 ライト バージョン) は非常に小さい色空間であるため、変換があまりうまくいかない可能性があることに注意してください。
Crayon
の結合2 つ以上のCrayon
結合すると、結合された Crayon のすべてのプロパティを持つ新しいCrayon
が生成されます。これは、関数merge(crayons::Crayon...)
を使用するか、 *
を使用してCrayon
乗算することによって行われます。 2 つのCrayon
が同じプロパティを指定する場合、引数リストの最後のCrayon
のプロパティが使用されます。
using Crayons . Box
r_fg = Crayon (foreground = :red )
g_bg = Crayon (background = :green )
merged = merge (r_fg, g_bg)
print (merged, " Red foreground on green background! " )
print (r_fg * g_bg * Crayons . Box . BOLD, " Bold Red foreground on green background! " )
# Also with call overloading and nesting
print ( GREEN_FG (
" I am a green line " ,
BOLD * BLUE_FG * UNDERLINE (
" with a bold underlined blue substring "
),
" that becomes green again! "
))
Crayon
の関数inv
inv
への引数のCrayon
が行ったことを元に戻すCrayon
返します。例として、 inv(Crayon(bold = true))
太字を無効にするCrayon
返します。
関数呼び出しを通じて色とスタイルをネストしたい場合は、 CrayonStack
タイプがあります。 push!
Crayon
スタックに置き、テキストをスタックに印刷して、 pop!
Crayons
オフにします。スタックは、現在アクティブになっているCrayon
を追跡します。 Crayon
と同じように使用されます。
stack = CrayonStack ()
print (stack, " normal text " )
print ( push! (stack, Crayon (foreground = :red )), " in red " )
print ( push! (stack, Crayon (foreground = :blue )), " in blue " )
print ( pop! (stack), " in red again " )
print ( pop! (stack), " normal text " )
CrayonStack(incremental = true)
を呼び出して、 incremental
モードでCrayonStack
を作成することもできます。その場合、 CrayonStack
前のテキスト状態から新しい状態に移行するために必要な変更のみを印刷するため、印刷されるカラー コードが少なくなります。ただし、これは、CrayonStack に加えられたすべての変更 (つまり、 push!
とpop!
の両方が使用される場合) について、出力バッファーにCrayonStack
出力する必要があることを意味することに注意してください。以下の例は、スタックへのすべての変更が出力される実際の例と、1 つの変更が出力されないために誤った結果が得られる別の例を示しています。以下の両方の例は、 incremental = false
の場合に正しく動作します。
# Does work
io = IOBuffer ()
stack = CrayonStack (incremental = true )
print (io, push! (stack, Crayon (foreground = :red )))
print (io, push! (stack, Crayon (foreground = :red )))
print (io, stack, " This will be red " )
print ( String ( take! (io)))
# Does not work
io = IOBuffer ()
stack = CrayonStack (incremental = true )
push! (stack, Crayon (foreground = :red )) # <- not printing the stack even though we modify it!
print (io, push! (stack, Crayon (foreground = :red )))
print (io, stack, " This will not be red " )
print ( String ( take! (io)))
最後の例が機能しなかった理由は、 push!
の 2 回目の呼び出しでテキストの状態に変化がないことをスタックが認識したためです。 、前景が赤のままになっているだけなので。最初のpush!
これは、端末の状態とスタックの状態が同期していないことを意味します。
https://github.com/Aerlinger/AnsiColor.jl
クリストファー・カールソン — @KristofferC