[分享] 通过 dired + consult-file-externally 快速打开当前文件或文件夹

在子龙山人的教程中,Master Emacs in 21 Days 的第六天讲到了如何使用Emacs 来打开文件管理器

其实配合 dired 和 consult 的话,下面的这个 dired-open-externally 函数就可以实现,该函数来自 orderless 作者 oantolinemacs-config

(use-package dired
  :bind (:map dired-mode-map
              ("e" . dired-open-externally))
  :custom
  (dired-dwim-target t)
  (dired-listing-switches "-alGh")
  (dired-recursive-copies 'always)
  (dired-kill-when-opening-new-dired-buffer t)
  :config
  (defun dired-open-externally (&optional arg)
    "Open marked or current file in operating system's default application."
    (interactive "P")
    (dired-map-over-marks
     (consult-file-externally (dired-get-filename))
     arg)))

我邦定到了e键上,平时工作流是:

  1. C-x C-j进入 dired
  2. 移动光标到需要打开的文件或者文件夹,按 e

默认支持 Window, Linux 和 macOS

5 个赞

这个看起来,多一步,具体看每个人的习惯吧 函数不错,抄走了

embark-consultconsult-file-externally 加到了 embark-file-map,在dired buffer里面 M-x embark-act RET 然后按 x 也能实现一样的效果

我这试了在 dired 里用 embark,embark-act 后按 RET 是打开文件或者文件夹, 并没有 consult-file-externally

我写的有歧义,那个RET是指输入emarbk-act之后回车执行,执行embark-act之后按x,如果没有x的选项可能需要手动require下embark-consult,这个好象是还单独的包来着

1 个赞

我用 Borg 直接从 github 安装的 embark,embark-consult 包含在 embark 中,但默认没有 require,只要 (require 'embark-consult) 后,embark-act 就有 x 了。

通过 embark 也是一个不错的选择,多谢分享。不过直接邦定 e 会更加方便一些。

counsel-find-file-extern 似乎也是差不多的效果,不过在文件上会调用Windows默认打开方式,文件夹会调用资源管理器。

1 个赞

dired-get-filename 更换为 dired-get-file-for-visit 可以对 dired 中的 . .. 使用以访问当前或上级目录

2 个赞

你好,请问consult-file-externally函数是已经不能使用了还是需要另外自定义?

  • 我已安装consult包,但在使用dired-open-externally函数之后,emacs报错:
 (void-function consult-file-externally)
  • 并且“C-h f”中也找不到consult-file-externally.

已经不在 consult 这个包里了,转移到 embark 这个包下面了。

1 个赞

将原代码中consult-file-externally修改成embark-open-externally就能正常使用了。 非常感谢!

Emacs 30 已经内置了一个新的命令 dired-do-open,在 dired 中按 E 就可以触发。

embark-open-externally 可以不用了。

*** New command ‘dired-do-open’. This command is bound to ‘E’ (mnemonics “External”). Also it can be used by clicking “Open” in the context menu; it “opens” the marked or clicked on files according to the OS conventions. For example, on systems supporting XDG, this runs ‘xdg-open’ on the files.

1 个赞