2011-12-13 15 views
6

Sto creando uno strumento da riga di comando usando Ruby. Stamperà molto testo sullo schermo. Attualmente, sto usando la pipeline di shell (may_app | more) per farlo. Ma penso che sia meglio avere un cercapersone predefinito.Come creare un'applicazione a riga di comando ruby ​​con pager?

È proprio come quello che si vede quando si esegue git log. Si può disabilitare il cercapersone usando git --nopager log.

Ho fatto abbastanza lavoro su Google e ho trovato un gioiello: hirb, ma sembra un po 'eccessivo.

Dopo molti tentativi, sono corrente utilizzando shell wrapper per farlo:

#!/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 

Funziona. Ma c'è un modo migliore?

risposta

3

Lo stai facendo bene. Ma usando invece more è meglio ottenere un cercapersone dalla variabile di ambiente $PAGER, se presente.

Alcune persone preferiscono less a more per esempio, e altri hanno le loro opzioni di parser preferite impostate in questa var.

+0

Buon consiglio! Grazie, zed. – qhwa

2

È possibile utilizzare il tubo in Ruby tramite una chiamata a system e fornire le opzioni (insieme con una bella interfaccia aiuto) in questo modo:

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 

Ora, è il supporto --pager e --no-pager sulla riga di comando, che è bello da fare

+0

Questo è diverso da quello che voglio. Voglio usare il cercapersone da 'system'. – qhwa

Problemi correlati