module PryEditline

def self.completion_proc

def self.completion_proc
  lambda do |s|
    if Readline.respond_to?(:point) && Readline.respond_to?(:line_buffer) &&
      Readline.point == 0 && Readline.line_buffer =~ /  $/
    then
      require 'tempfile'
      Tempfile.open(['readline-','.rb']) do |f|
        f.puts(Readline.line_buffer[0..-3])
        f.close
        system("#{editor} #{f.path}")
        File.read(f.path).chomp
      end
    else
      yield s
    end
  end
end

def self.editor

def self.editor
  if defined?(Pry)
    Pry.editor
  else
    ENV.values_at('VISUAL', 'EDITOR').compact.first || 'vi'
  end
end

def self.hijack_inputrc

def self.hijack_inputrc
  inputrc = [
    ENV['INPUTRC'],
    (File.expand_path('~/.inputrc') rescue nil),
    '/etc/inputrc'
  ].compact.detect { |x| File.exist?(x) }
  require 'tempfile'
  @file = Tempfile.new('inputrc')
  @file.puts <<-'EOF'
t keymap vi-insert
C-a": beginning-of-line
C-b": backward-char
C-d": delete-char
C-e": end-of-line
C-f": forward-char
C-k": kill-line
C-n": next-history
C-p": previous-history
C-x\C-l": redraw-current-line
C-x\C-e": "\C-e  \C-a\t\C-k\C-x\C-l"
C-o": "\C-e  \C-a\t\C-k\C-x\C-l"
t keymap vi-command
": "A  \C-a\t\C-k\C-x\C-l\e"
": "A  \C-a\t\C-k\C-x\C-l\e"
t keymap emacs
C-x\C-l": redraw-current-line
C-x\C-e": "\C-e  \C-a\t\C-k\C-x\C-l"
C-o":     "\C-e  \C-a\t\C-k\C-x\C-l"
f mode=vi
t keymap vi
ndif
F
  @file.puts "$include #{inputrc}" if inputrc
  @file.close
  ENV['INPUTRC'] = @file.path
end