web-dev-qa-db-ja.com

私のRubyコマンドラインテキストを異なる色で出力する方法

コマンドラインベースのRubyプログラムの色から出力するputsコマンドを作成するにはどうすればよいですか?さまざまな色を呼び出す方法への参照があれば幸いです。

これから始めましょう。

puts "The following Word is blue.. Im Blue!"
puts "The following Word is green.. Im Green!"
puts "The following Word is red.. Im Red!"

そして、私は私が望む異なる色で私が望む異なるテキストを得ます、あなたはアイデアを得ます。

Ubuntuを使用している場合、プログラムがdiff osで正しく出力されるようにアプローチを変更する必要がありますか?

40
Evolve

私は この記事 を見つけて、コンソールに色付きのテキストを書き込む非常に簡単な方法を説明しました。記事は、トリックを実行しているように見えるこの小さな例について説明しています(私はそれを少し改善するために自由を取りました):

def colorize(text, color_code)
  "\e[#{color_code}m#{text}\e[0m"
end

def red(text); colorize(text, 31); end
def green(text); colorize(text, 32); end

# Actual example
puts 'Importing categories [ ' + green('DONE') + ' ]'
puts 'Importing tags       [' + red('FAILED') + ']'

ベストはいくつかの色を定義するようです。異なる背景色も必要な場合は、例を拡張できます(記事の下部を参照)。

Window XPを使用する場合、著者は win32console と呼ばれるgemの要件に言及しています。

57
Veger

私は Colored gem を使用するのが最も簡単でクリーンだと思います。

puts "this is red".red
puts "this is red with a blue background (read: ugly)".red_on_blue
puts "this is red with an underline".red.underline
puts "this is really bold and really blue".bold.blue
logger.debug "hey this is broken!".red_on_yellow 
38
Mark Carey

私はこのようなものを作成しました:

begin
   require 'Win32/Console/ANSI' if PLATFORM =~ /win32/
rescue LoadError
   raise 'You must gem install win32console to use color on Windows'
end

class Colors
   COLOR1 = "\e[1;36;40m"
   COLOR2 = "\e[1;35;40m"
   NOCOLOR = "\e[0m"
   RED = "\e[1;31;40m"
   GREEN = "\e[1;32;40m"
   DARKGREEN = "\e[0;32;40m"
   YELLOW = "\e[1;33;40m"
   DARKCYAN = "\e[0;36;40m"
end

class String
   def color(color)
      return color + self + Colors::NOCOLOR
   end
end

これで、Stringの別のメソッドを使用できます。

"Hello World".color(Colors::DARKGREEN)

すべての色を知るには、これを実行します。

begin
  require 'Win32/Console/ANSI' if PLATFORM =~ /win32/
rescue LoadError
  raise 'You must gem install win32console to use color on Windows'
end

[0, 1, 4, 5, 7].each do |attr|
  puts '----------------------------------------------------------------'
  puts "ESC[#{attr};Foreground;Background"
  30.upto(37) do |fg|
    40.upto(47) do |bg|
      print "\033[#{attr};#{fg};#{bg}m #{fg};#{bg}  "
    end
  puts "\033[0m"
  end
end
6
darek129

エスケープシーケンスを使用する\033 の代わりに \eそれは100%posix互換であり、bsd-ish(例えばosx)システムでも動作します。後者はGNU拡張です。

5
glasz

少し異なる動作をし、より多くのカラーコードが含まれるため、別のソリューションを追加すると思います。

最初にいくつかの例...

メソッドチェーンの使用:

String.include(AnsiTextStyles)

puts "How are you?".blue.bold + " " + 'I am good!'.red.bold
puts '%s %s' % ["How are you?".blue.bold, 'I am good!'.red.bold]

styleメソッドを使用して複数の属性を適用する:

puts "How are you?".style(:red)
puts 'I am good!'.style(:blue, :underline)
puts 'Good to hear'.style([:bg_Magenta, :blink])

これは、後で適用するために何らかの方法でスタイル属性を格納するために使用できます。

text_styles = {
    red_bold:       [:red, :bold],
    blue_underline: [:blue, :underline],
    pretty:         [:bg_Magenta, :blink],
  }

text_styles.each do |name, style|
  styled_text = "Text styled multiple ways".style(style)
  puts "%s: %s" % [name, styled_text]
end

この作成した要点 の例をさらにいくつか示し、コードを拡張して改良を加え、Stringへの変更がスコープされるようにしました。

これは基本的なコードです:

module AnsiTextStyles

  TEXT_ATTRIBUTES = {
      # text properties
      none: 0, # turn off all attributes
      bold: 1, bright: 1, # these do the same thing really
      italic: 3, underline: 4, blink: 5,
      reverse: 7, # swap foreground and background colours
      hide: 8, # foreground color same as background

      # foreground colours
      black: 30, grey: 90, lt_grey: 37, :white => 97,
      red: 31, lt_red: 91, 
      green: 32, lt_green: 92,
      dk_yellow: 33, brown: 33, yellow: 93,
      blue: 34, lt_blue: 94,
      Magenta: 35, pink: 95, lt_Magenta: 95,
      cyan: 36, lt_cyan: 96,
      default: 39,

      # background colours
      bg_black: 40, bg_grey: 100, bg_lt_grey: 47, bg_white: 107,
      bg_red: 41, bg_lt_red: 101,
      bg_green: 42, bg_lt_green: 102,
      bg_dk_yellow: 43, bg_brown: 43, bg_yellow: 103,
      bg_blue: 44, bg_lt_blue: 104,
      bg_Magenta: 45, bg_pink: 105, bg_lt_Magenta: 105,
      bg_cyan: 46, bg_lt_cyan: 106,
    }

  def self.text_attributes
    TEXT_ATTRIBUTES.keys
  end

  # applies the text attributes to the current string
  def style(*text_attributes)
    codes = TEXT_ATTRIBUTES.values_at(*text_attributes.flatten).compact
    "\e[%sm%s\e[m" % [codes.join(';'), self.to_s]
  end

end
4
br3nt

Colorize gemを使用してください!見てみな:

https://github.com/fazibear/colorize

インストール:

Sudo gem install colorize

使用法:

require 'colorize'

puts "I am now red.".red
puts "I am now blue.".green
puts "I am a super coder".yellow
1
mpz
1
St.Woland

すばやく簡単な解決策として、ASCIIカラーコードを文字列に埋め込むことができます(\ e [XXmは、今後使用する色をXXに設定し、\ e [0mは、色を正常):

puts "The following Word is blue.. \e[34mIm Blue!\e[0m"
puts "The following Word is green.. \e[32mIm Green!\e[0m"
puts "The following Word is red.. \e[31mIm Red!\e[0m"

ASCIIコードは、テキストの下線、点滅、強調表示などもサポートします。

実際のASCIIコードを処理する ヘルパーライブラリ も利用できるようです。

Edit:異なるプラットフォームに関して:UNIXマシンではASCIIコードを使用しても問題はありませんが、ウィンドウ、AFAIKは、そのままではそれらをサポートしていません。幸いなことに win32console gem があり、これを修正しているようです。

次のスニペット(リンクされているVegerのページにあります)を使用して、Windowsでのみwin32consoleライブラリをロードできます。

begin
  require 'Win32/Console/ANSI' if PLATFORM =~ /win32/
rescue LoadError
  raise 'You must gem install win32console to use color on Windows'
end
1
liwp

Cli-colorize gemを確認してください: http://github.com/stjohncj/cli-colorize/blob/master/README.rdoc

1
Chris

私の提案: Paint gem。文字列拡張を強制せず、256色をサポートします(256色以外の端末のフォールバックモードを使用)。

使用法:

puts Paint["I'm blue!", :blue]
puts Paint["I'm dark blue if your terminal supports it!", "#000044"]
1
J-_-L