ivy-read 候选项格式问题

  1. 请问一下,ivy-read 中候选列表出现多列这个怎么实现。(最后只返回1 的结果) 我解析出来是这样的
(defcustom archetype-artifactId-completion-candidates ()
  ""
  :group 'mvn
  :type 'list)
;; 候选项的格式方式
(format "%s : %s\t\t\t%s" archetype-groupId archetype-artifactId (cond ((string-empty-p archetype-description) "None Description")
                                                                                            (t archetype-description)))

(ivy-read "Enter archetype: " archetype-artifactId-completion-candidates
                                        :require-match "maven-archetype-quickstart"
                                        :preselect "maven-archetype-quickstart")
  1. defcustom 中 :type 怎么指定 hash table 类型,我看的官方文档好像需要自己使用 (choice)构建, 我看不太懂,我想把 archetype-artifactId-completion-candidates 设置成 hash table, 因为我还有一个version 需要在后一个操作中解析。

ps: 总体我想做的就是 解析 maven archetype catalog 文件, 通过 ivy 选中其中一个, 然后执行 mvn archetype:generate 构建命令。其他我都写完了,就剩下两个这两个问题

第二列是 marginalia 吧。

试试 all-the-icons-ivy-rich

你是不是用了ivy-rich?看你M-x的多列像是。

实现多列的简单粗暴的方式就是用1列来模拟,format的时候给第一列指定一个固定的宽度。 复杂点(如果你用了ivy-rich的话),可以仿照ivy-rich给你的函数指定transformer。

第二个用defvar就可以吧?这样绕过指定类型的问题。

1 个赞

太复杂了,我现在还不会用

我没有用这个,不想引入其他包,就使用内置的实现就可以了

当你的候选表有多列时,completion 只会显示第一列:

(defvar test-completing-data '(
                               ("cand1" . "annt1")
                               ("cand2" . "annt2")
                               ("cand3" . "annt3")
                               ))

(completing-read "> " test-completing-data)

Screen Shot 2022-01-20 at 5.02.35 PM

如果要显示多列,最笨的方法是把多列字符拼接起来:

(string-trim
 (completing-read "> "
                  (mapcar (lambda (elt)
                            (concat (car elt)
                                    (propertize " " 'display (propertize (concat " "(cdr elt)) 'face 'italic))))
                          test-completing-data)))

Screen Shot 2022-01-20 at 5.02.55 PM

另一种方法是 completion 自带的 annotation:

(defun test-completing-annotation (s)
  (let ((elt (assoc s test-completing-data)))
    (when elt (format " %s" (cdr elt)))))

(let ((completion-extra-properties '(:annotation-function test-completing-annotation)))
  (completing-read "> " test-completing-data))

效果看起来是一样的,不过我在 helm-symbol-hint 用的是笨方法,当时好象是发现 annotation 有问题,具体细节忘了。

1 个赞

自己实现远比第三方包复杂得多,除非自己学习。 只需要简单配置就能看到效果:(all-the-icons-ivy-rich-mode 1). ivy-rich 和 marginalia 都能达到同样的效果。

ok, 我现在是根据,doom emacs :completion ivy 中的config.el 代码模仿实现。设置 ivy-rich-display-transfroms-alist。