💎️

ターミナルで文字に色をつける系 gem 7選

に公開

はじめに

各ライブラリで次の方法を試す。

  1. 太線の緑
  2. 緑背景に黒

rainbow

https://github.com/ku1ik/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#rainbowRainbow(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

https://github.com/defunkt/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

https://github.com/kigster/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

https://github.com/fazibear/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

https://github.com/janlelis/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

https://github.com/DannyBen/colsole

require "colsole"
Colsole.colorize "g`Hello`"   # => "\e[32mHello\e[0m"
Colsole.colorize "gb`Hello`"  # => "\e[1m\e[32mHello\e[0m"

文字列内に色名のプレフィクスを埋め込んで装飾する。背景色の指定はできない。

ansi256

https://github.com/junegunn/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