我的 Emacs 配置(Dired)

Hacker News Top 工具

摘要

一份关于配置和使用 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

Lobsters Hottest

作者讲述了他们离开 Emacs 的 Magit Git 界面,转而采用 VC-mode 和自定义 Git 脚本等替代方案的经历,重点介绍了其中的调整和所学到的经验教训。

我的I3-Emacs集成方案

Hacker News Top

一位开发者描述了如何修补i3窗口管理器,使其在聚焦时将按键事件传递给Emacs,从而实现i3与Emacs共享键盘快捷键。

推荐一下……理解 Emacs 的模式

Lobsters Hottest

文章解释了 Emacs 的架构模式,重点介绍了通用缓冲区数据模型和增量补全读取(ICR),并将其比作玫瑰的根与花瓣。文章强调了 Emacs 如何统一界面并通过 Elisp 实现可扩展性。

Emacs 的更多内置功能

Lobsters Hottest

一篇博客文章,介绍了Emacs中不太为人所知但实用的内置功能,延续了一个旨在提高原版Emacs功能可发现性的系列。

Emacs 31 即将到来:我日常使用的变化

Hacker News Top

Emacs 31 即将到来,带来了更简单的 tree-sitter 配置和内置的 markdown-ts-mode 等改进。本文详细介绍了作者在开发分支中使用的一些特性,强调了配置工作量的减少。