5
(completing-read
 "Complete a foo: "
 '(("foobar1" "~/foobar1/") ("barfoo" "/usr/barfoo/") ("foobaz" "/hello/")))

上記のように"foobar1"、 、"barfoo"、およびのプロンプトを表示したいのです"foobaz"が、代わりにペアのディレクトリを取得します。

Moverover、このようなハッシュテーブルがある場合

(cl-defstruct person ID name)
(setq person-object (make-person :ID 123 :name "foo"))
(setq person-table (make-hash-table))
(pushash (person-ID person-object) person-object person-table)

個人名を要求して個人 ID を取得するにはどうすればよいですか?

4

2 に答える 2

7

キーの代わりに値を返す方法はないcompleting-readため、自分でルックアップを行う必要があります。

(let ((completions '(("foobar1" "~/foobar1/") ("barfoo" "/usr/barfoo/") ("foobaz" "/hello/"))))
  (cadr (assoc (completing-read "Complete a foo: " completions) completions)))

ハッシュ テーブルに関しては、名前はキーではないため、maphash. 探しているものを見つけた後に繰り返し続けるのは無駄なので、次のようにcatchandを使用できます。throw

(catch 'found-it
  (maphash
   (lambda (key value)
     (when (equal (person-name value) desired-name)
       (throw 'found-it key)))
   person-table))

これにより、個人 ID が返されます。nil名前が と等しい人がいない場合は、desired-name.

于 2016-02-14T13:09:05.413 に答える
5

@legoscia は良い答えを提供してくれました。補完に使用するキーに関連付けられた値にアクセスすることはできcompleting-readません。たとえば、alistCOLLECTION引数の場合、選択した alist キーの cdr にアクセスすることはできません。

連想リストの場合は、最初に一致する連想要素assocを取得するために使用できます。ハッシュ テーブルの場合は、get を実行できます。maphash

ただし、これらのアプローチでは、キーの重複がある場合、つまり、複数の候補が同じキーまたは名前を持っている場合に、特定の選択されたキーの出現関連付けられた特定の値を取得できなくなります。

2 番目に一致する要素、または 13 番目の要素を取得することはできません。実際、vanilla Emacsは、同じキー (名前) を持つ補完候補のcompleting-read 重複を排除します。通常のEmacs では、alist エントリの cdr 内の情報はすべて無駄になります。連想リストを既に持っている場合は便宜上使用できますが、そうでない場合は、cons ではなく名前 (文字列またはシンボル) のリストを使用することもできます。

つららを使用すると、alist エントリは無駄になりません。cdr 値の取得に問題はありません。完了後、選択した候補者の完全な情報に簡単にアクセスできますcompleting-read

Iciclesは、プロパティ化された文字列を候補として使用completing-readし、ユーザーが選択した完全な文字列、プロパティ、およびすべてを返すことができるように拡張することによってこれを行います。返されたプロパティ化された文字列から完全な連想エントリを復元できます。

関連付けられた異なる値を持つことができる重複キーを取得して使用できることが重要になるのはどのような場合ですか? また、それらが重複している場合、ユーザーはそれらをどのように区別できますか (例: で)。*Completions*

例:

  • 名前が同じでターゲットが異なるブックマーク (たとえば、異なるディレクトリにある同じ相対名を持つ異なるファイル)。

  • パターンに一致する、またはマーカーを含むバッファー内の行またはその他のテキスト。これには、(行だけでなく) 好きな方法で検索コンテキストを定義できるIcicles検索での一致が含まれます。また、バッファー ゾーン (制限、別名ナローイングを含む) とバッファー位置 (マーカー) も含まれます。

  • テキストは同じだが、注釈が異なる候補。(ユーザー入力は、 に示されている注釈と照合されません*Completions*。)

  • 同じ名前を持つ Imenu アイテム。たとえば、同じ名前を持つオブジェクト (関数など) の複数の定義。

  • 同じ名前のタグ付きアイテム (関数など)。

  • フレームなど、同じ名前を持つことができる他の Lisp オブジェクトである候補。

Iciclesでは、ユーザーは同じ名前を持つ複数の補完候補から 1 つをどのように選択しますか?

  • ユーザーは、その場で順序を変更するなど、候補の順序(並べ替え) を制御できます。*Completions*特定の順序でそれらを表示します。候補を順番に切り替えるか、直接選択することができます。マッチング、選択に限定されません。(候補が重複していると、マッチングだけでは不十分で、そのうちの 1 つだけに到達する可能性があります。)

  • *Completions*は、候補者に関する追加情報を表示することもできます。これにより、候補者が同じ名前/テキストを持っている場合でも区別されます。このような情報は、周囲のテキスト (候補がバッファー テキストと一致する場合) または候補メタデータ (ファイルやブックマークの属性など) である可能性があります。

  • モード ラインで、現在の候補に関する重要な追加情報 (サイクリング中など) を確認することもできます。

  • キーを押すと、現在の候補者に関する追加情報 (完了*Help*) をオンデマンドで取得できます。

独自のコードでこのIcicles機能を利用できるようにするには、何をする必要がありますか?

関連付けられた位置またはその他のナビゲーション情報を持つ (探索する) 候補の間でユーザーがトリップできるようにする独自のコマンドを定義する方法については、トリッピング コマンドの定義を参照してください。(定義済みのつららトリップ コマンドについては、トリップを参照してください。)

コマンドで何をするかの簡単な概要:

  1. icicle-whole-candidate-as-text-prop-p変数を non- にバインドしますnil

  2. variableicicle-candidates-alistを に渡す連想リストに設定しますcompleting-read。これは、候補表示文字列のテキスト プロパティとして、対応する元の連想リスト エントリ全体をエンコードする効果があります。

  3. icicle-get-alist-candidateを呼び出した後に使用completing-readして、ユーザーが選択した候補に関する完全な情報、つまり cdr を含む完全な alist 要素を復元します。

(参照:つららを使用するプログラマーへの注意。)

于 2016-02-14T16:46:24.283 に答える