টার্মিনালে রঙিন রুবি আউটপুট [বন্ধ]


273

রুবি ব্যবহার করে, টার্মিনালের আউটপুটটির জন্য আমি কীভাবে পটভূমি এবং অগ্রভাগের পাঠ্য রঙিন করতে পারি?

আমার মনে আছে, পাস্কাল প্রোগ্রামিং করার সময় আমরা সবাই আমাদের নিজস্ব textcolor(…)ছোট ছোট শিক্ষাগত প্রোগ্রামগুলিকে আরও সুন্দর এবং উপস্থাপন করার জন্য নিজস্ব পদ্ধতি লিখতাম।

আমি রুবিতে এর সমতুল্য কোডিং সম্পর্কে কীভাবে যাব?


সুতরাং উদাহরণ হিসাবে "কমলা" রঙ পাওয়া অসম্ভব?
ম্যাট্রিক্স

উত্তর:


379

কালারাইজ করা আমার প্রিয় রত্ন! :-)

এটা দেখ:

https://github.com/fazibear/colorize

স্থাপন:

gem install colorize

ব্যবহার:

require 'colorize'

puts "I am now red".red
puts "I am now blue".blue
puts "Testing".yellow

2
কেউ যদি আমাকে বলতে পারে রঙিন সাইগউইন টার্মিনালে কাজ করে? আমি
সাইগউইনে

5
আপনি যদি win32consoleরত্নটি ইনস্টল করেন এবং তার require 'win32console'পরে উইন্ডোজ কমান্ড প্রম্পটে এটি দুর্দান্ত কাজ করবে colorize
বেন

2
@ বেন আমি ব্যক্তিগতভাবে এটি চেষ্টা করি নি, তবে রুবি ২.০ থেকে আপনার আর win32consoleরত্নটির দরকার নেই । github.com/luislavena/win32console/issues/…
ডেনিস

1
সুমলাইম টেক্সট কনসোল দিয়ে এই কাজটি করার কোনও উপায়?
নিপোনস

6
এই মণিটি জিপিএল এর অধীনে লাইসেন্স করা হয়েছে (তাই আমি মনে করি) এটি মালিকানাধীন সফ্টওয়্যারটিতে ব্যবহার করা যাবে না। jonathannen.com/2013/07/07/license-your-gems.html
আন্দ্রেই বোতালভ

249

উপরের উত্তরগুলির সংমিশ্রণে, আপনি এমন কিছু বাস্তবায়ন করতে পারেন যা রত্ন বর্ণের মতো কাজ করে অন্য কোনও নির্ভরতার প্রয়োজন ছাড়াই।

class String
  # colorization
  def colorize(color_code)
    "\e[#{color_code}m#{self}\e[0m"
  end

  def red
    colorize(31)
  end

  def green
    colorize(32)
  end

  def yellow
    colorize(33)
  end

  def blue
    colorize(34)
  end

  def pink
    colorize(35)
  end

  def light_blue
    colorize(36)
  end
end

আহ, সুন্দর সম্পাদনা নিক। হ্যাঁ অবশ্যই আত্মবিশ্বাসের চারপাশে যাওয়ার দরকার নেই। আমি যখন লিখেছিলাম তখন আমি ক্লান্ত হয়ে পড়েছিলাম :)
এরিক স্কোগলুন্ড

এটি কি উইন্ডোতেও কাজ করবে?
Alp


1
আমি রঙিন তুলনায় এটি আরও ভাল পছন্দ কারণ এটি কেবল অগ্রভূমির রঙ পরিবর্তন করে। colorize মনে হয় সবসময় পটভূমির রঙ পরিবর্তন করে।
jlyonsmith

1
আমি জানি আমি পার্টিতে দেরি করে ফেলেছি, তবে এখানে ক্লোজড ব্যবহার করা কি ভাল না?

215

স্ট্রিং ক্লাস পদ্ধতি হিসাবে (কেবল ইউনিক্স):

class String
def black;          "\e[30m#{self}\e[0m" end
def red;            "\e[31m#{self}\e[0m" end
def green;          "\e[32m#{self}\e[0m" end
def brown;          "\e[33m#{self}\e[0m" end
def blue;           "\e[34m#{self}\e[0m" end
def magenta;        "\e[35m#{self}\e[0m" end
def cyan;           "\e[36m#{self}\e[0m" end
def gray;           "\e[37m#{self}\e[0m" end

def bg_black;       "\e[40m#{self}\e[0m" end
def bg_red;         "\e[41m#{self}\e[0m" end
def bg_green;       "\e[42m#{self}\e[0m" end
def bg_brown;       "\e[43m#{self}\e[0m" end
def bg_blue;        "\e[44m#{self}\e[0m" end
def bg_magenta;     "\e[45m#{self}\e[0m" end
def bg_cyan;        "\e[46m#{self}\e[0m" end
def bg_gray;        "\e[47m#{self}\e[0m" end

def bold;           "\e[1m#{self}\e[22m" end
def italic;         "\e[3m#{self}\e[23m" end
def underline;      "\e[4m#{self}\e[24m" end
def blink;          "\e[5m#{self}\e[25m" end
def reverse_color;  "\e[7m#{self}\e[27m" end
end

এবং ব্যবহার:

puts "I'm back green".bg_green
puts "I'm red and back cyan".red.bg_cyan
puts "I'm bold and green and backround red".bold.green.bg_red

আমার কনসোলে:

এখানে চিত্র বর্ণনা লিখুন

অতিরিক্ত:

def no_colors
  self.gsub /\e\[\d+m/, ""
end

বিন্যাস অক্ষর মুছে ফেলা হয়

বিঃদ্রঃ

puts "\e[31m" # set format (red foreground)
puts "\e[0m"   # clear format
puts "green-#{"red".red}-green".green # will be green-red-normal, because of \e[0

বোল্ড অফ 21def bold; "\e[1m#{self}\e[22m" end
কানাত বোলাজার

@ কানাতবোলজার, কিছু সিস্টেম 21 সমর্থন করে । তবে আমি এটির সামর্থ্যের জন্য 22 এ পরিবর্তন করেছি। ধন্যবাদ।
ইভান ব্ল্যাক

1
এটি দুর্দান্ত, আমি এটি আমার রেল অ্যাপ্লিকেশনটিতে একটি প্রাথমিককরণে রেখেছি। একটি যাদুমন্ত্র মত কাজ করে!

চমত্কার টিপস। এত সহজ এবং কোনও নির্ভরতা নেই। খুব খুব ভাল কাজ!
মারাকাস

1
উইন্ডোজ 10 এ cmd.exe, puts "\e[0"ফর্ম্যাট সাফ করার জন্য কাজ করে না; puts "\e[0m"অবশ্যই ব্যবহার করা উচিত
NNnes

41

আমি এরিক স্কোগলন্ড এবং অন্যান্যদের উত্তরগুলির ভিত্তিতে মৌলিক রঙের মোডগুলি পরীক্ষা করার জন্য একটি সামান্য পদ্ধতি লিখেছিলাম।

#outputs color table to console, regular and bold modes
def colortable
  names = %w(black red green yellow blue pink cyan white default)
  fgcodes = (30..39).to_a - [38]

  s = ''
  reg  = "\e[%d;%dm%s\e[0m"
  bold = "\e[1;%d;%dm%s\e[0m"
  puts '                       color table with these background codes:'
  puts '          40       41       42       43       44       45       46       47       49'
  names.zip(fgcodes).each {|name,fg|
    s = "#{fg}"
    puts "%7s "%name + "#{reg}  #{bold}   "*9 % [fg,40,s,fg,40,s,  fg,41,s,fg,41,s,  fg,42,s,fg,42,s,  fg,43,s,fg,43,s,  
      fg,44,s,fg,44,s,  fg,45,s,fg,45,s,  fg,46,s,fg,46,s,  fg,47,s,fg,47,s,  fg,49,s,fg,49,s ]
  }
end

উদাহরণ আউটপুট: রুবি রঙিন


37

কনসোলে এটি করতে আপনি এএনএসআই এস্কেপ সিকোয়েন্সগুলি ব্যবহার করতে পারেন। আমি জানি এটি লিনাক্স এবং ওএসএক্সে কাজ করে, আমি নিশ্চিত নই যে উইন্ডোজ কনসোল (সেন্টিমিটার) এএনএসআই সমর্থন করে কিনা।

আমি জাভাতে এটি করেছি, তবে ধারণাগুলি একই।

//foreground color
public static final String BLACK_TEXT()   { return "\033[30m";}
public static final String RED_TEXT()     { return "\033[31m";}
public static final String GREEN_TEXT()   { return "\033[32m";}
public static final String BROWN_TEXT()   { return "\033[33m";}
public static final String BLUE_TEXT()    { return "\033[34m";}
public static final String MAGENTA_TEXT() { return "\033[35m";}
public static final String CYAN_TEXT()    { return "\033[36m";}
public static final String GRAY_TEXT()    { return "\033[37m";}

//background color
public static final String BLACK_BACK()   { return "\033[40m";}
public static final String RED_BACK()     { return "\033[41m";}
public static final String GREEN_BACK()   { return "\033[42m";}
public static final String BROWN_BACK()   { return "\033[43m";}
public static final String BLUE_BACK()    { return "\033[44m";}
public static final String MAGENTA_BACK() { return "\033[45m";}
public static final String CYAN_BACK()    { return "\033[46m";}
public static final String WHITE_BACK()   { return "\033[47m";}

//ANSI control chars
public static final String RESET_COLORS() { return "\033[0m";}
public static final String BOLD_ON()      { return "\033[1m";}
public static final String BLINK_ON()     { return "\033[5m";}
public static final String REVERSE_ON()   { return "\033[7m";}
public static final String BOLD_OFF()     { return "\033[22m";}
public static final String BLINK_OFF()    { return "\033[25m";}
public static final String REVERSE_OFF()  { return "\033[27m";}

7
এটি কাজ করে এবং রত্নটির প্রয়োজন না রাখার সুবিধা রয়েছে যা কিছু লোককে বিরক্ত করতে পারে।
টমাসডাব্লু

3
উইন্ডোজ কনসোলটি সত্যই এএনএসআই কোডগুলিকে সমর্থন করে।
বেন

16

অন্য উত্তরগুলি বেশিরভাগ লোকের পক্ষে কাজটি ভাল করে দেবে, তবে এটি করার "সঠিক" ইউনিক্স পদ্ধতির কথা উল্লেখ করা উচিত। যেহেতু সমস্ত প্রকারের পাঠ্য টার্মিনালগুলি এই অনুক্রমগুলিকে সমর্থন করে না, আপনি টার্মিনো ডাটাবেসটি জিজ্ঞাসা করতে পারেন , বিভিন্ন পাঠ্য টার্মিনালের ক্যাপাবিলাইটের উপর একটি বিমূর্ততা। ব্যবহারে সফ্টওয়্যার টার্মিনাল আজ সাধারণত ANSI সিকোয়েন্স সমর্থন - - অধিকাংশ ক্ষেত্রে এই ঐতিহাসিক আগ্রহের মনে হতে পারে কিন্তু এটি আছে (অন্তত) এক ব্যবহারিক প্রভাব: কখনও কখনও এনভায়রনমেন্ট ভেরিয়েবল সেট পাবে দরকারী TERMকরার dumbএমন সব স্টাইলিং এড়াতে, উদাহরণস্বরূপ কোনও পাঠ্য ফাইলে আউটপুট সংরক্ষণ করার সময়। এছাড়াও, জিনিসগুলি সঠিকভাবে করা ভাল লাগে । :-)

আপনি রুবি-টার্মিনফো রত্ন ব্যবহার করতে পারেন । এটি ইনস্টল করতে কিছু সি সংকলন প্রয়োজন; আমি এটি আমার উবুন্টু 14.10 সিস্টেমের সাথে ইনস্টল করতে সক্ষম হয়েছি:

$ sudo apt-get install libncurses5-dev
$ gem install ruby-terminfo --user-install

তারপরে আপনি এই জাতীয় ডাটাবেসটি জিজ্ঞাসা করতে পারেন ( কী কোডগুলি উপলব্ধ রয়েছে তার তালিকার জন্য টার্মিনফো ম্যান পৃষ্ঠা দেখুন ):

require 'terminfo' 
TermInfo.control("bold")
puts "Bold text"
TermInfo.control("sgr0")
puts "Back to normal."
puts "And now some " + TermInfo.control_string("setaf", 1) + 
     "red" + TermInfo.control_string("sgr0") + " text."

এই জিনিসগুলিকে ব্যবহার করার জন্য আরও সহজ করে তুলতে আমি এখানে একটি ছোট্ট মোড়কের ক্লাস রেখেছি।

require 'terminfo'

class Style
  def self.style() 
    @@singleton ||= Style.new
  end

  colors = %w{black red green yellow blue magenta cyan white}
  colors.each_with_index do |color, index|
    define_method(color) { get("setaf", index) }
    define_method("bg_" + color) { get("setab", index) }
  end

  def bold()  get("bold")  end
  def under() get("smul")  end
  def dim()   get("dim")   end
  def clear() get("sgr0")  end

  def get(*args)
    begin
      TermInfo.control_string(*args)
    rescue TermInfo::TermInfoError
      ""
    end
  end
end

ব্যবহার:

c = Style.style
C = c.clear
puts "#{c.red}Warning:#{C} this is #{c.bold}way#{C} #{c.bg_red}too much #{c.cyan + c.under}styling#{C}!"
puts "#{c.dim}(Don't you think?)#{C}"

উপরের রুবি স্ক্রিপ্টের আউটপুট

(সম্পাদনা) অবশেষে, আপনি যদি কোনও রত্নের প্রয়োজন না চান তবে আপনি এখানে বর্ণিত হিসাবেtput প্রোগ্রামটির উপর নির্ভর করতে পারেন - রুবি উদাহরণ:

puts "Hi! " + `tput setaf 1` + "This is red!" + `tput sgr0`

4
মেজর, ব্যবহারের জন্য প্রধান +1 tput। চুলের ক্ষতি কতটা tputআমাকে বাঁচিয়েছে তা স্পষ্ট করে বলতেও পারি না ।
পিয়ার্স

14

আমি এই পদ্ধতিটি তৈরি করতে সাহায্য করতে পারি। এটি কোনও বড় বিষয় নয় তবে এটি কাজ করে:

def colorize(text, color = "default", bgColor = "default")
    colors = {"default" => "38","black" => "30","red" => "31","green" => "32","brown" => "33", "blue" => "34", "purple" => "35",
     "cyan" => "36", "gray" => "37", "dark gray" => "1;30", "light red" => "1;31", "light green" => "1;32", "yellow" => "1;33",
      "light blue" => "1;34", "light purple" => "1;35", "light cyan" => "1;36", "white" => "1;37"}
    bgColors = {"default" => "0", "black" => "40", "red" => "41", "green" => "42", "brown" => "43", "blue" => "44",
     "purple" => "45", "cyan" => "46", "gray" => "47", "dark gray" => "100", "light red" => "101", "light green" => "102",
     "yellow" => "103", "light blue" => "104", "light purple" => "105", "light cyan" => "106", "white" => "107"}
    color_code = colors[color]
    bgColor_code = bgColors[bgColor]
    return "\033[#{bgColor_code};#{color_code}m#{text}\033[0m"
end

এটি কীভাবে ব্যবহার করবেন তা এখানে:

puts "#{colorize("Hello World")}"
puts "#{colorize("Hello World", "yellow")}"
puts "#{colorize("Hello World", "white","light red")}"

সম্ভাব্য উন্নতিগুলি হতে পারে:

  • colors এবং bgColors প্রতিটি সময় পদ্ধতি বলা হয় সংজ্ঞায়িত করা হচ্ছে এবং তারা পরিবর্তন করবেন না।
  • অন্যান্য অপশন মত যোগ bold, underline,dim , ইত্যাদি

এই পদ্ধতি জন্য কাজ করে না p, যেমন pএকটি করে inspectতার যুক্তি। উদাহরণ স্বরূপ:

p "#{colorize("Hello World")}"

"\ ই [0; 38 মিঃ হেলো ওয়ার্ল্ড \ ই [0 মি" প্রদর্শন করবে

আমি এটা পরীক্ষিত puts, printএবং লগার মণি, এবং এটি কাজ করে জরিমানা।


আমি এটিকে উন্নত করেছি colorsএবং ক্লাস করেছি তাই bgColorsক্লাস ধ্রুবক এবংcolorize এটি একটি শ্রেণি পদ্ধতি:

সম্পাদনা: উন্নত কোড শৈলী, শ্রেণি পরিবর্তকের পরিবর্তে সংজ্ঞায়িত ধ্রুবক, স্ট্রিংয়ের পরিবর্তে প্রতীক ব্যবহার করে, আরও কিছু বিকল্প যুক্ত করা যেমন বোল্ড, ইটালিকস ইত্যাদি

class Colorizator
    COLOURS = { default: '38', black: '30', red: '31', green: '32', brown: '33', blue: '34', purple: '35',
                cyan: '36', gray: '37', dark_gray: '1;30', light_red: '1;31', light_green: '1;32', yellow: '1;33',
                light_blue: '1;34', light_purple: '1;35', light_cyan: '1;36', white: '1;37' }.freeze
    BG_COLOURS = { default: '0', black: '40', red: '41', green: '42', brown: '43', blue: '44',
                   purple: '45', cyan: '46', gray: '47', dark_gray: '100', light_red: '101', light_green: '102',
                   yellow: '103', light_blue: '104', light_purple: '105', light_cyan: '106', white: '107' }.freeze

    FONT_OPTIONS = { bold: '1', dim: '2', italic: '3', underline: '4', reverse: '7', hidden: '8' }.freeze

    def self.colorize(text, colour = :default, bg_colour = :default, **options)
        colour_code = COLOURS[colour]
        bg_colour_code = BG_COLOURS[bg_colour]
        font_options = options.select { |k, v| v && FONT_OPTIONS.key?(k) }.keys
        font_options = font_options.map { |e| FONT_OPTIONS[e] }.join(';').squeeze
        return "\e[#{bg_colour_code};#{font_options};#{colour_code}m#{text}\e[0m".squeeze(';')
    end
end

আপনি এটি করে এটি ব্যবহার করতে পারেন:

Colorizator.colorize "Hello World", :gray, :white
Colorizator.colorize "Hello World", :light_blue, bold: true
Colorizator.colorize "Hello World", :light_blue, :white, bold: true, underline: true

13

কোনও রত্নের প্রয়োজন ছাড়াই এটিকে কাজ করতে আমি যা করেছি তা এখানে:

def red(mytext) ; "\e[31m#{mytext}\e[0m" ; end
puts red("hello world")

তারপরে কেবলমাত্র উদ্ধৃতিগুলিতে থাকা পাঠ্যটি রঙিন, এবং আপনি আপনার নিয়মিত নির্ধারিত প্রোগ্রামটিতে ফিরে এসেছেন।


3
আমার জন্য কাজ করে না। আমি পেয়েছি ঠিক:e[32mSOMETEXT
অস্কার গডসন

হওয়া উচিত: প্রথম এস্কেপ অক্ষর একটি টাইপো ছিল "\e(...)"পরিবর্তে"e\(...)"
বাম বন্ধনী

12

আমি কয়েকটি পেয়েছি:

http://github.com/ssoroka/ansi/tree/master

উদাহরণ:

puts ANSI.color(:red) { "hello there" }
puts ANSI.color(:green) + "Everything is green now" + ANSI.no_color

http://flori.github.com/term-ansicolor/

উদাহরণ:

print red, bold, "red bold", reset, "\n"
print red(bold("red bold")), "\n"
print red { bold { "red bold" } }, "\n"

http://github.com/sickill/rainbow

উদাহরণ:

puts "this is red".foreground(:red) + " and " + "this on yellow bg".background(:yellow) + " and " + "even bright underlined!".underline.bright

আপনি যদি উইন্ডোজটিতে থাকেন তবে রঙগুলির জন্য সমর্থন সক্ষম করার জন্য আপনার একটি "মণি ইনস্টল উইন 32 কনসোল" করতে হবে।

এছাড়াও আপনার নিজের মণি তৈরি করতে গেলে রঙিন কনসোল রুবি-স্ক্রিপ্ট আউটপুটটি কার্যকর। এটি ব্যাখ্যা করে যে কীভাবে স্ট্রিংগুলিতে এএনএসআই রঙ যুক্ত করা যায়। আপনি এই জ্ঞানটি কোনও ক্লাসে মোড়ানোর জন্য ব্যবহার করতে পারেন যা স্ট্রিং বা কিছু প্রসারিত করে।


8

এটি আপনাকে সহায়তা করতে পারে: রঙিন রুবি আউটপুট


1
এবং এই লিঙ্কটিতে নমুনাটি উন্নত করে আপনি স্ট্রিং ক্লাসটি বাড়ানোর জন্য এটি আরও সহজ করে তুলতে পারেন ("হ্যালো"। রেড):class String; def red; colorize(self, "\033[31m"); end; end
অ্যাড্রিয়ানো পি

3

আমি উপরের উত্তরগুলি দরকারী বলে মনে করি তবে আমি কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করে লগ আউটপুটের মতো কিছু রঙিন করতে চাইলে বিলটি ফিট করে না । নিম্নলিখিতটি আমার জন্য সমস্যাটি সমাধান করেছে:

red = 31
green = 32
blue = 34

def color (color=blue)
  printf "\033[#{color}m";
  yield
  printf "\033[0m"
end

color { puts "this is blue" }
color(red) { logger.info "and this is red" }

আমি আসা করি এটা সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.