Как сделать приложение для командной строки ruby ​​с пейджером? - PullRequest
6 голосов
/ 13 декабря 2011

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

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

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

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

#!/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" == "$1" ]; then
    shift
    $XRAY $*
else
    $XRAY $* | more
fi

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

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

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

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

2 голосов
/ 13 декабря 2011

Вы можете использовать канал в 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 в командной строке, что приятно делать.

...