터미널에 대한 색상 및 스타일 문자열입니다.
Crayons 는 터미널에 다양한 색상과 스타일의 문자열을 간단하게 쓸 수 있게 해주는 패키지입니다. 16가지 시스템 색상(256색 및 24비트 트루 컬러 확장 모두)과 터미널에서 사용할 수 있는 다양한 텍스트 스타일을 지원합니다. 패키지는 잘 작동하고 종속성이 없으며 빠르게 로드되도록 설계되었습니다(사전 컴파일 후 로드 시간 약 10ms).
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색 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>
은 스타일 중 하나입니다.!
스타일이 명시적으로 비활성화되었음을 의미합니다.(<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가 터미널 지원을 자동으로 감지하거나 Julia를 --color=yes
인수로 시작하여 색상을 활성화해야 합니다. 또는 환경 변수 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개 시스템 색상 중 하나로 변환할 수 있습니다. 16개 색상(8 + 8개 밝은 버전)은 매우 작은 색상 공간이므로 변환이 그다지 좋지 않을 수 있습니다.
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
함수는 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)
호출하여 CrayonStack
incremental
모드로 만들 수도 있습니다. 이 경우 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