一个类似于company-mode候选列表的列表是怎么显示出来的?

喔喔,我折腾了一个四不像出来,最懒的方法,没用 Overlay:

(global-set-key (kbd "C-c y")
                '(lambda ()
                   (interactive)
                   (let* ((trim (lambda (str)
                                  (when (stringp str)
                                    (setq str (string-trim str))
                                    (while (equal (string-to-char str)
                                                  (string-to-char "\n"))
                                      (setq str (string-trim-left (substring str 1)))))
                                  str))
                          (trim-kill-ring (lambda (tkr kr)
                                            (when (consp kr)
                                              (setcar kr (funcall trim (car kr)))
                                              (funcall tkr tkr (cdr kr))))))
                     (funcall trim-kill-ring trim-kill-ring kill-ring)
                     (setcdr yank-menu (mapcar (lambda (item)
                                                 (let ((str (funcall trim (car item))))
                                                   (cons str (cdr item))))
                                               (cdr yank-menu)))
                     (popup-menu 'yank-menu))))

其实lambda里只要最后一行的(popup-menu 'yank-menu)就行,不过在terminal环境有个问题,就是如果开头是换行符的话,字符串的内容显示不出来,所以多了这一大堆。不过这个问题还是有。。。

还有一个就是我不太想改kill-ringyank-menu的内容。

期待你的结果。喔,不对,我有空再看看 Overlay相关的。。。

1 个赞