2010-01-15 65 views
38

如何使我從基於命令行的ruby程序顏色輸出的puts命令成爲可能? 我會讚賞任何參考,我怎麼稱呼每種不同的顏色也。如何輸出不同顏色的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中正確輸出嗎?

+1

我在想紅寶石命令行的文本,當我問我的問題早在2010年的問題有超過11000的意見和外部鏈接的堆棧。當我形成我的問題時,我不會想到要尋找「彩色的ruby輸出」,事實上在搜索時找不到答案。暗示的答案可能是相似的,但問題提出的方式完全不同。我看到兩個問題都是不同的,但很高興能讓他們聯繫起來。 – Evolve 2014-03-03 05:42:52

回答

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'。檢查此線程以及:[Colorized Ruby輸出](http://stackoverflow.com/questions/1489183/colorized-ruby-output) – 2012-07-18 16:25:25

+0

謝謝你的答案。它解決了我的問題。 – suresh 2016-07-25 12:12:02

1

對於一個快速和骯髒的解決方案,您可以直接嵌入在你的字符串ASCII顏色代碼(\ E [XXM設置從現在開始使用到XX和\ E中的顏色[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碼。

編輯:關於不同的平臺:在unix機器上使用ASCII代碼不應有任何問題,但windows,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 
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 

現在你可以使用另一種字符串的方法:

"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 
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

呵呵,一個很好的擴展方法String:/ – tillda 2011-12-04 00:48:08

5

使用轉義序列\033,而不是作爲\e它是100%POSIX兼容和BSD-ISH將工作(例如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

想我會添加其他的解決方案,因爲它做的事情有點不同,包括多個顏色代碼:

首先一些例子...

使用方法鏈接:

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上給了幾個例子將代碼放大以包含優化,以便修改字符串的範圍。

這是基本的代碼:

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

不錯!感謝您的補充,我敢肯定,幾個窺視會發現這個有用的,愛巧妙的使用方法鏈接:) – Evolve 2016-08-04 08:16:32

相關問題