其实 README 里面有写 Dirvish 的 buffer 管理机制,但是我还是详细说一下,因为你对 Dired 的 buffer 复用可能有一些误解。
Dired
Dired 的默认情况是每访问一个路径就新开一个 Dired buffer,如果重复访问某个路径,就会 复用 已经存在的 Dired buffer,这是合理的。可是要命的是这些 buffer 不会自己关掉。你要退出要不停的按 q 。
对这个问题 Dired 给出了 dired-kill-when-opening-new-dired-buffer (> Emacs 28) 这个选项和 dired-find-alternate-file 这个命令,意思是访问新路径时杀掉当前窗口的旧 Dired buffer,来保证你浏览文件系统的过程中只有一个 Dired buffer 存在。
不过请注意这恰恰破坏了 Dired 原本的 复用 机制。假设你在 ~/foo/bar 展开了一些文件夹,标记了一些文件,当你 dired-up-directory 到 ~/foo, ~/foo/bar 就被杀掉了。你再进去,这些标记和折叠状态就没了。如果 ~/foo/bar 是一个很大的文件夹 (比如包含 100000 个文件打开要 2 秒),那你每次访问,每次都要等 2 秒。
Dirvish
Dirvish 是以会话 (session) 的形式存在的。每一个会话包含自己独立的 dirvish-mode buffer 列表,它不会在访问新路径时杀掉旧的 buffer,所以复用机制和 Dired 在不开 dired-kill-when-opening-new-dired-buffer 这个选项的情况时是一致的。 不同的是当你按 q 退出这个会话时,这些 dirvish-mode buffer 就被杀掉了,免去你一直按 q 的麻烦。预览 buffer 的情况也是类似的,按 q 的时候一起杀掉。你也可以利用外部命令来预览文本文件,从而完全避免预览 buffer 的创建,但这是另一个话题了。
Edit:
另外值得一说的是 doom-emacs 的解决办法,它就是在你按 q 的时候不管三七二十一把所有 Dired buffer 都杀掉。好处是简单粗暴,坏处是其他 window/tab/frame 里面的 Dired buffer 也会莫名其妙的被删掉。