2010-01-15 11 views
38

¿Cómo puedo hacer que los comandos puts salgan de un color de programa ruby ​​basado en línea de comandos? Me agradaría cualquier referencia a cómo llamo a cada color diferente también.Cómo dar salida a mi texto de la línea de comando de ruby ​​en diferentes colores

digamos que empezamos con esto ..

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

y me sale un texto diferente que quiero en diferentes colores que quiero, usted consigue la idea.

Estoy usando Ubuntu, ¿necesitaría cambiar mi enfoque para que el programa emita correctamente en los informes?

+1

Estaba pensando en la línea de comandos de texto rubí cuando le pregunté a mi pregunta de nuevo en 2010. La pregunta tiene más de 11.000 puntos de vista y una pila de enlaces externos. No habría pensado en buscar 'salida de rubí coloreada' cuando formulé mi pregunta y, de hecho, no pude encontrar esa respuesta en el momento de la búsqueda. Las respuestas implícitas pueden ser similares, pero las preguntas se plantean de manera bastante diferente. Veo ambas preguntas distintas, feliz de tenerlas vinculadas. – Evolve

Respuesta

56

he encontrado this article que describe una manera muy fácil de escribir textos de colores a la consola. El artículo describe este pequeño ejemplo que parece hacer el truco (he tomado la libertad de mejorarlo un poco):

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

mejor parece definir algunos de los colores. Puede ampliar el ejemplo cuando necesite también diferentes colores de fondo (ver la parte inferior del artículo).

Al usar Windows XP, el autor menciona el requisito de una gema llamada win32console.

+1

Para hacerlo aún más fácil de usar, puede extender la clase String ("Hello" .red): 'clase String; def rojo; colorear (self, "\ 033 [31m"); fin; fin'. Verifique también este hilo: [Salida Ruby coloreada] (http://stackoverflow.com/questions/1489183/colorized-ruby-output) –

+0

Gracias por la respuesta. Solucionó mi problema. – suresh

1

Para una solución rápida y sucia que sólo puede incrustar códigos de color ASCII en sus cadenas (\ e [XXm establece el color que se utilizará a partir de ahora a XX y \ e [0m restablecer el color a la normalidad):

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" 

Los códigos ASCII también admiten elementos como subrayado, parpadeo y resaltado de texto.

También parece haber un helper library disponible que trata con los códigos ASCII reales para usted.

:: con respecto a las diferentes plataformas: no debería tener ningún problema al usar códigos ASCII en máquinas Unix, pero Windows, AFAIK, no las admite de fábrica. Afortunadamente, hay un win32console gem que parece solucionarlo.

Puede utilizar el siguiente fragmento (que se encuentra en la página Veger vinculada a) para cargar la biblioteca win32console sólo en ventanas:

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

que he creado algo como esto:

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 

Ahora puede usar otro método de Cadena:

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

Para conocer todos los colores, simplemente ejecute esto:

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

encuentro el Colored gem para ser el más fácil y más limpio para su uso.

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, qué buena manera de extender String:/ – tillda

5

secuencia de uso de escape \033 en lugar de \e ya que es 100% posix compatible y funcionará en bsd-ish sistemas (por ejemplo OSX) también. el último es una extensión gnu.

1

Mi sugerencia: La gema paint. No impone extensiones de cadena y es compatible con 256 colores (con modo de retroceso para terminales que no son de 256 colores).

Uso:

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

Uso Colorear joya! Compruébelo usted mismo:

https://github.com/fazibear/colorize

Instalación:

sudo gem install colorize 

uso:

Pensamiento
require 'colorize' 

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

me gustaría añadir otra solución, ya que hace las cosas un poco diferente e incluye más códigos de color :

Primero algunos ejemplos ...

Utilizando el método de encadenamiento:

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] 

Utilizando el método style y la aplicación de múltiples atributos:

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

Esto se puede utilizar para el estilo tienda de atributos de alguna manera a una solicitud más adelante:

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 

He dado algunos ejemplos más en this gist I created y ex cambió el código para incluir refinamientos para que las modificaciones a String tengan un alcance.

Este es el código básico:

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

¡Bonito! Gracias por la adición, estoy seguro de que algunos píos encontrarán esto útil, les encanta el uso inteligente del método de encadenamiento :) – Evolve

Cuestiones relacionadas