Как вывести мой текст командной строки ruby ​​разными цветами - PullRequest
40 голосов
/ 15 января 2010

Как сделать так, чтобы команды put, которые я выводил из цвета программы ruby ​​на основе командной строки? Я был бы признателен за любые ссылки на то, как я называю каждый другой цвет также.

Допустим, мы начнем с этого ..

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?

Ответы [ 10 ]

57 голосов
/ 15 января 2010

Я нашел эту статью , описывающую очень простой способ записи цветных текстов на консоль. В статье описывается этот небольшой пример, который, кажется, делает свое дело (я позволил себе немного улучшить его):

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 .

38 голосов
/ 15 января 2010

Мне кажется, Цветной камень самый простой и чистый в использовании.

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 
6 голосов
/ 15 января 2010

Я создал что-то вроде этого:

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
5 голосов
/ 04 мая 2011

используйте escape-последовательность \033 вместо \e, поскольку она на 100% совместима с posix и будет работать также в системах bsd-ish (например, osx). последний является расширением GNU.

4 голосов
/ 03 августа 2016

Думаю, я бы добавил другое решение, так как оно работает немного по-другому и включает больше цветовых кодов:

Первые примеры ...

Использование метода цепочки:

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
1 голос
/ 20 ноября 2014

Используйте 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 голос
/ 07 июля 2011

Мое предложение: краска драгоценный камень. Он не требует расширения строк и поддерживает 256 цветов (с резервным режимом для не 256-цветных терминалов).

Использование:

puts Paint["I'm blue!", :blue]
puts Paint["I'm dark blue if your terminal supports it!", "#000044"]
1 голос
/ 24 октября 2010

Проверьте драгоценный камень cli-colorize: http://github.com/stjohncj/cli-colorize/blob/master/README.rdoc

1 голос
/ 15 января 2010

Для быстрого и грязного решения вы можете просто встроить цветовые коды 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 для вас.

Редактировать : в отношении различных платформ: у вас не должно возникнуть проблем с использованием кодов ASCII на Unix-машинах, но Windows, AFAIK, не поддерживает их из коробки. К счастью, есть win32console gem , который, кажется, исправляет это.

Вы можете использовать следующий фрагмент (находится на странице, на которую ссылается Veger), чтобы загрузить библиотеку win32console только в Windows:

begin
  require 'Win32/Console/ANSI' if PLATFORM =~ /win32/
rescue LoadError
  raise 'You must gem install win32console to use color on Windows'
end
1 голос
/ 15 января 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...