💎️
ターミナルで文字に色をつける系 gem 7選
はじめに
各ライブラリで次の方法を試す。
- 緑
- 太線の緑
- 緑背景に黒
rainbow
String クラスを汚染しない方法
require "rainbow"
Rainbow.enabled = true
Rainbow("Hello").green # => "\e[32mHello\e[0m"
Rainbow("Hello").green.bold # => "\e[32m\e[1mHello\e[0m"
Rainbow("Hello").black.bg(:green) # => "\e[30m\e[42mHello\e[0m"
一部で使うだけならこれがいい。
String クラスを拡張する方法
require "rainbow"
require "rainbow/ext/string"
Rainbow.enabled = true
"Hello".color(:green) # => "\e[32mHello\e[0m"
"Hello".color(:green).bold # => "\e[32m\e[1mHello\e[0m"
"Hello".color(:black).background(:green) # => "\e[30m\e[42mHello\e[0m"
最初の方法から移行しようとしたら制限が多かった。この方法では色を color メソッドの引数としないといけない。さらに background を bg と書いたらエラーになったりする。
String クラスを拡張するなら、やりきってほしいわ(小声)。逆にメソッドをあまり生やしたくないなら単に String#rainbow で Rainbow(self) を返すだけでよかったように思う。
Refinement を使う方法
require "rainbow"
require "rainbow/refinement"
Rainbow.enabled = true
using Rainbow
"Hello".green # => "\e[32mHello\e[0m"
"Hello".green.bold # => "\e[32m\e[1mHello\e[0m"
"Hello".black.bg(:green) # => "\e[30m\e[42mHello\e[0m"
動いたり動かなかったりしてちょっとはまった。他の箇所で使うにはファイル毎に using Rainbow って書かないといけないなんてほんとに?
注意点
Emacs 内から使うと ENV["TERM"] == "dumb" の条件により無効化されてしまうので、
Rainbow.enabled = true
としないと動かない。
colored
require "colored"
"Hello".green # => "\e[32mHello\e[0m"
"Hello".green.bold # => "\e[1m\e[32mHello\e[0m\e[0m"
"Hello".black.on_green # => "\e[42m\e[30mHello\e[0m\e[0m"
16年前から更新されていないけどまだ動く。
colored2
require "colored2"
"Hello".green # => "\e[32mHello\e[0m"
"Hello".green.bold # => "\e[1m\e[32mHello\e[0m"
"Hello".black.on.green # => "\e[42m\e[30mHello\e[0m"
colored をフォークして拡張したもの。上のような使い方をするだけなら colored でもいい。
colorize
String 拡張の場合
require "colorize"
"Hello".green # => "\e[0;32;49mHello\e[0m"
"Hello".green.bold # => "\e[1;32;49mHello\e[0m"
"Hello".black.on_green # => "\e[0;30;42mHello\e[0m"
String 拡張しない場合
require "colorized_string"
ColorizedString["Hello"].green # => "\e[0;32;49mHello\e[0m"
ColorizedString["Hello"].green.bold # => "\e[1;32;49mHello\e[0m"
ColorizedString["Hello"].green.on_green # => "\e[0;32;42mHello\e[0m"
paint
require "paint"
Paint["Hello", :green] # => "\e[32mHello\e[0m"
Paint["Hello", :green, :bold] # => "\e[32;1mHello\e[0m"
Paint["Hello", :black, :green] # => "\e[30;42mHello\e[0m"
colsole
require "colsole"
Colsole.colorize "g`Hello`" # => "\e[32mHello\e[0m"
Colsole.colorize "gb`Hello`" # => "\e[1m\e[32mHello\e[0m"
文字列内に色名のプレフィクスを埋め込んで装飾する。背景色の指定はできない。
ansi256
require "ansi256"
"Hello".green # => "\e[32mHello\e[0m"
"Hello".green.bold # => "\e[32;1mHello\e[0m"
"Hello".black.on_green # => "\e[30;42mHello\e[0m"
Discussion