- 请问一下,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")
- defcustom 中
:type
怎么指定 hash table 类型,我看的官方文档好像需要自己使用 (choice)构建,
我看不太懂,我想把 archetype-artifactId-completion-candidates
设置成 hash table, 因为我还有一个version
需要在后一个操作中解析。
ps: 总体我想做的就是 解析 maven archetype catalog 文件, 通过 ivy 选中其中一个, 然后执行 mvn archetype:generate
构建命令。其他我都写完了,就剩下两个这两个问题
试试 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)
如果要显示多列,最笨的方法是把多列字符拼接起来:
(string-trim
(completing-read "> "
(mapcar (lambda (elt)
(concat (car elt)
(propertize " " 'display (propertize (concat " "(cdr elt)) 'face 'italic))))
test-completing-data)))
另一种方法是 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。