Buat urutan-baca hormat menyortir koleksi

10

Antara:

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

atau:

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

menghasilkan hasil yang sama dalam buffer penyelesaian saat menekan TAB. Bagaimana cara saya menghormati pesanan pengurutan?

Tu Do
sumber

Jawaban:

9

Urutan penyortiran dalam daftar * Penyelesaian * ditentukan oleh display-sort-functionproperti tabel penyelesaian Anda (seperti yang dikembalikan oleh completion-metadata). Dalam kasus Anda, tabel penyelesaian Anda tidak memiliki properti seperti itu, sehingga jatuh kembali ke default, yaitu mengurutkan menurut abjad.

Kamu dapat memakai:

(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))))

lalu

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

[Ini mengasumsikan Anda menggunakan lexical-binding. ]

Stefan
sumber
Jika Anda ingin icompletejuga menghormati pesanan, Anda dapat menambahkan (cycle-sort-function . ,#'identity)ke daftar metadata.
Omar
2

Berikan completing-readdaftar daftar, dan itu akan menghormati urutan:

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

Docstring mengatakan:

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

Baca string di minibuffer, dengan selesai. PROMPT adalah string untuk meminta; biasanya berakhir di titik dua dan spasi. KOLEKSI dapat berupa daftar string, alist, obarray atau tabel hash. ...

Karena itu dapat mengambil daftar sebagai koleksi. Akibatnya, Anda membuat daftar dengan kunci tetapi tanpa nilai.

Dan
sumber
Ini tidak berhasil untuk saya di Emacs 27.
Adam Simpson
2

Saya sarankan tidak menggunakan mantra kuno ini.

Built-in ido-completing-readtidak memiliki kekurangan ini:

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

Tidak juga helm:

(helm :sources
      `((name . "test: ")
        (candidates . ("a" "b" "c"))))
(helm :sources
      `((name . "test: ")
        (candidates . ("c" "b" "a"))))
abo-abo
sumber
1
Masalah dengan ido-completing-readadalah bahwa ia memiliki karakter baris baru aneh ^dari semantic-format-tag-summarize. Sedangkan untuk Helm, saya tidak bisa menganggap semua orang menggunakannya. Itu sebabnya completing-readsatu-satunya pilihan.
Tu Do
Itu alasan lemah untuk tidak menggunakannya. Hanya pascaproses apa pun yang semantic-format-tag-summarizememberi Anda.
abo-abo
Atau kirimkan laporan bug untukido
abo-abo
1
Saya melakukan itu juga tetapi tidak berhasil. Output dari semantic-format-tag-summarizemengembalikan sesuatu di akhir, tetapi karakter tidak ditampilkan di completing-readatau helm-comp-read. Saya sudah menulis fungsi lain di tempat semantic-format-tag-summarize, tanpa wajah. Untuk menampilkan tag (dengan warna) kepada pengguna, saya masih menggunakan semantic-format-tag-summarizetetapi menggunakan buffer khusus dengan widget teks.
Tu Do
Mungkin saya akan mengirimkan bug ke Ido setelah mengetahui apa yang semantic-format-tag-summarizekembali pada akhirnya. Saya punya solusi tetapi saya masih ingin tahu solusi untuk itu completing-read. Saya tahu Helm dapat membuatnya tetapi hanya ingin tahu apakah ada cara yang mudah completing-read.
Tu Do
1

Jika Anda menggunakan Icicles maka urutannya dihormati oleh completing-read.

(Dan Anda dapat menyortir menggunakan perintah penyortiran yang berbeda , baik secara interaktif atau melalui Lisp. Dan tidak seperti vanilla Emacs, penyortiran memengaruhi *Completions*tampilan dan urutan bersepeda.)

Drew
sumber
1
Sama seperti komentar dalam jawaban abo-abo, saya tidak bisa mengandalkan paket eksternal. Dan ido-completing-readmengalami beberapa masalah.
Tu Do
2
Mungkin Anda tidak bisa, tetapi mungkin orang lain bisa. ;-) Ini adalah solusi sederhana untuk masalah yang diajukan: gunakan saja completing-readdengan Icicles. Anda bahkan dapat menghidupkan icicle-modesementara (misalnya untuk panggilan ke completing-read), menggunakan, misalnya, makro icicle-with-icy-mode-ON.
Drew