Dirvish: 基于 Dired 的极简、一站式文件管理器

你别说还真是。我这个 emacs -q 光标也没隐藏, 我看看什么情况。

6啊兄弟这也认的出来

你是非中文母语者吗? 我截图的时候倒是没有考虑那么多,当时看大小正好也挺漂亮就截了,之前一直用的一张风景图。要不是写这个我都不记得我存了这个壁纸。不过你发的那个彩虹屁好好玩,哈哈

在开 dirvish 之前 eval 这个试试看?

(require 'image-mode)
(setq-default cursor-in-non-selected-windows nil)

Edit: 应该就是这个的问题,我已经推送了,你更新看看。

另一个办法是,开两个 dirvish-dired, 当你需要预览的时候,用 dirvish-toggle-fullscreen 全屏一个,mark 好了文件再全屏回来。一个 frame 展示两个 dirvish 的话,先不说好不好实现,看起来可能比较乱。

因为 (setq dired-dwim-target t) 之后我需要在两个dired buffer之间复制或者移动文件,比如两个dired分别对应两台远程主机的一个目录,这样我就可以在两台主机之间复制文件。

但是这个 dirvish 的 layout会让这个操作变得几乎不可能完成,非常影响效率。

看看是不是可以有选项不要这个layout和自动preview功能。

另外,我也不希望在打开 dirvish buffer的时候,看到当前dired buffer的父目录。

还有就是无法使用 evil 的 C-w hjkl 来在不同父目录和子目录之间移动。当然,如果没有父目录,这个功能也不需要了。

不想要父目录可以设置

(setq dirvish-depth 0)

有选项默认 fullscreen吗? 当然我写个advice也可以

不好意思我不太明白什么是默认 fullscreen? dirvish-dired 就是开在当前窗口,dirvish 就是当前frame (也就是fullscreen 状态)。

默认 fullscreen 就是调用 dirvish-toggle-fullscreen 后 dirvish的状态:这个状态跟 dired-mode 默认的状态比较接近。考虑到你的设计目标用户是dired用户,我希望这个行为能够保持跟dired一致。

另外一个问题,我打开两个 fullscreen 状态的dirvish buffer, 在其中一个buffer中按下 R,无法 Rename 文件。报错: Wrong type argument: window-valid-p, #<window 3> Error during redisplay: (eval (dirvish--mode-line-sorter)) signaled (wrong-type-argument dirvish nil)

默认 fullscreen 就是调用 dirvish-toggle-fullscreen 后 dirvish的状态:这个状态跟 dired-mode 默认的状态比较接近。考虑到你的设计目标用户是dired用户,我希望这个行为能够保持跟dired一致。

对啊,我的意思就是,如果你只是想要这个 “dirvish化” 的 dired,你直接用 (dirvish-dired) 不就行了吗? 为什么要 (dirvish) (dirvish-toggle-fullscreen) 两步走呢?

另外一个问题,我打开两个 fullscreen 状态的dirvish buffer, 在其中一个buffer中按下 R,无法 Rename 文件。报错: Wrong type argument: window-valid-p, #<window 3> Error during redisplay: (eval (dirvish--mode-line-sorter)) signaled (wrong-type-argument dirvish nil)

我看看我能不能重现,稍等下。 E: 确实有这个情况,我修一下

没注意到这个 dirvish-dired 命令,这个貌似可以解决我的问题。我先用一段时间,后面再来反馈下使用感受。

我的问题,应该在帖子里提一下的,我感觉 readme 都写了怕重复说起来太啰嗦。

Wrong type argument: window-valid-p, #<window 3>Error during redisplay: (eval (dirvish--mode-line-index)) signaled (wrong-type-argument stringp nil) Error during redisplay: (eval (dirvish--mode-line-sorter)) signaled (wrong-type-argument stringp nil) Error during redisplay: (eval (dirvish--mode-line-filter)) signaled (wrong-type-argument stringp nil)

这个错误还是很容易遇到。使用 dirvish-dired 打开两个不同的buffer,然后按 R 去rename文件。

是有这个情况,我平时都是 wdired,所以没注意到这个。我修好了告知你。

在首行按下d或者m可以标记该路径下所有文件

对,所以我说是 基本 没意义,因为除了这个操作之外别的时候都没什么用。而且这也不算什么高频命令,确实需要的话也可以直接 dired-mark-subdir-files 或者 * s, 真的用的多就绑一个按键。

试用了下,设计思路不错。似乎标题和下面的状态都是一个单独的window,能否把这些Window在切换窗口时排除掉?太多了很麻烦。

如果不想要那个 heading window, 可以 (setq dirvish-header-style nil),底下的是 (setq dirvish-mode-line-format nil)。我不太理解你说的 切换窗口时排除 是什么意思? Edit: 哦, 你是指切换到预览窗口的时候是吗? 感谢建议,我也一直这么想来着。

不过如果你是说用 other-window 或者 ace-window 这类命令切换窗口的话,默认情况下除了预览窗口之外的窗口是不会作为备选的

我一般使用ace-window做窗口切换,有两种情况:

  1. 使用dirvish-side:如果想最大化文件窗口,一般是最大化当前窗口,但保留side window。treemacs默认是该中行为,也是最合理的行为。
  2. 使用dirvish:用ace-window切换,默认配置下所有窗口都可被选择(如下图)。这个模式下我其实关心的就三个窗口,能快捷切换最实用,比如 M-1 M-2 M-3…

BTW:问下,dirvisish-side能设置宽度吗?