21天学会Emacs第四天: vertico, orderless, marginalia, embark和consult使用简介

你可以自己写 annotator

(defun marginalia-annotate-command (cand)
  "Annotate command CAND with its documentation string.
Similar to `marginalia-annotate-symbol', but does not show symbol class."
  (when-let* ((sym (intern-soft cand))
              (mode (if (boundp sym)
                        sym
                      (lookup-minor-mode-from-indicator cand))))
    (concat
     (if (and (boundp mode) (symbol-value mode))
         (propertize " On" 'face 'marginalia-on)
       (propertize " Off" 'face 'marginalia-off))
     (marginalia-annotate-binding cand)
     (marginalia--documentation (marginalia--function-doc sym)))))

最好是直接用 consult-minor-mode-menu

6 个赞

vertico+marginalia还没有特别完善,有些功能并不支持。

哈哈 我试试看自己添加annotator ,谢谢 @alexluigit,也谢谢 @seagle0128

这个效果很好啊 ~ 谢谢 :grinning: 现在查看查看mode 的 on 和 off, 很方便了 ~

这只是个示例,突出效果所以我去掉了非 minor-mode 候选的文档,如果真的要用的话可以自己再改改。

好的,谢谢。DIY 的思路很赞 :+1:

直接把本身颜色改了不是更明显吗?

1 个赞

之前有看到过这个issue,marginalia还不支持直接改颜色

没看marginila 代码,原理是都是字符串处理。all-the-icons-ivy-rich是支持的,一直用着。

这两天reddit 上看到这个贴子, consult-buffer 在展示recentf 文件列表时,只展示文件名,(不展示全路径),觉得不错,略加修改后分享如下。

  (defun vmacs-consult--source-recentf-items ()
    (let ((ht (consult--buffer-file-hash))
          file-name-handler-alist ;; No Tramp slowdown please.
          items)
      (dolist (file recentf-list (nreverse items))
        ;; Emacs 29 abbreviates file paths by default, see
        ;; `recentf-filename-handlers'.
        (unless (eq (aref file 0) ?/)
          (setq file (expand-file-name file)))
        (unless (gethash file ht)
          (push (propertize
                 (vmacs-short-filename file)
                 'multi-category `(file . ,file))
                items)))))

  (defun vmacs-short-filename(file)
    "return filename with one parent directory.
/a/b/c/d-> c/d"
    (let* ((file (directory-file-name file))
           (filename (file-name-nondirectory file))
           ;; (dir (file-name-directory file))
           short-name)
      (setq short-name filename
            ;; (if dir
            ;;     (format "%s/%s" (file-name-nondirectory
            ;;                      (directory-file-name dir))
            ;;             filename)
            ;;   filename)
            )
      (propertize short-name 'multi-category `(file . ,file))))

  (plist-put consult--source-recent-file
             :items #'vmacs-consult--source-recentf-items)

如果使用了 consult-dir ,以下代码可实现只展示文件名

(with-eval-after-load 'consult-dir
  (defvar consult-dir--source-project-items (plist-get consult-dir--source-project :items))
  (plist-put consult-dir--source-project
             :items #'(lambda() (mapcar #'vmacs-short-filename  (funcall consult-dir--source-project-items))))
  (plist-put consult-dir--source-recentf
             :items #'(lambda() (mapcar #'vmacs-short-filename  (consult-dir--recentf-dirs))))
  (plist-put consult-dir--source-default
             :items #'(lambda() (mapcar #'vmacs-short-filename  (consult-dir--default-dirs))))

  )

但只展示文件名的话,也有缺点,比如文件有重名时,无法知道是哪个目录的文件, 于是想到利用 marginalia 以 annotation的形式 展示全路径。需要advice marginalia–annotate-local-file来实现(默认 的annotate 有 文件权限、文件大小、访问时间等信息,感觉没什么用处 还占地方)

    (advice-add 'marginalia--annotate-local-file :override
                (defun marginalia--annotate-local-file-advice (cand)
                  (marginalia--fields
                   ((marginalia--full-candidate cand)
                    :face 'marginalia-size )))))

效果如下:

4 个赞