ทำให้การเรียงลำดับความเคารพอ่านเสร็จสมบูรณ์ของคอลเลกชัน


10

ทั้ง:

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

หรือ:

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

TABจะให้ผลลัพธ์เดียวกันในบัฟเฟอร์เสร็จสิ้นเมื่อกด ฉันจะทำให้มันเป็นไปตามลำดับการเรียงลำดับได้อย่างไร

คำตอบ:


9

ลำดับการเรียงลำดับในรายการ * เสร็จสมบูรณ์ * ถูกกำหนดโดย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[นี้จะถือว่าคุณกำลังใช้ ]


หากคุณต้องการicompleteเคารพคำสั่งซื้อด้วยคุณสามารถเพิ่ม a (cycle-sort-function . ,#'identity)ลงในรายการเมทาดาทา
โอมาร์

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)

อ่านสตริงใน minibuffer โดยสมบูรณ์ พรอมต์เป็นสตริงที่จะแจ้งให้; โดยปกติแล้วจะสิ้นสุดในลำไส้ใหญ่และช่องว่าง คอลเล็กชันสามารถเป็นรายการของสตริง, alist, obarray หรือตารางแฮช ...

ดังนั้นจึงสามารถใช้ alist เป็นชุดสะสมได้ ผลคือคุณกำลังสร้าง alist ด้วยปุ่ม แต่ไม่มีค่า


สิ่งนี้ไม่ได้ผลสำหรับฉันใน Emacs 27
Adam Simpson

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เป็นตัวเลือกเท่านั้น
Tu Do

นั่นเป็นเหตุผลที่อ่อนแอที่จะไม่ใช้มัน เพียงแค่ประมวลผลสิ่งที่semantic-format-tag-summarizeให้คุณ
abo-abo

หรือส่งรายงานข้อผิดพลาดสำหรับido
abo-abo

1
ฉันทำเช่นนั้น แต่ไม่ประสบความสำเร็จ เอาท์พุทจากsemantic-format-tag-summarizeผลตอบแทนบางสิ่งบางอย่างที่สิ้นสุด แต่ตัวละครตัวนี้จะไม่แสดงในหรือcompleting-read helm-comp-readฉันได้เขียนฟังก์ชั่นอื่นแทนsemantic-format-tag-summarizeโดยยังไม่มีใบหน้า สำหรับการแสดงแท็ก (สี) ให้กับผู้ใช้ฉันยังคงใช้semantic-format-tag-summarizeแต่ใช้บัฟเฟอร์ที่กำหนดเองพร้อมวิดเจ็ตข้อความแทน
Tu Do

อาจเป็นไปได้ว่าฉันจะส่งข้อผิดพลาดไปยัง Ido หลังจากค้นหาว่าsemantic-format-tag-summarizeผลตอบแทนใดในตอนท้าย ผมมีวิธีการแก้ปัญหา completing-readแต่ฉันยังคงต้องการที่จะรู้วิธีการแก้ ฉันรู้ว่า Helm สามารถสร้างมันได้ แต่แค่อยากรู้ว่ามีวิธีง่าย ๆcompleting-readอยู่หรือไม่
Tu Do

1

ถ้าคุณใช้Iciclescompleting-readแล้วเพื่อเป็นที่ยอมรับโดย

(และคุณสามารถจัดเรียงโดยใช้คำสั่งการเรียงลำดับที่แตกต่างกันไม่ว่าจะเป็นการโต้ตอบหรือผ่าน Lisp และต่างจากวานิลลา Emacs การเรียงลำดับมีผลต่อลำดับการ*Completions*แสดงผลและการขี่จักรยาน)


1
เช่นเดียวกับความคิดเห็นในคำตอบของ abo-abo ฉันไม่สามารถพึ่งพาแพ็คเกจภายนอกได้ และido-completing-readกำลังมีปัญหาบางอย่าง
Tu Do

2
บางทีคุณทำไม่ได้ แต่บางทีคนอื่นทำได้ ;-) นี่เป็นวิธีแก้ปัญหาอย่างง่าย ๆ ที่โพสต์: เพียงใช้completing-readกับหยาด คุณสามารถแม้เพียงแค่เปิดicicle-modeชั่วคราว (เช่นการเรียกร้องให้completing-read) icicle-with-icy-mode-ONโดยใช้เช่นมาโคร
ดึง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.