5

私はRubyを使用して、Pubmedを検索するための小さなコマンドラインユーティリティを作成しています。現在、ユーザーにクエリの入力を求めて結果を表示しています。ユーザーは、クエリに追加するか、まったく新しいクエリを入力するかを選択できます。現在のクエリを編集する機能を追加したいと思います。つまり、プロンプトには、次のように、前のクエリの編集可能なバージョンが事前に入力されている必要があります。

Enter query: <PREVIOUS QUERY HERE>

プロンプトの横にある前のクエリを印刷するのは簡単ですが、ユーザーが自分で入力したかのように、この出力を編集可能にするにはどうすればよいですか?

@casper:キャスパーの回答ありがとうございます。私はあなたが以下に提供したコードを試しました、そしてそれは確かにそれ自身で働きます。不思議なことに、宝石で使用しようとするとうまくいかないようです。私の宝石はdb_hippoと呼ばれています。gemspecに依存関係としてrb-readlineを追加し、lib / db_hippo/rb-readline.rbにRbReadlineの拡張機能を追加しました。

module DbHippo
  module RbReadline
    <CASPER'S EXTENSION HERE>
  end
end

DbHippoの別のサブモジュールであるDbHippo::Sourceの機能を使用したいと思います。DbHippo :: Sourceで、上部に追加しました:

require 'rb-readline'
require 'db_hippo/rb-readline'

次に、DbHippo :: Sourceのメソッドの1つで、次のようになります。

RbReadline.prefill_prompt(query)
query = Readline.readline("Query: ", true)

クエリ変数は間違いなく空ではありませんが、このコンテキストでは何らかの理由でプロンプトが事前に入力されません。また、拡張子をDbHippoのサブモジュールにせずに同じファイル(lib / db_hippo / rb-readline)に入れると、次のエラーが発生します:初期化されていない定数DbHippo :: Source :: Readline(NameError)

query = Readline.readline("Query: ", true)

これはすべて、モジュールの適切な命名、requireステートメント、およびgemと関係があるようです。これは私が構築しようとした最初の宝石です。ここで何が問題になっているのでしょうか。

4

2 に答える 2

5

たぶん、グーグルはこれが役に立つと思うでしょう。

Ruby 2.1のプレーンReadlineでは、次を使用できます。

def ask(prompt, default=nil)

  if default
    Readline.pre_input_hook = -> {
      Readline.insert_text(default)
      Readline.redisplay
      # prevent re-trigger on every `readline`
      Readline.pre_input_hook = nil
    }
  end
  data = Readline.readline("#{prompt}: ")
  return data.chomp
end

ask("MOAR...?", "COMPUTARS!") # displays: MOAR...? COMPUTARS!

プロンプトで、テキストCOMPUTARS!は編集可能になります

于 2014-06-01T00:04:57.193 に答える
3

あなたはRbReadlineでそれを行うことができます:

require 'rubygems'
require 'rb-readline'

module RbReadline
  def self.prefill_prompt(str)
    @rl_prefill = str
    @rl_startup_hook = :rl_prefill_hook
  end

  def self.rl_prefill_hook
    rl_insert_text @rl_prefill if @rl_prefill
    @rl_startup_hook = nil
  end
end

RbReadline.prefill_prompt("Previous query")
str = Readline.readline("Enter query: ", true)

puts "You entered: #{str}"
于 2012-06-14T02:17:33.780 に答える