Bir koleksiyonun tamamlama-okuma saygı sıralama düzenini oluşturma


10

Ya:

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

veya:

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

tuşuna basıldığında tamamlama tamponu ile aynı sonucu verir TAB. Sıralama düzenine saygı göstermesini nasıl sağlayabilirim?

Yanıtlar:


9

* Tamamlamalar * listesindeki sıralama düzeni display-sort-function, tamamlama tablonuzun özelliğine (tarafından döndürüldüğü şekilde completion-metadata) göre belirlenir. Sizin durumunuzda, tamamlama tablonuzun böyle bir özelliği yoktur, bu nedenle alfabetik olarak sıralanacak olan varsayılana geri döner.

Kullanabilirsiniz:

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

ve sonra

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

[Bu, kullandığınızı varsayar lexical-binding. ]


İsterseniz icompletede sipariş saygı, bir ekleyebilir (cycle-sort-function . ,#'identity)meta listesine.
Omar

2

completing-readListelerin bir listesini verin ve bu sıraya saygı gösterecektir:

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

Doktora diyor:

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

Minibuffer'da tamamlanmış bir dize okuyun. PROMPT komut istemi; normalde iki nokta üst üste ve boşlukla biter. KOLEKSİYON bir dizi listesi, bir alist, bir obarray veya bir karma tablosu olabilir. ...

Bu nedenle bir alist koleksiyonu olarak alabilir. Aslında, anahtarları olan, ancak değerleri olmayan bir alist oluşturuyorsunuz.


Bu benim için Emacs 27'de işe yaramıyor
Adam Simpson

2

Bu kadim büyüyü kullanmamanızı öneririm.

Yerleşik ido-completing-readbu eksikliği yok:

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

Ayrıca helm:

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

1
Sorun ido-completing-read, garip yeni satır karakteri ^olması semantic-format-tag-summarize. Helm'e gelince, herkesin bunu kullandığını varsayamam. Bu yüzden completing-readtek seçenek var.
Tu Do

Bu, kullanmamak için topal bir neden. semantic-format-tag-summarizeSize ne verirse verin.
abo-abo

Veya ido
abo-abo

1
Ben de yaptım ama başaramadım. Çıktısı semantic-format-tag-summarizesonunda döner bir şey, ama karakter görüntülenmez completing-readveya helm-comp-read. Zaten semantic-format-tag-summarizehenüz yüzü olmayan başka bir işlev yazdım . Etiketleri (renklerle) kullanıcılara göstermek için, yine semantic-format-tag-summarizede metin widget'larıyla özel bir tampon kullanıyorum.
Tu Do

Muhtemelen semantic-format-tag-summarizesonunda ne döndüğünü öğrendikten sonra Ido'ya hata göndereceğim . Bir çözüm buldum ama hala bir çözüm bilmek istiyorum completing-read. Helm'in başarabileceğini biliyorum ama sadece kolay bir yol olup completing-readolmadığını bilmek istedim .
Tu Do

1

Buz sarkıtları kullanırsanız , sıraya saygı duyulur completing-read.

(Ve etkileşimli olarak veya Lisp aracılığıyla farklı sıralama düzenleri kullanarak sıralayabilirsiniz . Vanilya Emacs'ın aksine, sıralama hem *Completions*görüntüleme hem de bisiklet sırasını etkiler .)


1
Abo-abo'nin cevabındaki yorumla aynı, dış paketlere güvenemiyorum. Ve ido-completing-readbazı problemler yaşıyor.
Tu Do

2
Belki yapamazsınız, ama belki başka biri de yapabilir. ;-) Bu, sorun olduğu gibi basit bir çözümdür: sadece completing-readbuz sarkıtları ile kullanın . Hatta , örneğin, makro kullanarak, icicle-modegeçici olarak (ör. Çağrı için completing-read) açabilirsiniz icicle-with-icy-mode-ON.
Drew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.