Hegwin.Me

溯洄从之,道阻且长。溯游从之,宛在水中央。

Ruby命令行格式化输出

在命令行输出内容,一般而言Ruby基本的方法都是够用的,比如putsprintsprintf系列;但如果要在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  |************************************************* |

Tags:

Posted on: 2019-12-27

Back