class Tmux

Attributes

win[R]

Public Class Methods

new(shell = :bash) click to toggle source
# File lib/helpers/fzf/test/test_go.rb, line 75
def initialize(shell = :bash)
  @win = go(%W[new-window -d -P -F #I #{Shell.send(shell)}]).first
  go(%W[set-window-option -t #{@win} pane-base-index 0])
  return unless shell == :fish

  send_keys 'function fish_prompt; end; clear', :Enter
  self.until(&:empty?)
end

Public Instance Methods

capture() click to toggle source
# File lib/helpers/fzf/test/test_go.rb, line 100
def capture
  go(%W[capture-pane -p -J -t #{win}]).map(&:rstrip).reverse.drop_while(&:empty?).reverse
end
focus() click to toggle source
# File lib/helpers/fzf/test/test_go.rb, line 88
def focus
  go(%W[select-window -t #{win}])
end
kill() click to toggle source
# File lib/helpers/fzf/test/test_go.rb, line 84
def kill
  go(%W[kill-window -t #{win}])
end
paste(str) click to toggle source
# File lib/helpers/fzf/test/test_go.rb, line 96
def paste(str)
  system('tmux', 'setb', str, ';', 'pasteb', '-t', win, ';', 'send-keys', '-t', win, 'Enter')
end
prepare() click to toggle source
# File lib/helpers/fzf/test/test_go.rb, line 148
def prepare
  tries = 0
  begin
    self.until(true) do |lines|
      message = "Prepare[#{tries}]"
      send_keys ' ', 'C-u', :Enter, message, :Left, :Right
      lines[-1] == message
    end
  rescue Minitest::Assertion
    (tries += 1) < 5 ? retry : raise
  end
  send_keys 'C-u', 'C-l'
end
send_keys(*args) click to toggle source
# File lib/helpers/fzf/test/test_go.rb, line 92
def send_keys(*args)
  go(%W[send-keys -t #{win}] + args.map(&:to_s))
end
until(refresh = false) { |lines| ... } click to toggle source
# File lib/helpers/fzf/test/test_go.rb, line 104
def until(refresh = false)
  lines = nil
  begin
    wait do
      lines = capture
      class << lines
        def counts
          lazy
            .map { |l| l.scan(%r{^. ([0-9]+)/([0-9]+)( \(([0-9]+)\))?}) }
            .reject(&:empty?)
            .first&.first&.map(&:to_i)&.values_at(0, 1, 3) || [0, 0, 0]
        end

        def match_count
          counts[0]
        end

        def item_count
          counts[1]
        end

        def select_count
          counts[2]
        end

        def any_include?(val)
          method = val.is_a?(Regexp) ? :match : :include?
          find { |line| line.send(method, val) }
        end
      end
      yield(lines).tap do |ok|
        send_keys 'C-l' if refresh && !ok
      end
    end
  rescue Minitest::Assertion
    puts $ERROR_INFO.backtrace
    puts '>' * 80
    puts lines
    puts '<' * 80
    raise
  end
  lines
end

Private Instance Methods

go(args) click to toggle source
# File lib/helpers/fzf/test/test_go.rb, line 164
def go(args)
  IO.popen(%w[tmux] + args) { |io| io.readlines(chomp: true) }
end