Ruby命令行格式化输出
Format Your Output in Terminal with Ruby
如果我们要在命令行内输出内容,一般而言Ruby基本的方法都是够用的,比如puts
、print
、sprintf
系列;但如果要在terminal输出颜色,表格进度条等,就会比较难以实现了。
这里小节下自己探索后感觉好用的gems:
彩色输出(基于ANSI):rainbow
表格输出:terminal-table
大综合(包含彩色、表格和进度条):formatador
Rainbow
在控制台里输出彩色文字的底层机制来自ANSI转义序列(ANSI escape sequences),比如输出红色的单词Red,应为 "\e[31mRed\e[0m"
:
puts "\e[31mRed\e[0m"
=> Red
自己去组织这个转义序列太麻烦了,所幸rainbow可以帮我们做这个事情,使用其他也很简单(如下),前景色、背景色、下划线等格式都有支持,更多功能参考下他的README就好 rainbow
Rainbow("hello").red
# => "\e[31mhello\e[0m" ("hello" if not on TTY)
Rainbow("hola!").blue.bright.underline
# => "\e[34m\e[1m\e[4mhola!\e[0m"
Terminal-table
terminal-table 的使用也是相当简单和直接,增加表头和设置对齐也很容易:
require 'terminal-table'
rows = []
rows << ['One', 1]
rows << ['Two', 2]
rows << ['Three', 3]
table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows
# > puts table
#
# +-------+--------+
# | Word | Number |
# +-------+--------+
# | One | 1 |
# | Two | 2 |
# | Three | 3 |
# +-------+--------+
formatador
formatador 在我看来是一个大而全的格式化工具,使用起来也很直接:
颜色
Formatador.display_line('[green]Hello World[/]')
表格
table_data = [
{ :name => "Joe", :food => "Burger" },
{ :name => "Bill", :food => "French fries" }
]
Formatador.display_table(table_data)
#=> +------+--------------+
# | name | food |
# +------+--------------+
# | Joe | Burger |
# +------+--------------+
# | Bill | French fries |
# +------+--------------+
进度条
total = 1000
progress = Formatador::ProgressBar.new(total)
1000.times do
sleep 0.01
progress.increment
end
#=> 978/1000 |************************************************* |