请教: 如何让treemac只显示被修改的文件

这个需求是因为在处理问题的时候,一般只需要关心很少的文件列表,treemacs显示全部文件对我来说是个干扰,很希望有个经过某种规则过滤后的列表显示,可以是

  1. 类似idea的changed files
  2. 对关心的文件打上tag

当然我可以选择给文件加bookmark?或者直接开个窗口看magit的显示?

不知道是不是我的习惯比较奇怪 ,能一直清晰的看到修改文件列表会有一种莫名的安全感…

简单写了一个,就是不知道怎么自动刷新,看有没有大佬指导一下

(require 'treemacs)

(defun changed-buffers ()
  "Get the list of buffers, grouped by their major mode."
  (seq-filter
   (lambda (buf)
    (and (buffer-file-name buf)
         (buffer-modified-p buf)))
   (buffer-list)))

(defun changed-files-visit-buffer (&rest _)
  "Switch to the buffer saved in node at point."
  (let* ((node (treemacs-current-button))
         (buffer (treemacs-button-get node :buffer)))
    (when (buffer-live-p buffer)
      (select-window (next-window))
      (switch-to-buffer buffer))))

(treemacs-define-leaf-node changed-files-leaf
  ""
  :ret-action #'changed-files-visit-buffer
  :tab-action #'changed-files-visit-buffer
  :mouse1-action (lambda (&rest args) (interactive) (changed-files-visit-buffer args)))

(treemacs-define-expandable-node changed-files-root
  :icon-open (treemacs-as-icon "- " 'face 'font-lock-string-face)
  :icon-closed (treemacs-as-icon "+ " 'face 'font-lock-string-face)
  :query-function (changed-buffers)
  :render-action
  (treemacs-render-node
   :icon (treemacs-icon-for-file (buffer-file-name item))
   :label-form (file-name-nondirectory (buffer-file-name item))
   :state treemacs-changed-files-leaf-state
   :face 'font-lock-keyword-face
   :key-form (buffer-file-name item)
   :more-properties (:buffer item))
  :top-level-marker t
  :root-label "Changed Files"
  :root-face 'font-lock-type-face
  :root-key-form 'ChangedFiles)

(treemacs-define-top-level-extension
 :extension #'treemacs-CHANGED-FILES-ROOT-extension
 :position 'top)

谢谢回复! 我没理解错的话,用 buffer-modified-p 判断的是文件对应的buffer是否被修改,那么一旦我保存了可能就被过滤掉了

我理想中的情况是利用git来记录文件是否是被修改的 不管是staged还是unstaged,感觉这样会更可靠一些。

另外很抱歉提问之前没有做足够的搜索,昨晚检索了之后,感觉这个需求我应该有办法自己实现,可能可以使用treemacs的 treemacs-pre-file-insert-predicates函数来处理? 准备周末研究下…