Как сделать приложение командной строки ruby с помощью пейджера?

Я делаю инструмент командной строки с помощью Ruby. Он будет печатать много текста на экране. В настоящее время я использую Shell pipeline (may_app | more) для этого. Но я думаю, что лучше иметь пейджер по умолчанию.

это так же, как то, что вы видите, когда execute git log . Можно отключить пейджер с помощью git --nopager log.

Я сделал довольно много работы google и найти один драгоценный камень:hirb , но это кажется немного перебор.

после многих попыток я использую shell обертка для этого:

#!/bin/bash

# xray.rb is the core script
# doing the main logic and will
# output many rows of text on 
# screen
XRAY=$HOME/fdev-xray/xray.rb

if [ "--nopager" == "" ]; then
    shift
    $XRAY $*
else
    $XRAY $* | more
fi

это работает. Но есть ли лучший способ?

2 ответов


Вы делаете все правильно. Но вместо этого с помощью more вам лучше получить пейджер от $PAGER переменная окружения, если таковая имеется.

некоторые люди предпочитают less to more например, и другие имеют свои любимые параметры парсера, установленные в этом var.


вы можете использовать трубу в Ruby через вызов system и предоставить параметры (вместе с хорошим интерфейсом справки), как так:

require 'optparse'

pager = ENV['PAGER'] || 'more'

option_parser = OptionParser.new do |opts|
  opts.on("--[no-]pager",
          "[don't] page output using #{pager} (default on)") do |use_pager|
    pager = nil unless use_pager
  end
end

option_parser.parse!

command = "cat #{ARGV[0]}"
command += " | #{pager}" unless pager.nil?
unless system(command)
  STDERR.puts "Problem running #{command}"
  exit 1
end

теперь, вы поддерживаете --pager и --no-pager в командной строке, что приятно делать.