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

我在 doom-emacs 测试过没问题。从报错来看我唯一能想到的可能性是你把 dirvish-enabled-features-on-remote 这个选项设成了 t . 这个选项是一个list, 比如 (setq dirvish-enabled-features-on-remote '(extras)), 具体的 docstring 有写。如果不是这个原因我就不知道了。

1 个赞

确实是这个原因,我看了一下,我这个值的设置形式有问题。修改之后就好了。 最后还想请教下,:vs %时的时候没有创建新的dirvish buffer,是因为dirvish中对buffer 类型做了什么限定是么?

没有特殊处理,就 emacs 固有的分屏机制。反而这个 % 属于 evil + doom 里的特殊情况,我不用这两个, 所以平常遇不到这个问题。更新一下,现在 :vs % 或者 :sp % 应该会开一个新会话,不需要设置。

1 个赞

我测试了,在 ubuntu20.04上面会出现这中情况,emacs 是手动编译的 28.1版本。

你说的这种方法,不会出现这个问题,但是 显示太多信息了。

这不是解决方案,只是排查。

我现在可以确认这是 dired-subtree 引入的, 也就是说在 dired 里也会出错,和 dirvish 没有关系。确保你的 --time-style 不包含中文可以避免这个问题。

;; 比如这样就会出错
(setq dired-listing-switches "-l --time-style=+%m月%d日")
;; 这样就没问题
(setq dired-listing-switches "-l --time-style=iso")

要彻底解决这个问题,你可以去给 dired-subtree 报 bug。

好的,感谢。

当在dired buffer打开文件时,所有的dired buffer都被关闭掉了,好像是dirvish-find-file调用了dirvish-kill, 怎么禁用这个特性。

说下详细步骤? 按了什么键或者用了什么命令,期待什么结果? 正常情况下不同会话不会相互打扰的。

在dirvish buffer中文件行按Enter (dired-find-file)打开文件,文件打开了,但dirvish buffer全都被关闭了,我希望这些dirvish buffer不要关闭,不知道是不是我设置的问题,但我找不到原因。

就是这样设计的,随用随开。免去管理 dired buffers 的麻烦。如果你想要一个随时能呼出的会话, 试试 dirvish-side 命令。它会在创建/显示/隐藏之间循环,逻辑和 treemacs 一样。不过我最近有在考虑加个允许非全屏的会话不杀buffer 的选项,不确定。

尝试增加dirvish的配制,右上角突然出现类似modelline的东西,怎么也关不掉。dirvish相关配置如下:

(use-package! dirvish
  ;; :init
  ;; (run-with-timer 10 nil #'dirvish-override-dired-mode)
  :custom
  (dirvish-attributes '(
                        ;; all-the-icons
                        ;; dirvish-extras
                        ;; dirvish-vc
                        ;; dirvish-yank
                        ;; dirvish-subtree
                        file-size))
  (dirvish-bookmarks-alist
   '(("h" "~/" "Home")
     ("d" "~/Downloads/" "Downloads")
     ("t" "~/.local/share/Trash/files/" "TrashCan")))
  ;; (dirvish-mode-line-format
  ;;  '(:left
  ;;    (sort file-time " " file-size symlink) ; it's ok to place string inside
  ;;    :right
  ;;    ;; For `dired-filter' users, replace `omit' with `filter' segment defined below
  ;;    (omit yank index)))

  ;; List directories that has over 10000 files asynchronously
  ;; This feature is disabled by default
  ;; (dirvish-async-listing-threshold 10000)
  ;; :commands (dirvish dirvish-dired)
  :config
  ;; (dirvish-peek-mode)
  ;; (dirvish-override-dired-mode)
  (setq dirvish-hide-details nil)
  ;; In case you want the details at startup like `dired'
  ;; :hook
  ;; (dirvish-mode . (lambda () (dired-hide-details-mode -1)))
  :bind
  (("C-x f" . dirvish-fd)
   :map dired-mode-map
   ("TAB" . dirvish-toggle-subtree)
   ("SPC" . dirvish-show-history)
   ("*" . dirvish-mark-menu)
   ("r" . dirvish-roam)
   ("b" . dirvish-goto-bookmark)
   ("f" . dirvish-file-info-menu)
   ;; ("M-n" . dirvish-go-forward-history)
   ;; ("M-p" . dirvish-go-backward-history)
   ("M-s" . dirvish-setup-menu)
   ("M-f" . dirvish-toggle-fullscreen)
   ([remap dired-sort-toggle-or-edit] . dirvish-quicksort)
   ([remap dired-do-redisplay] . dirvish-ls-switches-menu)
   ([remap dired-summary] . dirvish-dispatch)
   ([remap dired-do-copy] . dirvish-yank-menu)
   ([remap mode-line-other-buffer] . dirvish-other-buffer)))

有时候要在dired buffer 打开文件,这种情况下就需要重复打开dired buffer,dired-find-file好像被dirvish-find-file覆盖了,也不能自己增加一个快捷键,打开文件但不关闭dired buffer。

我估计是你 dirvish-attributes 里面的名字没写对, 你先

(prog1 (mapc #'require dirvish-extra-libs) (describe-variable 'dirvish--available-attrs))

看看正确的名称。重启一下 Emacs 先吧。

我举例说明哈。 你 dirvish-dired 打开 ~/foo 假如现在是:

~/foo
  a.py
  b.py
  c.py

你打开了 a.py,此时又想开 b.py. 那你就再 dirvish-dired,打开 b 不就可以了? 或者你也可以用 dired-other-window。那个buffer 被杀或者不被杀 又怎样呢?

原来这段代码在org-babel, 和minibuffer里面执行的结果不一样,不过我已经注释了,也重启Emacs了,问题依旧,难道配制错了,会写一些东西到文件中吗,重启也没有用。

你的意思是原来是好的,你加了一些配置变成了这样,那你就从没问题的部分开始二分定位一下呗,我看你上面发的是没问题的。除了图片缓存,没有往硬盘里写什么东西。

dirvish-override-dired-mode 放到:init上就没有问题,放到:config 上或者:init 上延迟执行也会出现这种问题,这句话拖慢我1s多的启动时间,我想延迟执行。

那你直接

(use-package! dirvish
  :defer 0.5
  ;; 或者
  ;; :after-call pre-command-hook
)

:defer 好像没用,我试了, :defer 能 defer :init 的执行吗。

:defer 你就加 dirvish-override-… 到 :config 。