2010-01-15 1 views
38

Как я могу сделать команды 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!" 

И я получаю другой текст я хочу в различных цветах, которые я хочу, Вы получаете идею.

Im, использующий Ubuntu, мне нужно было бы изменить свой подход, чтобы программа выходила правильно в diff os?

+1

Я думал рубиновый текст командной строки, когда я спросил мой вопрос еще в 2010 году вопрос имеет более 11 000 видов и стек внешние ссылки. Я бы не подумал искать «раскрашенный рубиновый выход», когда я формировал свой вопрос, и инфант не смог найти этот ответ в момент поиска. Подразумеваемые ответы могут быть похожими, но вопросы задаются совершенно по-другому. Я вижу, что оба вопроса отличаются друг от друга, с удовольствием связаны с ними. – Evolve

ответ

56

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

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.

+1

Чтобы сделать его еще проще в использовании, вы можете расширить класс String («Hello» .red): 'class String; def red; colorize (self, "\ 033 [31m"); конец; end'. Посмотрите также эту тему: [Цветной выход Ruby] (http://stackoverflow.com/questions/1489183/colorized-ruby-output) –

+0

Благодарим вас за ответ. Это решило мою проблему. – suresh

1

Для быстрого и грязного решения вы можете просто вставлять ASCII цветовые коды в ваших строк (\ е [XXm задает цвет, используемый теперь к XX и \ е [0м сброса цвета нормальный):

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 также поддерживают такие функции, как подчеркивание, мигание и выделение текста.

Существует также, что есть helper library , который имеет дело с реальными кодами ASCII.

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

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

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

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

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:

Чтобы узнать, все цвета просто выполняют это:

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 
38

Я считаю 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 
+3

huh, какой прекрасный способ расширить String:/ – tillda

5

последовательность использования побег \033 вместо \e, как это 100% POSIX совместимой и будет работать на BSD-МОГ (например OSX) систем, а также. последний является расширением gnu.

1

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

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

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

Использование Раскрасить перл! Проверьте это:

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 
3

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

Первые несколько примеров ...

Используя метод Chaining:

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 

Я привел еще несколько примеров на this gist I created и ex включил код, чтобы включить уточнения, чтобы изменения в 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 
+0

Nice one! Спасибо за добавление, я уверен, что несколько поисков найдут это полезным, полюбите умное использование цепочек методов :) – Evolve