私はRubyでコマンドラインアプリを書くつもりです。タブ補完をサポートするRubyコマンドラインアプリの作成方法は?
特定のポイントでTabキーを押して、値の入力を完了できるようにします。
どうすればよいですか?どのライブラリを使用する必要がありますか?いくつかのコード例を教えてください。
私はRubyでコマンドラインアプリを書くつもりです。タブ補完をサポートするRubyコマンドラインアプリの作成方法は?
特定のポイントでTabキーを押して、値の入力を完了できるようにします。
どうすればよいですか?どのライブラリを使用する必要がありますか?いくつかのコード例を教えてください。
ああ、標準ライブラリは結局私の友人だと思われます。私が探していたのは、Readlineライブラリです。ここ
ドクと例:
require 'readline'
LIST = [
'search', 'download', 'open',
'help', 'history', 'quit',
'url', 'next', 'clear',
'prev', 'past'
].sort
comp = proc { |s| LIST.grep(/^#{Regexp.escape(s)}/) }
Readline.completion_append_character = " "
Readline.completion_proc = comp
while line = Readline.readline('> ', true)
p line
end
注:procが唯一の最後の単語入力された受信特にhttp://www.ruby-doc.org/stdlib-1.9.3/libdoc/readline/rdoc/Readline.html
が、これは完成がどのように機能するかを示すために、そのページから良い例です。あなたがしたい場合は、全体のラインは、(あなたはコンテキスト固有の補完をしたいので)これまでに入力された、上記のコードに次の行を追加します(これはデフォルトで表す文字のリストに設定されている
Readline.completer_word_break_characters = "" #Pass whole line to proc each time
単語の境界線となり、最後の単語だけがあなたのprocに渡されます)。
Readlineライブラリは優れており、何度も使用しています。しかし、あなたがそれを楽しくするために作っているのであれば、自分で完成させることもできます。ここで
はシンプル完了スクリプトです:
require 'io/console' # Ruby 1.9
require 'abbrev'
word = ""
@completions = Abbrev.abbrev([
"function",
"begin"
])
while (char = $stdin.getch) != "\r"
word += char
word = "" if char == " "
if char == "\t"
if comp = @completions[word = word[0..-2]]
print comp[word.length..-1]
end
else
print char
end
end
puts
+1、ありがとう、これはクールな解決策です! – mydoghasworms
手動で '@ completions'を手動で定義するのではなく、標準ライブラリのAbbrevを使わないのはなぜですか? – iconoclast
チップをありがとう! Abbrevライブラリを使用するようにサンプルを更新しました。 –
注意すべき点の1つは、readlineはシステムの基本となるreadlineのようなライブラリを使用していることです。これはlibeditかもしれません。ですから、readline ruby libのいくつかの機能は動作しませんし、クラッシュを引き起こします。ドキュメントがオプションであることを避けるか、動作しない可能性があります。 – davetron5000