Answers:
* 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
。]
给出completing-read
一个列表列表,它将遵循顺序:
(completing-read "test: " '(("a") ("b") ("c")))
(completing-read "test: " '(("c") ("b") ("a")))
该文档字符串说:
(completing-read PROMPT COLLECTION &optional PREDICATE
REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)
读取迷你缓冲区中的字符串,并带有完成内容。PROMPT是一个提示字符串;通常它以冒号和空格结尾。COLLECTION可以是字符串,列表,列表或哈希表的列表。...
因此,可以将清单作为集合。实际上,您正在创建一个包含键但没有值的列表。
我建议不要使用这个古老的咒语。
内置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"))))
ido-completing-read
在于它具有^
来自的奇怪的换行符semantic-format-tag-summarize
。至于头盔,我不能认为每个人都使用它。这就是为什么completing-read
唯一的选择。
semantic-format-tag-summarize
给您的东西进行后处理。
ido
semantic-format-tag-summarize
在末尾返回一些内容,但该字符未显示在completing-read
或中helm-comp-read
。我已经写了另一个函数来代替semantic-format-tag-summarize
,没有面子。为了向用户显示标签(带有颜色),我仍然使用semantic-format-tag-summarize
但使用带有文本小部件的自定义缓冲区。
semantic-format-tag-summarize
回报后,我可能会向Ido提交错误。我有一个解决方案,但我仍然想知道一个解决方案completing-read
。我知道Helm可以做到,但只是想知道是否completing-read
存在一种简便的方法。
如果您使用Icicles,则顺序受completing-read
。
(并且您可以交互地或通过Lisp 使用不同的排序顺序进行排序。与香草Emacs不同,排序会影响*Completions*
显示顺序和循环顺序。)
ido-completing-read
有一些问题。
completing-read
与Icicles一起使用。您甚至可以使用macro icicle-mode
临时打开(例如completing-read
)icicle-with-icy-mode-ON
。
icomplete
遵守该顺序,则可以(cycle-sort-function . ,#'identity)
在元数据列表中添加一个。