2010-01-15 9 views
38

Come posso rendere i comandi di inserimento che emetto da un colore di programma di ruby ​​basato su riga di comando? Apprezzerei qualsiasi riferimento a come chiamo ogni diverso colore anche.Come stampare il testo della mia linea di ruby ​​in diversi colori

Diciamo partiamo con questo ..

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

e ottengo un testo diverso che voglio in diversi colori che voglio, si ottiene l'idea.

Im utilizzando Ubuntu, avrei bisogno di cambiare il mio approccio in modo che il programma emette correttamente in diff os?

+1

Stavo pensando di riga di comando di testo rubino quando ho chiesto la mia domanda di nuovo nel 2010. La questione ha più di 11.000 punti di vista e una pila di link esterni. Non avrei pensato di cercare "output color rubino" quando stavo formando la mia domanda e infatti non riuscivo a trovare quella risposta al momento della ricerca. Le risposte implicite possono essere simili ma le domande sono poste in modo diverso. Vedo entrambe le domande distinte, felice di averle comunque collegate. – Evolve

risposta

56

ho trovato this article descrivendo un modo molto facile scrivere testi colorati per la console. L'articolo descrive questo piccolo esempio, che sembra fare il trucco (mi sono permesso di migliorare leggermente):

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') + ']' 

migliore sembra di definire alcuni dei colori. È possibile estendere l'esempio quando sono necessari anche colori di sfondo diversi (vedere la parte inferiore dell'articolo).

Quando si utilizza Windows XP, l'autore menziona il requisito di una gemma chiamata win32console.

+1

Per rendere ancora più semplice l'utilizzo, è possibile estendere la classe String ("Hello" .red): 'class String; rosso def; colorize (self, "\ 033 [31m"); fine; FINE'. Controlla anche questo thread: [Colorized Ruby output] (http://stackoverflow.com/questions/1489183/colorized-ruby-output) –

+0

Grazie per la risposta. Ha risolto il mio problema. – suresh

1

Per una soluzione rapida e sporca si può semplicemente incorporare codici di colore ASCII nelle stringhe (\ e [xxM imposta il colore da utilizzare d'ora in poi al XX e \ e [0m ripristinare il colore normale):

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" 

I codici ASCII supportano anche la sottolineatura, il lampeggiamento e l'evidenziazione del testo.

Sembra anche che sia disponibile uno helper library che gestisce i codici ASCII effettivi.

Modifica: per quanto riguarda le diverse piattaforme: non si dovrebbero avere problemi con l'uso di codici ASCII su macchine Unix, ma Windows, AFAIK, non li supporta immediatamente. Fortunatamente c'è un win32console gem che sembra risolvere questo problema.

È possibile utilizzare il seguente frammento (sulla pagina Veger legata a) per caricare la libreria win32console solo su Windows:

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

ho creato qualcosa di simile:

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 

Ora puoi semplicemente usare un altro metodo di stringa:

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

Per conoscere tutti i colori basta eseguire questo:

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

trovo il Colored gem per essere il più semplice e pulito da usare.

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

eh, che bel modo di prolungare String:/ – tillda

5

sequenza escape uso \033 anziché \e come è al 100% posix compatibile e funziona su BSD-ish sistemi (ad esempio OSX) pure. il secondo è un'estensione di GNU.

1

Il mio consiglio: La gemma paint. Non impone estensioni di stringa e supporta 256 colori (con modalità fall-back per terminali non a 256 colori).

Usage:

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

Usa Colorize gioiello! Check it out:

https://github.com/fazibear/colorize

Installazione:

sudo gem install colorize 

utilizzo:

require 'colorize' 

puts "I am now red.".red 
puts "I am now blue.".green 
puts "I am a super coder".yellow 
3

Ho pensato di aggiungere un'altra soluzione, come fa le cose un po 'diverso e comprende più i codici colore :

Prima alcuni esempi ...

metodo usando concatenazioni:

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] 

Utilizzando il metodo style e l'applicazione di più attributi:

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

questo può essere usato allo stile negozio di attributi in qualche modo di applicare in seguito:

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 

Ho dato qualche altro esempio su this gist I created ed ex condizionato il codice per includere i perfezionamenti in modo che le modifiche a String vengano esaminate.

Questo è il codice di base:

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

Bello! Grazie per l'aggiunta, sono sicuro che qualche capolino lo troverà utile, adoro l'intelligente uso del metodo di concatenamento :) – Evolve

Problemi correlati