Thực hiện theo thứ tự sắp xếp đọc tôn trọng của bộ sưu tập


10

Hoặc:

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

hoặc là:

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

tạo ra kết quả tương tự trong bộ đệm hoàn thành khi nhấn TAB. Làm thế nào để tôi làm cho nó tôn trọng thứ tự sắp xếp?

Câu trả lời:


8

Thứ tự sắp xếp trong danh sách * Hoàn thành * được xác định bởi thuộc display-sort-functiontính của bảng hoàn thành của bạn (như được trả về bởi completion-metadata). Trong trường hợp của bạn, bảng hoàn thành của bạn không có thuộc tính như vậy, vì vậy nó sẽ trở về mặc định, đó là sắp xếp theo thứ tự bảng chữ cái.

Bạn có thể dùng:

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

và sau đó

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

[Điều này giả sử bạn đang sử dụng lexical-binding. ]


2

Đưa ra completing-readmột danh sách các danh sách, và nó sẽ tôn trọng thứ tự:

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

Chuỗi tài liệu nói:

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

Đọc một chuỗi trong bộ thu nhỏ, với sự hoàn thành. PROMPT là một chuỗi để nhắc với; thông thường nó kết thúc trong một dấu hai chấm và một không gian. THU THẬP có thể là một danh sách các chuỗi, một alist, obarray hoặc bảng băm. ...

Do đó, nó có thể mất một alist như là một bộ sưu tập. Thực tế, bạn đang tạo một liên kết với các khóa nhưng không có giá trị.


Điều này không hiệu quả với tôi trong Emacs 27.
Adam Simpson

2

Tôi đề nghị không sử dụng câu thần chú cổ xưa này.

Tích hợp ido-completing-readkhông có thiếu sót này:

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

Cũng không helm:

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

1
Vấn đề với ido-completing-readlà nó có kí tự xuống dòng lạ ^từ semantic-format-tag-summarize. Đối với Helm, tôi không thể cho rằng mọi người sử dụng nó. Đó là lý do tại sao completing-readlà lựa chọn duy nhất.
Từ Đô

Đó là một lý do khập khiễng không sử dụng nó. Chỉ cần hậu xử lý bất cứ điều gì semantic-format-tag-summarizemang lại cho bạn.
abo-abo

Hoặc gửi báo cáo lỗi choido
abo-abo

1
Tôi đã làm điều đó là tốt nhưng không thành công. Đầu ra từ semantic-format-tag-summarizetrả về một cái gì đó ở cuối, nhưng ký tự không được hiển thị trong completing-readhoặc helm-comp-read. Tôi đã viết một chức năng khác thay thế semantic-format-tag-summarize, chưa có mặt. Để hiển thị thẻ (có màu) cho người dùng, tôi vẫn sử dụng semantic-format-tag-summarizenhưng sử dụng bộ đệm tùy chỉnh với các tiện ích văn bản thay thế.
Từ Đô

Có lẽ tôi sẽ gửi lỗi cho Ido sau khi tìm ra cái gì semantic-format-tag-summarizetrả về cuối cùng. Tôi đã có một giải pháp nhưng tôi vẫn muốn biết một giải pháp completing-read. Tôi biết Helm có thể làm được nhưng chỉ muốn biết liệu có một cách dễ dàng completing-readtồn tại không.
Từ Đô

1

Nếu bạn sử dụng Icicles thì thứ tự được tôn trọng bởi completing-read.

(Và bạn có thể sắp xếp bằng các thứ tự sắp xếp khác nhau , tương tác hoặc thông qua Lisp. Và không giống như vanilla Emacs, việc sắp xếp ảnh hưởng đến cả *Completions*thứ tự hiển thị và đi xe đạp.)


1
Giống như nhận xét trong câu trả lời của abo-abo, tôi không thể dựa vào các gói bên ngoài. Và ido-completing-readđang có một số vấn đề.
Từ Đô

1
Có lẽ bạn không thể, nhưng có lẽ người khác có thể. ;-) Đây là một giải pháp đơn giản cho vấn đề được đặt ra: chỉ cần sử dụng completing-readvới Icicles. Bạn thậm chí có thể chỉ bật icicle-modetạm thời (ví dụ: cho cuộc gọi đến completing-read), bằng cách sử dụng, ví dụ: macro icicle-with-icy-mode-ON.
vẽ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.