module PecoSelector

Constants

Error
PECO_BIN
PecoUnavailableError
VERSION

Public Class Methods

ensure_peco_available() click to toggle source
# File lib/peco_selector.rb, line 14
def self.ensure_peco_available
  unless peco_available?
    raise PecoUnavailableError, "Peco command is unavailable. (see https://github.com/peco/peco#installation)"
  end
end
peco_available?() click to toggle source
# File lib/peco_selector.rb, line 10
def self.peco_available?
  system('which', PECO_BIN, out: File::NULL)
end
select_from(candidates, options = {}) click to toggle source
# File lib/peco_selector.rb, line 20
def self.select_from(candidates, options = {})
  ensure_peco_available

  prompt = options[:prompt] || "QUERY>"
  query  = options[:query] || ""

  stdout_str = nil
  stderr_str = nil

  Open3.popen3([PECO_BIN, "--null", "--prompt", prompt, "--query", query].shelljoin) do |stdin, stdout, stderr, wait_thr|
    candidates.each do |display, value|
      value ||= display
      stdin.puts "#{display}\x00#{value.object_id}"
    end
    stdin.close

    stdout_str = stdout.read
    stderr_str = stderr.read

    unless wait_thr.value.exitstatus == 0
      $stdout.print stdout_str
      $stderr.print stderr_str
      abort
    end
  end

  object_ids = stdout_str.strip.split("\n").map(&:to_i)

  candidates.map do |display, value|
    value || display
  end.select do |value|
    object_ids.include?(value.object_id)
  end
end