2017年6月27日火曜日

Linuxコマンドを補完するRubyスクリプト

Rubyによる補完スクリプトを作っていて気付きましたが、 rb-readlineはファイル補完はしてくれますが、Linuxコマンドの補完はしてくれないようです。 仕方ないので自作してみました。

まず、Linuxのコマンド一覧は以下で取得できるらしいです。これはMacでも使えます。 ただWindowsはコマンドを一覧表示できないようなので、cygwinの利用を想定するしかないかも知れません。
compgen -ac
このリストを利用したコマンド補完は以下で良さそうです。
require 'readline'  # gem install rb-readline

commands = `bash -ic "compgen -ac"`.split("\n")
Readline.completion_proc = proc {|s|
  last_command = Readline.line_buffer.split(/\s*[|&]\s*/)[-1]
  if last_command =~ /^.*\s+/
    Dir.glob('*').grep( /^#{Regexp.escape(s)}/ )
  else
    commands.grep( /^#{Regexp.escape(s)}/ )
  end
}
Readline.readline("Execute: ")
これでbashの補完とまったく同じ補完が実現できるようになりました。 以前作成したスクリプトも更新しておきました。

0 件のコメント: