コレクションの完全読み取り順ソート順を作成する


10

どちらか:

(completing-read "test: " '("a" "b" "c"))

または:

(completing-read "test: " '("c" "b" "a"))

を押すと、完了バッファに同じ結果が生成されTABます。並べ替え順序を尊重するにはどうすればよいですか?

回答:


8

* Completions *リストのソート順は、display-sort-function補完テーブル(によって返されるcompletion-metadata)のプロパティによって決まります。あなたのケースでは、補完表にはそのようなプロパティがないため、アルファベット順にソートするというデフォルトにフォールバックします。

以下を使用できます。

(defun my-presorted-completion-table (completions)
  (lambda (string pred action)
    (if (eq action 'metadata)
        `(metadata (display-sort-function . ,#'identity))
      (complete-with-action action completions string pred))))

その後

(completing-read "test: " (my-presorted-completion-table '("a" "b" "c")))

[これはあなたが使用していることを前提としていますlexical-binding。]


2

completing-readリストのリストを与えると、順序が尊重されます:

(completing-read "test: " '(("a") ("b") ("c")))
(completing-read "test: " '(("c") ("b") ("a")))

docstringは言う:

(completing-read PROMPT COLLECTION &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)

ミニバッファー内の文字列を、補完して読み取ります。PROMPTはプロンプトを表示する文字列です。通常は、コロンとスペースで終わります。COLLECTIONは、文字列のリスト、alist、obarray、またはハッシュテーブルです。...

したがって、それはコレクションとしてalistを取ることができます。実際には、キーはあるが値はない連想リストを作成しています。


これは、Emacs 27で私のために動作しません
アダム・シンプソン

2

私はこの古代の呪文を使用しないことをお勧めします。

組み込みにido-completing-readはこの欠陥はありません:

(ido-completing-read "test: " '("a" "b" "c"))
(ido-completing-read "test: " '("c" "b" "a"))

どちらもしませんhelm

(helm :sources
      `((name . "test: ")
        (candidates . ("a" "b" "c"))))
(helm :sources
      `((name . "test: ")
        (candidates . ("c" "b" "a"))))

1
の問題ido-completing-readは、^からの奇妙な改行文字があることsemantic-format-tag-summarizeです。Helmについては、誰もが使用できるとは限りません。それcompleting-readが唯一の選択肢である理由です。
2015

それはそれを使わないのはダメな理由です。何でも後処理しsemantic-format-tag-summarizeます。
abo-abo 2015

または、バグレポートを提出するido
abo-abo

1
私もそうしましたが、成功しませんでした。からの出力semantic-format-tag-summarizeは最後に何かを返しますが、文字はcompleting-readまたはに表示されませんhelm-comp-read。の代わりに別の関数をすでに書いてsemantic-format-tag-summarizeいますが、まだ顔はありません。ユーザーにタグを(色付きで)表示するために、私はまだ使用してsemantic-format-tag-summarizeいますが、代わりにテキストウィジェット付きのカスタムバッファーを使用しています。
Tu Do

semantic-format-tag-summarize最後に何が返ってくるのかを見つけたら、バグをイドに提出するでしょう。解決策はありましたが、それでも解決策を知りたいですcompleting-read。Helmでそれができることは知っていますが、簡単な方法がcompleting-read存在するかどうかを知りたかっただけです。
Tu Do

1

つららを使用する場合、順序はによって尊重されcompleting-readます。

(そして、対話的にまたはLispを介して、さまざまな並べ替え順序を使用して並べ替えることができます。そして、バニラEmacsとは異なり、並べ替えは*Completions*表示順序と循環順序の両方に影響します。)


1
abo-aboの回答のコメントと同じように、外部パッケージに依存することはできません。そしてido-completing-read、いくつかの問題があります。
火ドゥ

1
おそらくできないかもしれませんが、他の誰かができるかもしれません。;-)これは、提起された問題の簡単な解決策completing-readです。Iciclesを使用するだけです。たとえばmacroを使用して、icicle-mode一時的に(たとえばの呼び出しのためにcompleting-read)オンにすることもできicicle-with-icy-mode-ONます。
2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.