我的 Emacs 配置(Dired)
摘要
一份关于配置和使用 Emacs 文件管理器 Dired 的详细指南,涵盖键绑定、钩子及高级功能。
暂无内容
查看缓存全文
缓存时间: 2026/07/24 17:05
# 我的 Emacs 配置(Dired)
来源:https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html
📅 2026年7月5日
---
## 目录
- 前言 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#preamble)
- 调用Dired (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#invoke-dired)
- 文件操作 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#file-ops)
- 强力重命名 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#wdired)
- 像在mc(或Far)中一样复制/移动文件 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#dired-mc-like)
- 搜索 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#dired-search)
- find-name-dired (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#find-name-dired)
- find-grep-dired (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#find-grep-dired)
- 外部程序 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#dired-external-programs)
- Dired与照片/图片 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#dired-images)
- 与Emacs特定相关的内容 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#dired-emacs-specific)
- 配置概览 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#dired-configuration-overview)
- 快捷键 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#emacs-dired-keybindings)
- 钩子 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#emacs-dired-hooks)
- 与Dired相关的变量 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#emacs-dired-variables)
- 外观定制 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#emacs-dired-faces)
- 下载 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#rc-dired-el-download)
- 备注 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#notes)
这篇博文是关于我Emacs配置系列文章的一部分。之前的文章:
- [我的Emacs配置(通用部分)](https://eugene-andrienko.com/2025-06-30-my-emacs-configuration-common.html)
- [我为何以及如何抛弃use-package?](https://eugene-andrienko.com/2025-10-10-emacs-ditch-use-package.html)
在此我将专门介绍Dired的配置、使用习惯以及日常操作。我决定不仅仅描述配置——你已经读过很多类似的博文了。相反,我还想描述我每天如何使用Dired。
对于之前没用过Dired的读者,稍作解释:Dired是Emacs中的一个程序,它作为一个强大的文件浏览器,将你宝贵的文件和目录当作(几乎)普通的Emacs缓冲区来处理——因此你可以用同样的"Emacs习惯"来导航和操作你的目录。
Emacs中打开了两个Dired窗口。左窗口显示包含我关于Dired的博文的目录列表,右窗口显示包含所有摄影博文的目录和文件。
图1:Emacs中打开的两个Dired窗口。
## 前言
由于我倾向于使用一种*极简*的计算环境——起初,我主要使用CLI(`bash`,后来用`zsh`)进行文件和目录操作。这样很好,但我想要一些交互性——在不输入多个`cp`命令的情况下,从一个目录复制/移动*某些文件*到另一个目录[^1],同时浏览另一个目录的内容(就像在Midnight Commander中一样)等等。有一段时间我用了`mc`,感觉不错。但我想要更多——预览图片等等——而Midnight Commander在这方面帮不了我,因为它没有像Far那样的插件。是的,它有一个绑定到F2键的好菜单,可以显示各种文件类型的各种命令。但对我来说还不够。于是,我决定尝试Dired——因为它几乎随每个Emacs发行版一起安装。效果非常好,以至于我现在一直使用Dired。
[^1]: 脚注原文:`1 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#fn.cp)`
## 调用Dired
我通常以两种方式调用Dired。首先,如果我在处理某个项目[^2],我按`C-x p d`热键,然后输入一些字母跳转到项目内所需的目录。例如,如果我在处理我的dotfiles并想打开`configs`目录,我输入:``` C-x p d configs ```
Emacs迷你缓冲区自动补全"configs"字符串,路径为"utils/emacs/.emacs.d/configs/"
然后进入所需目录:
在Dired中打开的目录"~/git_repos/dotfiles/utils/emacs/.emacs.d/configs/"。
如果我只想打开项目的根目录,我改用`C-x p D`快捷键。
第二种,也是我喜爱的方法——`C-x C-j`快捷键[^3]。它在*当前工作目录*中打开Dired缓冲区。例如,如果我在编辑博文时想处理博文的文件——只需按`C-x C-j`,就会打开包含文章Org文件和图片的缓冲区:
图2:编辑article.org文件时按C-x C-j后的Emacs Dired缓冲区。
当然,还有其他一些我用来调用Dired的方法。例如默认的`C-x d`快捷键,我为了方便重新绑定为`C-x C-d`:
```elisp
(keymap-global-set "C-x C-d" 'dired)
```
按C-x C-d后,Emacs在迷你缓冲区询问路径。自动补全建议了"~/git_repos/"中的目录。
我大多数时候使用这个快捷键,当我只是想打开某个目录,无论是本地还是远程(借助TRAMP)。例如,这就是我如何用`username`用户账户打开远程服务器`server.example.com`上的`bin`目录:
```
C-x C-d /ssh:[email protected]:~/bin
```
输入这个冒号后,GnuGP会询问我私钥的密码,以解密~/.authinfo.gpg中关于server.example.com的username密码。
另外,在我的系统中,可以从任何能打开文件管理器的程序打开带有Dired缓冲区的Emacs框架——例如,在Librewolf中下载文件后,我可以点击"下载"下拉菜单中的*文件夹*图标,就会打开一个Emacs框架,其中包含下载文件所在目录的Dired缓冲区:
通过Librewolf下载的文件及其在Emacs中的位置。
我已经在这里描述了如何将Emacs设为默认文件管理器:
[将Emacs Dired设为默认文件管理器](https://eugene-andrienko.com/2025-07-24-x11-configuration-simple.html#xdg-utils-directory)。
[^2]: 脚注原文:`2 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#fn.project)`
[^3]: 脚注原文:`3 (https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#fn.jabber)`
## 文件操作
常见的文件操作:复制、移动或删除一组文件——非常简单。"只需"用`m`快捷键标记一些文件,然后复制/移动它们(参见Emacs手册中的[32.7 操作文件](https://www.gnu.org/software/emacs/manual/html_node/emacs/Operating-on-Files.html))。
包含5个文件的Dired缓冲区,其中3个文件被标记并显示为紫色粗体。
我在"只需"上加了引号,因为标记文件不仅仅有`m`快捷键。有很多方法可以做到——请查看Emacs手册中的[32.6 Dired标记与标志](https://www.gnu.org/software/emacs/manual/html_node/emacs/Marks-vs-Flags.html)一节。大多数时候我使用以下标记文件的方法:
| 快捷键 | 描述 |
|--------|------|
| `* s` | 标记所有文件和目录 |
| `* .` | 标记具有指定扩展名的文件 |
| `% m` | 标记名称匹配正则表达式的文件 |
| `U` | 移除所有标记 |
| `t` | 切换标记 |
例如,我用`* .`来按扩展名标记不需要的文件并删除它们。例如,删除所有*webp*图片:`* . webp RET D y RET`。巧妙之处:如果光标已经在WEBP图片所在的行,那么只需`* . RET D y RET`即可,`webp`部分默认预选。顺便说一句,这些长的"快捷键"并不是真正的快捷键——有两组单独的快捷键(`* .`和`D`),我对文件扩展名提示的回复,以及对文件删除确认的回复。
另一个例子:如果我想把所有WEBP图片转换为JPG(说实话,我不喜欢WEBP这种*企业图像格式*),那么我会按以下步骤进行:
- 在WEBP图片行上按`* .`,然后按`RET`。
- 此时目录中所有WEBP文件都被选中。
- 然后按`!`,再按几次`M-n`滚动到我之前保存的图片专用命令。
- 当选择了`gm convert ? \`?\`.jpg`命令后,按回车。
- 等待一段时间后,所有WEBP文件通过[GraphicsMagick](http://www.graphicsmagick.org/)转换为JPEG。不需要的WEBP文件可按上述方法删除。
在Dired中选择文件并调用gm convert的过程幻灯片。
你可能想知道我是如何为图片文件定义`gm convert`命令的?答案在[外部程序](https://eugene-andrienko.com/2026-07-05-my-emacs-configuration-dired.html#dired-external-programs)一节中。
另一个我最喜欢的快捷键是`% m`——借助正则表达式的力量,我终于能够以非常巧妙的方式选择某个目录中的任意文件——这是我在使用CLI或`mc`进行文件操作时所缺失的功能。如果我没记错,`mc`允许通过正则表达式选择文件,但Dired的这个功能要丰富得多。这里是一个合成示例,我用`^e6f.\+\\.webp\\.?\\\([a-z]\\{3\\}\\\)?`正则表达式选择从子串`e6f`开始并以`\.webp`或`\.webp\.SOME_3_LETTER_EXTEN`结尾的图像文件:
在Dired中基于正则表达式选择文件的过程幻灯片。
与描述的*标记*分开,文件也可以被*标记为删除*——在Dired中*标记*和*标志*是不同的,所以我可以在*标记*一些文件以便复制到其他地方的同时,*标志*其他文件以便删除。这些*标志*文件会有与*标记*文件不同的外观——例如,如果*标记*文件为紫色(见上面的截图),那么*标志*文件将是红色:
包含5个文件的Dired缓冲区,其中3个文件被标记为删除并显示为红色。
手动*标志*使用`d`热键。而要删除*标志*的文件,可以使用`x`热键。当然,还有更多我用来*标志*文件以便删除的快捷键:
| 快捷键 | 描述 |
|--------|------|
| `% &` | 标志垃圾文件 |
| `% d` | 按正则表达式标志文件 |
"垃圾文件"由变量`dired-garbage-files-regexp`定义。例如,在我的配置中,LaTeX构建的产物被视为"垃圾":
```elisp
;; 垃圾文件的正则表达式。
;; 这些文件可以用"% &"标志
(setopt dired-garbage-files-regexp
"\\(?:\\.\\(?:aux\\|bak\\|dvi\\|log\\|o\\|orig\\|rej\\|toc\\)\\)\\'")
```
所以,当我按`% &`时,当前目录中的所有LaTeX构建产物都会被选中以便删除。`% d`的工作方式类似于`% m`快捷键,但它*标志*文件而不是*标记*它们。
### 强力重命名
让我们看看Dired最强大的功能之一。既然目录列表只是Emacs中的一个缓冲区——它可以像普通文本一样编辑?当然可以!这就是WDired模式的作用——它使Dired缓冲区可写。因此文件名可以像普通文本一样编辑:借助`isearch-query-replace-regexp`、宏和其他酷炫的Emacs功能。
要进入WDired模式,可以使用`C-x C-q`快捷键。而`C-c C-c`快捷键将返回普通Dired模式并应用所有更改。`C-c C-k`快捷键返回普通Dired模式并放弃所有更改。
我经常使用WDired模式来从文件名中去除不需要的文本。例如,我想从许多像下面这样的文件名中删除`.fb2`部分:
```
some-interesting-book.fb2.epub
```
在这种情况下,我只执行以下步骤:
1. 按`C-x C-q`进入WDired模式
2. 输入`C-s \.fb2 M-% RET \!`——所有的`.fb2`后缀就消失了!基本上,这里用了3个命令:
1. 用`C-s`搜索`\.fb2`子串
2. 用`M-%`快捷键调用`query-replace`
3. 告诉Emacs替换字符串是空的——不输入任何字符串,只按`RET`键。
4. 告诉Emacs应该替换缓冲区中的所有出现,不再提问——按`\!`
3. 按`C-c C-c`应用更改。
另一个好例子(不使用正则表达式)。这里,我有来自"正则表达式"(Регулярные выражения)播客的音频文件:
Emacs Dired缓冲区中列出了播客剧集。
如你所见,文件名命名得很糟糕:月份、日期和小时对于小于10的数字没有前置的`0`,所以文件排序混乱。我可以通过在Dired缓冲区中重命名所有文件来修复:
Emacs Dired缓冲区中通过WDired手动重命名文件的例子。
当然,这里也可以使用正则表达式进行一些自动化操作,但我只是想展示WDired缓冲区可以像文本一样直接编辑。
默认情况下,WDired只允许更改文件名。但它也可以编辑Unix访问权限,使用`r`、`w`和`x`按钮,通过在配置中添加以下一行:
```elisp
(setopt wdired-allow-to-change-permissions t)
```
如果在Dired缓冲区中禁用了`dired-hide-details-mode`(可以通过按`(`键实现),那么访问权限将可见,并可以使用以下按键更改:
- `r`:设置读权限
- `w`:设置写权限
- `x`:设置执行权限
- `-`:移除光标下的权限
### 像在mc(或Far)中一样复制/移动文件
两个垂直窗口,各自包含Dired缓冲区。
基本上,这里没有什么Dired特有的——只需创建两个垂直窗口并在每个窗口中打开Dired缓冲区。但是,有一个陷阱——在默认设置下,你无法模仿`mc`中的常见操作:像`mc`或Far那样,在复制文件时自动填写目标目录的路径。为了解决这个问题,我设置了以下选项:
```elisp
(setopt dired-dwim-target t)
```
然后在按下`C`(复制)或`R`(重命名/移动)时,目标路径会自动从第二个Dired窗口获取。
### 搜索
常见的搜索操作可以像在任何其他Emacs缓冲区中一样执行(例如用`C-s`)。我上面已经提供了一些不那么简单的例子。有一个与Dired相关的变量,我做了更改,以便用`C-s`热键只搜索文件名(跳过目录):
```elisp
(setopt dired-isearch-filenames t)
```
另一个我常用的热键是`j`。它允许通过输入文件名将光标移动到Dired缓冲区中的所需文件或目录:
用j热键跳转到2026-04-28-emacs-dired-marked-files.png。
当然,还有更多命令可以使用。有两个值得注意且非常有用的命令:
- find-name-dired
- find-grep-dired
我不知道Linux世界的情况,但在BSD世界中,需要以下设置才能使用这些命令并在Emacs中看到漂亮的输出,因为Dired的默认设置是针对Linux coreutils而不是BSD coreutils的:
```elisp
(setopt find-grep-options "-q")
(setopt find-ls-option '("-ls" . "-dils"))
```
#### find-name-dired
第一个很酷的命令是`M-x find-name-dired`。它在给定目录中搜索具有给定文件名(允许通配符)的文件。找到的文件会显示在漂亮的Dired缓冲区中,并具有上述的所有Dired相关功能。例如,`M-x find-name-dired RET /bin RET c* RET`的结果:
Emacs Dired缓冲区中显示find-name-dired命令的结果。
基本上,它只是`find DIR -name NAME`命令的界面,但输出为Dired缓冲区。
相似文章
离开 Magit 后的 Emacs
作者讲述了他们离开 Emacs 的 Magit Git 界面,转而采用 VC-mode 和自定义 Git 脚本等替代方案的经历,重点介绍了其中的调整和所学到的经验教训。
我的I3-Emacs集成方案
一位开发者描述了如何修补i3窗口管理器,使其在聚焦时将按键事件传递给Emacs,从而实现i3与Emacs共享键盘快捷键。
推荐一下……理解 Emacs 的模式
文章解释了 Emacs 的架构模式,重点介绍了通用缓冲区数据模型和增量补全读取(ICR),并将其比作玫瑰的根与花瓣。文章强调了 Emacs 如何统一界面并通过 Elisp 实现可扩展性。
Emacs 的更多内置功能
一篇博客文章,介绍了Emacs中不太为人所知但实用的内置功能,延续了一个旨在提高原版Emacs功能可发现性的系列。
Emacs 31 即将到来:我日常使用的变化
Emacs 31 即将到来,带来了更简单的 tree-sitter 配置和内置的 markdown-ts-mode 等改进。本文详细介绍了作者在开发分支中使用的一些特性,强调了配置工作量的减少。