Top Level Namespace

Defined Under Namespace

Modules: Colored, Enumerable, UPM Classes: DateTime, File, FreshportsSearch

Instance Method Summary collapse

Instance Method Details

#lesspipe(*args) ⇒ Object

Create scrollable output via less!

This command runs ‘less` in a subprocess, and gives you the IO to its STDIN pipe so that you can communicate with it.

Example:

lesspipe do |less|
  50.times { less.puts "Hi mom!" }
end

The default less parameters are:

  • Allow colour

  • Don’t wrap lines longer than the screen

  • Quit immediately (without paging) if there’s less than one screen of text.

You can change these options by passing a hash to ‘lesspipe`, like so:

lesspipe(:wrap=>false) { |less| less.puts essay.to_s }

It accepts the following boolean options:

:color  => Allow ANSI colour codes?
:wrap   => Wrap long lines?
:always => Always page, even if there's less than one page of text?
:tail   => Seek to the end of the stream
:search => <regexp> searches the output using the "/" operator


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/upm/lesspipe.rb', line 29

def lesspipe(*args)
  if args.any? and args.last.is_a?(Hash)
    options = args.pop
  else
    options = {}
  end

  output = args.first if args.any?

  # Don't page, just output to STDOUT
  if options[:disabled]
    if output
      puts output
    else
      yield STDOUT
    end
    return
  end

  params = []
  params << "-R" unless options[:color]  == false
  params << "-S" unless options[:wrap]   == true
  params << "-F" unless options[:always] == true
  params << "-X"
  
  if regexp = options[:search]
    params << "+/#{regexp}"
  elsif options[:tail] == true
    params << "+\\>"
    $stderr.puts "Seeking to end of stream..."
  end

  IO.popen("less #{params * ' '}", "w") do |less|
    if output
      less.puts output
    else
      yield less
    end
  end

rescue Errno::EPIPE, Interrupt
  # less just quit -- eat the exception.
end