2012-12-14 4 views

答えて

30

ああ、標準ライブラリは結局私の友人だと思われます。私が探していたのは、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に渡されます)。

+2

注意すべき点の1つは、readlineはシステムの基本となるreadlineのようなライブラリを使用していることです。これはlibeditかもしれません。ですから、readline ruby​​ libのいくつかの機能は動作しませんし、クラッシュを引き起こします。ドキュメントがオプションであることを避けるか、動作しない可能性があります。 – davetron5000

9

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 
+0

+1、ありがとう、これはクールな解決策です! – mydoghasworms

+0

手動で '@ completions'を手動で定義するのではなく、標準ライブラリのAbbrevを使わないのはなぜですか? – iconoclast

+0

チップをありがとう! Abbrevライブラリを使用するようにサンプルを更新しました。 –

-9

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

+0

Dudes、そのdownvotingでそれをカットしてください。車輪を再発明しないことは良い提案です。この私の答えは愛に値する。 –

関連する問題