22

コマンドラインアプリ(必要に応じてシェル)をRubyで作成したいと思います。

ユーザーが特定の時点でTabキーを押して、値の入力を提供できるようにしたいと思います。

どうすればよいですか?どのライブラリを使用する必要がありますか?いくつかのコード例を教えていただけますか?

4

3 に答える 3

32

ああ、結局のところ、標準ライブラリは私の友達のようです。私が探していたのはReadlineライブラリです。

ここでのドキュメントと例:http ://www.ruby-doc.org/stdlib-1.9.3/libdoc/readline/rdoc/Readline.html

特に、これはそのページからの完了がどのように機能するかを示す良い例です。

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は、最後に入力された単語のみを受け取ります。これまでに行全体を入力する場合(コンテキスト固有の補完を実行するため)、上記のコードに次の行を追加します。

Readline.completer_word_break_characters = "" #Pass whole line to proc each time

(これはデフォルトで単語の境界を表す文字のリストに設定され、最後の単語のみがprocに渡されます)。

于 2012-12-14T10:10:45.150 に答える
10

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
于 2012-12-15T03:08:48.667 に答える
-10

Emacsを使用してコマンドラインRubyアプリを実行することをお勧めします。Emacsでは、SOの友達が最近、オートコンプリートタブの補完を解決するのを手伝ってくれました(ここここ)。オートコンプリートは、これまでで最もインテリジェントな単語補完ツールのようです。

于 2012-12-15T03:55:48.140 に答える