終端的彩色和样式字串。
Crayons是一個包,可以輕鬆地將不同顏色和样式的字串寫入終端。它支援 16 種系統顏色、256 色和 24 位元真彩色擴展,以及終端可用的不同文字樣式。該套件的設計目標是效能良好、無依賴性且載入速度快(預編譯後載入時間約為 10 毫秒)。
import Pkg; Pkg . add ( " Crayons " )
Crayon
Crayon
是使用僅關鍵字建構函數建立的:
Crayon (foreground,
background,
reset,
bold,
faint,
italics,
underline,
blink,
negative,
conceal,
strikethrough)
foreground
和background
參數可以分為三種:
Symbol
。可用的顏色有black
、 red
、 green
、 yellow
、 blue
、 magenta
、 cyan
、 light_gray
、 default
、 dark_gray
、 light_red
、 light_green
、 light_yellow
、 light_blue
、 light_magenta
洋紅色、 light_cyan
和white
。要查看實際顏色,請嘗試Crayons.test_system_colors()
。幾乎所有終端都支援這些顏色。Integer
。若要查看什麼數字對應什麼顏色以及您的終端是否支援 256 種顏色,請使用Crayons.test_256_colors(codes=true)
。Integer
的Tuple
,全部在(r, g, b)
到 255 之間。若要測試終端對 24 位元顏色的支持,請使用Crayons.test_24bit_colors(codes=false)
。目前對此的支援相當有限,但終端正在不斷改進,請參見此處。UInt32
。將會轉換為對應的RGB格式。其他關鍵字參數都是Bool
類型,並決定是否應明確啟用或停用對應的樣式:
reset
— 將所有樣式和顏色重設為預設值bold
— 粗體文本,也使某些終端上的顏色變亮faint
-微弱的文本,沒有得到廣泛支持italics
— 斜體文本,未被廣泛支持underline
— 下劃線的文本blink
— 閃爍的文本negative
— 交換前景與背景conceal
— 隱藏文本,未經廣泛支持strikethrough
— 穿過文字中間的水平線,未被廣泛支援。要查看具有不同樣式的文本,請使用Crayons.test_styles()
透過對任何關鍵字參數nothing
使用任何內容,該顏色或樣式將處於非活動狀態,因此既不會主動啟用也不會主動停用。
為了方便起見, Crayon
前/後台版本的 16 種系統顏色以及不同的樣式都是預先製作好的,可以在Crayons.Box
模組中找到。它們的前景色/背景色名稱為<COLOR_NAME>_<BG/FG>
,不同樣式的名稱為<STYLE>
(注意大寫)。在Crayons.Box
模組上呼叫using
會將所有這些帶入全域範圍。
也可以使用字串宏crayon
以更簡潔的方式建立Crayon
。這些是使用crayon"[[fg:]<col>] [bg:<col>] ([[!]<style>] ...)"
編寫的,其中:
<col>
是一種顏色,以十六進位數字、 (r,g,b)
元組(無空格)、數字 0-255 或 16 種命名顏色之一的形式給出。<style>
是其中一種樣式。!
意味著該樣式被明確禁用。(<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
的顏色和樣式。例如,嘗試在 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 REPL 需要啟動顏色,可以透過 Julia 自動偵測終端支援,也可以透過使用--color=yes
參數啟動 Julia。或者,如果環境變數FORCE_COLOR
存在,或者Crayons.force_color(::Bool)
已啟用,則無論如何都會列印顏色序列。此外,由於支援完整 24 位元顏色的終端相對較少,因此可以啟動 256 色模式,在列印時將 24 位元蠟筆轉換為 256 色蠟筆。這是透過定義變數環境FORCE_256_COLORS
或呼叫Crayons.force_256_colors(::Bool)
來完成的。此外,某些系統即使使用 256 種顏色也會出現問題,可以透過定義變數FORCE_SYSTEM_COLORS
或呼叫Crayons.force_system_colors(::Bool)
轉換為 16 種系統顏色之一。請注意,16 種顏色(8 + 8 光版本)是一個相當小的色彩空間,因此轉換不太可能很好。
Crayon
兩個或多個Crayon
可以合併,從而產生一個具有合併後的 Crayon 的所有屬性的新Crayon
。這是透過函數merge(crayons::Crayon...)
或透過使用*
乘以Crayon
來完成的。如果兩個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
傳回一個Crayon
,該 Crayon 撤銷inv
參數中的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!
時)。下面的範例顯示了一個工作範例,其中列印了對堆疊的所有更改,而另一個範例則給出了錯誤的結果,因為未列印一項更改。如果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!
,因為前景只是保持紅色。第一次push!
意味著最終狀態和堆疊狀態不同步。
https://github.com/Aerlinger/AnsiColor.jl
克里斯多福·卡爾森 — @KristofferC