制定完整阅读集合的尊重排序顺序


10

要么:

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

要么:

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

按时,会在完成缓冲区中产生相同的结果TAB。如何使其遵守排序顺序?

Answers:


9

* 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。]


如果您还希望icomplete遵守该顺序,则可以(cycle-sort-function . ,#'identity)在元数据列表中添加一个。
奥马尔

2

给出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可以是字符串,列表,列表或哈希表的列表。...

因此,可以将清单作为集合。实际上,您正在创建一个包含键但没有值的列表。


这不,我在Emacs 27工作
亚当·辛普森

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。至于头盔,我不能认为每个人都使用它。这就是为什么completing-read唯一的选择。
Tu Do

不使用它是一个la脚的原因。只需对所有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

找出最后的semantic-format-tag-summarize回报后,我可能会向Ido提交错误。我有一个解决方案,但我仍然想知道一个解决方案completing-read。我知道Helm可以做到,但只是想知道是否completing-read存在一种简便的方法。
Tu Do

1

如果您使用Icicles,则顺序受completing-read

(并且您可以交互地或通过Lisp 使用不同的排序顺序进行排序。与香草Emacs不同,排序会影响*Completions*显示顺序和循环顺序。)


1
与abo-abo的回答中的评论相同,我不能依赖外部软件包。并且ido-completing-read有一些问题。
Tu Do

2
也许您不能,但是其他人可以。;-)这是所提出问题的简单解决方案:只需completing-read与Icicles一起使用。您甚至可以使用macro icicle-mode临时打开(例如completing-readicicle-with-icy-mode-ON
德鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.