module PecoSelector
Constants
- Error
- PECO_BIN
- 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