Dired 中文文档

Table of Contents

Dired 可以在一个 Emacs buffer 中包含一个目录的列表, 也可以选择性地包含其子目录. 你可以使用常规的 Emacs 命令在这个 buffer 中移动, 并使用特殊的 Dired 命令来操作列出的文件. Dired 既适用于本地目录, 也适用于远程目录.

Dired buffer 通常是只读的, 不允许在其中插入文本. 普通的打印字符(如 dx)被重新定义为特殊的 Dired 命令. 一些 Dired 命令会标记(mark)或以此为旗标(flag)标出当前文件(即当前行所在的文件); 其他命令则对已标记的文件或带有旗标的文件进行操作. 你需要先标记某些文件, 以便通过一个命令对所有这些文件进行操作.

Dired-X 扩展包为 Dired mode 提供了各种额外功能. 请参阅 Dired Extra User' s Manual 中的 Dired-X.

你也可以使用 C-x C-d (list-directory) 查看目录中的文件列表. 与 Dired 不同, 此命令不允许你对列出的文件进行操作. 请参阅 File Directories.

1. 打开Dired

要调用 Dired, 请输入 C-x d (dired). 这将使用 minibuffer 读取目录名称, 并打开一个列出该目录中文件的 Dired buffer. 你也可以提供一个通配符文件名模式作为 minibuffer 的参数, 在这种情况下, Dired buffer 将列出所有匹配该模式的文件. 通配符也可以出现在目录部分. 例如:

C-x d  ~/foo/*.el  RET
C-x d  ~/foo/*/*.el  RET

前者列出目录 foo 中所有扩展名为 .el 的文件. 后者列出 foo 的所有子目录中扩展名为 .el 的文件.

在 Posix 系统上, 当系统 shell 支持 globstar(一种递归 globbing 功能)并且该支持已启用时, 你可以在 Dired 中使用递归 globbing:

C-x d  ~/foo/**/*.el  RET

此命令生成一个目录列表, 其中包含扩展名为 .el 的所有文件, 递归地包含 foo 的所有子目录. 请注意, 不同 shell 之间 globstar 的实现存在细微差异. 请查阅你的 shell 手册以了解预期行为.

如果 shell 支持 globstar, 但默认情况下禁用了该支持, 你仍然可以通过自定义 dired-maybe-use-globstar 为非 nil 值来让 Dired 使用此功能; 然后 Dired 将为那些它知道如何操作的 shell 启用 globstar(有关这些 shell 的列表, 请参阅 dired-enable-globstar-in-shell).

常规的历史记录和补全命令可以在 minibuffer 中使用; 特别是, M-n 将已访问文件的名称(如果有)放入 minibuffer 中(请参阅 Minibuffer History).

你也可以通过给 C-x C-f (find-file) 一个目录名称来调用 Dired.

你可以通过输入 C-x C-j (dired-jump) 要求 Emacs 在任何 buffer 的 default-directory~(请参阅 ~default-directory)上调用 Dired. 如果该 buffer 访问了一个文件, 此命令将把 point 移动到它所显示的 Dired buffer 中该文件所在的行; 否则, point 将停在目录列表中的第一个文件上. 作为一个例外, 如果你在 Dired buffer 中输入 C-x C-j, Emacs 将显示父目录的目录列表, 并将 point 放置在对应于你调用 dired-jump 的目录的行上. 输入 C-x 4 C-j (dired-jump-other-window) 具有相同的效果, 但在新窗口中显示 Dired buffer.

变量 dired-listing-switches 指定了列出目录时传递给 ls 的选项; 此字符串必须包含 -l. 如果你在 dired 命令中使用前缀参数, 你可以在输入目录规范之前在 minibuffer 中指定 ls 开关. 无论它们如何指定, ls 开关都可以包括不需要参数的短选项(即单个字符)和参数用 = 指定的长选项(以 -- 开头).

Dired 不能很好地处理名称中嵌入换行符的文件. 如果你有许多这样的文件, 你可以考虑将 -b 添加到 dired-listing-switches 中. 这将引用所有特殊字符并允许 Dired 更好地处理它们. (你也可以使用 C-u C-x d 命令临时添加 -b. )

dired-listing-switches 可以声明为 connection-local 变量, 以调整它来匹配远程系统的期望(请参阅 Per-Connection Local Variables).

Dired 在 mode line 中显示用于调用 ls 的开关指示. 默认情况下, Dired 将尝试确定开关是否表示按名称或日期排序, 并在 mode line 中说明. 如果 dired-switches-in-mode-line 变量为 as-is, 则开关将逐字显示. 如果此变量的值是一个整数, 则开关显示将被截断为该长度. 此变量也可以是一个函数, 该函数将以 dired-actual-switches 作为唯一参数被调用, 并应返回一个要在 mode line 中显示的字符串.

如果你的 ls 程序支持 --dired 选项, Dired 会自动传递该选项; 这会导致 ls 为某些不寻常的文件名发出特殊的转义序列, 没有这些序列, Dired 将无法解析这些名称. 当你首次在 Emacs 会话中运行 Dired 时, 它会通过调用一次 ls 来检查是否支持 --dired 选项. 如果退出代码为 0, Dired 将随后使用 --dired 选项; 否则将不使用. 你可以通过自定义变量 dired-use-ls-dired 来禁止此检查. 值 unspecified~(默认值)意味着执行检查; 任何其他非 nil 值意味着使用 ~--dired 选项; nil 意味着不使用 --dired 选项.

在 MS-Windows 和 MS-DOS 系统上, 以及在某些远程系统上, Emacs 模拟 ls. 有关此模拟的选项和特性, 请参阅 Emulation of ls on MS-Windows.

要在另一个窗口中显示 Dired buffer, 请使用 C-x 4 d (dired-other-window). C-x 5 d (dired-other-frame) 在单独的 frame 中显示 Dired buffer.

输入 q (quit-window) 会隐藏 Dired buffer, 如果该窗口是专门为该 buffer 创建的, 则删除该窗口.

2. 导航

所有常规的 Emacs 光标移动命令都在 Dired buffer 中可用. 键 C-nC-p 分别被重新定义为运行 dired-next-linedired-previous-line, 它们将光标放在行上的文件名开头, 而不是行的开头.

为了更加方便, Dired 中的 SPCn 等同于 C-n. p 等同于 C-p. (在 Dired 中按行移动非常常见, 因此值得让它更容易输入. )~DEL~(向上移动并取消旗标)通常也仅用于向上移动(请参阅 Deleting Files with Dired).

j (dired-goto-file) 使用 minibuffer 提示输入文件名, 并将 point 移动到 Dired buffer 中描述该文件的行.

M-s f C-s (dired-isearch-filenames) 在 Dired buffer 中执行向前增量搜索, 仅在文件名中查找匹配项, 并忽略 buffer 中的其余文本. M-s f M-C-s (dired-isearch-filenames-regexp) 执行相同的操作, 但使用正则表达式搜索. 如果你将变量 dired-isearch-filenames 更改为 t, 那么常规搜索命令也会限制在文件名中; 例如, C-s 的行为类似于 M-s f C-s. 如果值为 dwim, 则仅当 point 最初位于文件名上时, 搜索命令才匹配文件名. 有关增量搜索的信息, 请参阅 Searching and Replacement.

当 Dired buffer 包含多个目录时, 可以使用一些额外的导航命令. 请参阅 Moving Over Subdirectories.

3. 删除文件

Dired 最常用的用途之一是首先标记要删除的文件(flag for deletion), 然后删除已标记的文件.

d
标记此文件以进行删除 (dired-flag-file-deletion).
u
移除删除旗标 (dired-unmark).
DEL
将 point 移至上一行并移除该行的删除旗标 (dired-unmark-backward).
x
删除标记为要删除的文件 (dired-do-flagged-delete).

你可以通过移动到描述文件的行并输入 d (dired-flag-file-deletion) 来标记要删除的文件. 删除旗标在该行开头显示为 D. 此命令将 point 移动到下一行, 以便重复的 d 命令可以标记连续的文件. 数字前缀参数用作重复计数; 负计数意味着标记前面的文件.

如果 region 处于活动状态, d 命令将标记 region 中的所有文件以进行删除; 在这种情况下, 命令不会移动 point, 并忽略任何前缀参数.

标记文件以进行删除而不是立即删除文件的原因是, 为了减少意外删除文件的危险. 在你指示 Dired 删除已标记的文件之前, 你可以使用命令 uDEL 移除删除旗标. u (dired-unmark) 的工作方式类似于 d, 但它是移除旗标而不是设置旗标. DEL (dired-unmark-backward) 向上移动, 移除旗标; 它就像参数为 -1 的 u. 这两个命令的数字前缀参数都用作重复计数, 负计数意味着在相反方向上移除旗标. 如果 region 处于活动状态, 这些命令将取消标记 region 中的所有文件, 而不移动 point.

要删除已标记的文件, 请输入 x (dired-do-flagged-delete). 此命令显示所有标记为要删除的文件名的列表, 并请求用 yes 确认. 如果你确认, Dired 将删除已标记的文件, 然后从 Dired buffer 的文本中删除它们的行. Dired buffer 保持被选中状态, 行数会稍微减少.

如果你在被要求确认时回答 no 或使用 C-g 退出, 你将立即返回到 Dired, 删除旗标仍然存在于 buffer 中, 实际上没有文件被删除.

你可以像删除其他文件一样删除空目录, 但通常 Dired 无法删除非空的目录. 但是, 如果变量 dired-recursive-deletes 为非 nil, 则允许 Dired 删除非空目录及其所有内容. 这可能有点冒险. 如果该变量的值为 always, Dired 将递归删除非空目录, 这甚至更加冒险.

即使你已将 dired-recursive-deletes 设置为 nil, 你有时候可能也想递归删除目录而不被要求逐个确认. 例如, 当你标记了许多目录进行删除并且非常确定它们都可以安全删除时, 你可能希望如此. 对于每一个要求你确认删除的非空目录, 如果你回答 all, 那么所有剩余的目录将被删除而不再有进一步的提问.

如果你将变量 delete-by-moving-to-trash 更改为 t, 上述删除命令将把受影响的文件或目录移动到操作系统的回收站, 而不是直接删除它们. 请参阅 Miscellaneous File Operations.

删除文件的另一种方法是用 m 标记它们并用 D 删除, 请参阅 Operating on Files.

4. 标记多个文件

#, ~, ., % &% d 命令根据文件名标记许多文件以进行删除:

#
标记所有自动保存文件(名称以 # 开头和结尾的文件)以进行删除(请参阅 Auto-Saving: Protection Against Disasters).
~
标记所有备份文件(名称以 ~ 结尾的文件)以进行删除(请参阅 Backup Files).
. (Period)
标记多余的数字备份文件以进行删除. 任何一个文件的最旧和最新的几个备份文件是豁免的; 中间的那些会被标记.
% &
标记某些名称暗示你可以轻松再次创建的类型的文件以进行删除.
% d regexp RET
标记名称匹配正则表达式 regexp 的所有文件以进行删除.

# (dired-flag-auto-save-files) 标记所有名称看起来像自动保存文件的文件–即名称以 # 开头和结尾的文件. 请参阅 Auto-Saving: Protection Against Disasters.

~ (dired-flag-backup-files) 标记所有名称表明它们是备份文件的文件–即名称以 ~ 结尾的文件. 请参阅 Backup Files.

. (句点, dired-clean-directory) 仅标记部分备份文件以进行删除: 除了任何一个文件的最旧的几个和最新的几个备份之外的所有备份. 通常, 每个文件保留的最新版本数量由变量 dired-kept-versions 给定(不是 kept-new-versions; 那是仅在保存时适用的). 要保留的最旧版本数量由变量 kept-old-versions 给定.

带有正数参数的句点, 如 C-u 3 ., 指定要保留的最新版本数, 覆盖 dired-kept-versions. 负数参数覆盖 kept-old-versions, 使用参数值的负数来指定每个文件要保留的最旧版本数.

% & (dired-flag-garbage-files) 标记名称匹配变量 dired-garbage-files-regexp 指定的正则表达式的文件. 默认情况下, 这匹配 TeX 生成的某些文件, .bak 文件以及 patch 生成的 .orig.rej 文件.

% d 标记名称匹配指定正则表达式的所有文件 (dired-flag-files-regexp). 匹配时仅使用文件名的非目录部分. 你可以使用 ^$ 来锚定匹配. 你可以通过在使用 % d 时隐藏某些子目录来排除它们. 请参阅 Hiding Subdirectories.

5. 访问文件

有几个 Dired 命令用于访问或检查 Dired buffer 中列出的文件. 所有这些都适用于当前行的文件; 如果该文件实际上是一个目录, 这些命令将在该子目录上调用 Dired(生成一个单独的 Dired buffer).

f
访问当前行描述的文件, 就像输入 C-x C-f 并提供该文件名一样 (dired-find-file). 请参阅 Visiting Files.
RET
e
等同于 f.
o
类似于 f, 但使用另一个窗口显示文件的 buffer (dired-find-file-other-window). Dired buffer 在第一个窗口中保持可见. 这就像使用 C-x 4 C-f 访问文件. 请参阅 Multiple Windows.
C-o
访问当前行描述的文件, 并在另一个窗口中显示 buffer, 但不选择该窗口 (dired-display-file).
mouse-1
mouse-2
访问你点击名称的文件 (dired-mouse-find-file-other-window). 这使用另一个窗口来显示文件, 类似于 o 命令.
v
使用 View mode 查看当前行描述的文件 (dired-view-file). View mode 提供方便的命令来导航 buffer 但禁止更改它; 请参阅 View Mode.
^
访问当前目录的父目录 (dired-up-directory). 这等同于移动到 .. 行并在那里输入 f.

User Option: dired-kill-when-opening-new-dired-buffer

当在 Dired 中访问新的子目录时, Emacs 默认会打开一个新的 buffer 来显示这个新目录, 并保持旧的 Dired buffer 不变. 如果此用户选项为非 nil, 则旧的 Dired buffer 将在选择新目录后被 kill. 这意味着如果你在 Dired 中遍历目录结构, 你最终不会拥有超过一个单一的 Dired buffer.

6. Marks vs. Flags

除了用 D 标记文件(flagging), 你还可以用其他字符(通常是 *)标记文件(mark). 大多数操作文件的 Dired 命令都使用标记为 * 的文件. 唯一操作带有 D 旗标文件的命令是 x, 它会删除它们.

以下是一些用于标记 *, 取消标记以及对标记进行操作的命令. (有关标记和取消标记文件删除旗标的命令, 请参阅 Deleting Files with Dired. )

m
* m
* 标记当前文件 (dired-mark). 如果 region 处于活动状态, 则标记 region 中的所有文件; 否则, 如果提供了数字参数 n, 则标记接下来的 n 个文件, 从当前文件开始(如果 n 为负数, 则标记前面的 -n 个文件). 如果在子目录标题行上调用(请参阅 Subdirectories in Dired), 此命令将标记该子目录中的所有文件.
* N
报告已标记文件的数量和大小 (dired-number-of-marked-files).
* *
* 标记所有可执行文件 (dired-mark-executables). 带有数字参数时, 取消标记所有这些文件.
* @
* 标记所有符号链接 (dired-mark-symlinks). 带有数字参数时, 取消标记所有这些文件.
* /
* 标记所有是目录的文件, 除了 ... (dired-mark-directories). 带有数字参数时, 取消标记所有这些文件.
* s
标记当前子目录中的所有文件, 除了 ... (dired-mark-subdir-files).
u
* u
移除此行上的任何标记 (dired-unmark). 如果 region 处于活动状态, 则取消标记 region 中的所有文件; 否则, 如果提供了数字参数 n, 则取消标记接下来的 n 个文件, 从当前文件开始(如果 n 为负数, 则取消标记前面的 -n 个文件).
DEL
* DEL
将 point 移至上一行并移除该行上的任何标记 (dired-unmark-backward). 如果 region 处于活动状态, 则取消标记 region 中的所有文件; 否则, 如果提供了数字参数 n, 则取消标记前面的 n 个文件, 从当前文件开始(如果 n 为负数, 则取消标记接下来的 -n 个文件).
* !
U
移除此 Dired buffer 中所有文件的所有标记 (dired-unmark-all-marks).
* ? markchar
M-DEL
移除所有使用字符 markchar 的标记 (dired-unmark-all-files). 如果是用 M-DEL 调用的, 该命令会提示输入 markchar. markchar 是单个字符–不要使用 RET 终止它. 请参阅下面的 * c 命令描述, 它允许你用另一个标记字符替换一个标记字符. 带有数字参数时, 此命令会询问每个已标记的文件, 询问是否移除其标记. 你可以回答 y 表示是, n 表示否, 或 ! 表示移除剩余文件的标记而不再询问.
* C-n
M-}
向下移动到下一个已标记的文件 (dired-next-marked-file). 如果文件有任何类型的标记, 它就是" 已标记" 的.
* C-p
M-{
向上移动到上一个已标记的文件 (dired-prev-marked-file).
t
* t
切换所有标记 (dired-toggle-marks): 标记为 * 的文件变为未标记, 未标记的文件被标记为 *. 以任何其他方式标记的文件不受影响.
* c old-markchar new-markchar
将所有使用字符 old-markchar 的标记替换为使用字符 new-markchar 的标记 (dired-change-marks). 此命令是创建或使用除 *D 以外的标记的主要方式. 参数是单个字符–不要使用 RET 终止它们. 你可以通过此命令使用几乎任何字符作为标记字符, 以区分各类文件. 如果 old-markchar 是空格 (~ ), 则该命令对所有未标记的文件进行操作; 如果 ~new-markchar 是空格, 则该命令取消标记它所作用的文件. 为了说明此命令的强大功能, 这里是如何在所有没有标记的文件上放置 D 旗标, 同时取消标记所有已经有 D 旗标的文件: * c D t * c SPC D * c t SPC 这假设没有文件已经被标记为 t.
% m regexp RET
* % regexp RET
标记(用 *)所有名称匹配正则表达式 regexp 的文件 (dired-mark-files-regexp). 此命令类似于 % d, 只是它用 * 标记而不是用 D 标记. 匹配时仅使用文件名的非目录部分. 使用 ^$ 来锚定匹配. 你可以通过临时隐藏子目录来排除它们(请参阅 Hiding Subdirectories).
% g regexp RET
标记(用 *)所有内容包含正则表达式 regexp 匹配项的文件 (dired-mark-files-containing-regexp). 此命令类似于 % m, 除了它搜索文件内容而不是文件名. 请注意, 如果文件在 Emacs buffer 中被访问, 并且 dired-always-read-filesystemnil (默认值), 则此命令将在 buffer 中查找而不重新访问文件, 因此如果文件内容自上次访问以来已更改, 结果可能与磁盘上的文件不一致. 如果你不希望这样, 你可能希望在调用此命令之前 revert 你在 buffer 中访问的文件, 或者在这些 buffer 中打开 Auto-Revert mode. 请参阅 Reverting a Buffer. 如果你更喜欢此命令始终重新访问文件, 而无需你 revert 文件或启用 Auto-Revert mode, 你可能希望将 dired-always-read-filesystem 设置为非 nil.
C-/
C-x u
C-_
撤消 Dired buffer 中的更改, 例如添加或移除标记 (dired-undo). 此命令不会 revert 实际的文件操作, 也不会恢复丢失的文件! 它只是撤消 buffer 本身的更改. 在某些情况下, 在操作文件的命令之后使用此命令可能会导致麻烦. 例如, 在重命名一个或多个文件后, dired-undo 会在 Dired buffer 中恢复原始名称, 这会导致 Dired buffer 与目录的实际内容不同步.
touchscreen-hold
进入" 点击选择" 模式, 在该模式下, 在文件名上使用鼠标按钮 mouse-2 将导致其标记被切换. 这种模式在触摸屏设备上执行文件管理时非常有用. 当在文件名上检测到" 保持" 手势(请参阅 Using Emacs on Touchscreens)时, 它将启用, 并在 Dired 命令对标记的文件进行操作后自动禁用.

7. 文件操纵

本节描述了操作一个或多个文件的基本 Dired 命令. 所有这些命令都是大写字母; 所有命令都使用 minibuffer, 在操作之前读取参数或请求确认. 所有命令都允许你通过以下方式指定要操作的文件:

  • 如果你给命令一个数字前缀参数 n, 它将对接下来的 n 个文件进行操作, 从当前文件开始. (如果 n 为负数, 命令将对当前行之前的 -n 个文件进行操作. )
  • 否则, 如果某些文件被标记为 *, 命令将对所有这些文件进行操作.
  • 否则, 命令仅对当前文件进行操作.

某些其他 Dired 命令, 如 !% 命令, 使用相同的约定来决定要对哪些文件进行操作.

除了这里描述的 Dired 命令外, 你还可以对 Dired buffer 中显示的一个或多个文件调用版本控制 (VC) 命令. 请参阅 Version Control.

询问目标目录的命令, 例如复制和重命名文件或为它们创建链接的命令, 会尝试猜测操作的默认目标目录. 通常, 它们建议 Dired buffer 的默认目录, 但如果选项 dired-dwim-target 为非 nil, 并且如果在某个窗口中显示了另一个 Dired buffer, 则建议该另一个 buffer 的目录. 你可以自定义 dired-dwim-target 以优先选择下一个带有 Dired buffer 的窗口, 或最近使用的带有 Dired buffer 的窗口, 或使用任何其他函数. 当值为函数时, 它将在没有参数的情况下被调用, 并期望返回一个目录列表, 这些目录将用作默认值(即默认目标和" 未来历史" ).

以下是操作文件的文件处理 Dired 命令:

C new RET
复制指定的文件 (dired-do-copy). 参数 new 是要复制到的目录, 或(如果复制单个文件)新名称. 这类似于 shell 命令 cp. 选项 dired-create-destination-dirs 控制 Dired 在复制/重命名文件时是否应在目标中创建不存在的目录. 默认值 nil 意味着 Dired 从不创建此类缺失的目录; 值 always 意味着 Dired 自动创建它们; 值 ask 意味着 Dired 在创建它们之前询问你确认. 如果除 dired-create-destination-dirs 外, 选项 dired-create-destination-dirs-on-trailing-dirsep 也为非 nil, 则目标目录末尾的目录分隔符会被特殊处理. 在这种情况下, 当复制到 test/ 且没有目录 test 存在时, 它将被创建, 指定的源文件或目录将被复制到新创建的目录中. 如果 dired-copy-preserve-time 为非 nil, 则使用此命令复制会在副本中保留旧文件的修改时间, 类似于 cp -p. 变量 dired-recursive-copies 控制是否递归复制目录(类似于 cp -r). 默认为 top, 这意味着在递归复制目录之前进行询问. 变量 dired-copy-dereference 控制是将符号链接作为链接复制还是在解引用后复制(类似于 cp -L). 默认为 nil, 这意味着通过创建新的符号链接来复制符号链接. dired-keep-marker-copy 用户选项控制此命令如何处理文件标记. 默认是用 C 标记所有新的文件副本.
D
删除指定的文件 (dired-do-delete). 这类似于 shell 命令 rm. 与本节中的其他命令一样, 此命令对标记的文件或接下来的 n 个文件进行操作. 相比之下, x (dired-do-flagged-delete) 删除所有带有旗标的文件.
E
使用外部程序" 打开" 指定的文件 (dired-do-open). 程序根据系统约定选择, 由变量 shell-command-guess-open 确定.
R new RET
重命名指定的文件 (dired-do-rename). 如果你重命名单个文件, 参数 new 是文件的新名称. 如果你重命名多个文件, 参数 new 是将文件移动到的目录(这类似于 shell 命令 mv). 选项 dired-create-destination-dirs 控制 Dired 是否应在 new 中创建不存在的目录. 选项 dired-create-destination-dirs-on-trailing-dirsep 在除 dired-create-destination-dirs 外还设置时, 控制目标末尾的目录分隔符是否被特殊处理. 在这种情况下, 当将目录 old 重命名为 new/ 且没有目录 new 存在时, 它将被创建, old 被移动到新创建的目录中. 否则, old 被重命名为 new. Dired 自动更改与重命名文件关联的 buffer 的访问文件名, 以便它们引用新名称. 如果变量 dired-vc-rename-file 的值为非 nil, 则通过 vc-rename-file 使用底层 VCS 的命令重命名文件(请参阅 Deleting and Renaming Version-Controlled Files).
H new RET
为指定文件创建硬链接 (dired-do-hardlink). 这类似于 shell 命令 ln. 参数 new 是要在其中创建链接的目录, 或(如果只创建一个链接)给链接的名称.
S new RET
为指定文件创建符号链接 (dired-do-symlink). 这类似于 ln -s. 参数 new 是要在其中创建链接的目录, 或(如果只创建一个链接)给链接的名称.
Y new RET
为指定文件创建相对符号链接 (dired-do-relsymlink). 参数 new 是要在其中创建链接的目录, 或(如果只创建一个链接)给链接的名称. 这类似于 dired-do-symlink, 但创建相对符号链接. 例如: foo -> ../bar/foo 它不创建绝对链接, 如: foo -> /path/that/may/change/any/day/bar/foo
M modespec RET
更改指定文件的模式(也称为权限位) (dired-do-chmod). modespec 可以是八进制或符号表示法, 类似于 chmod 程序处理的参数. 此命令不跟随符号链接, 因此如果你尝试在某些模式不可变的平台上更改符号链接的模式, 它会报告错误.
G newgroup RET
将指定文件的组更改为 newgroup (dired-do-chgrp).
O newowner RET
将指定文件的所有者更改为 newowner (dired-do-chown). (在大多数系统上, 只有超级用户可以这样做. ) 变量 dired-chown-program 指定用于执行此工作的程序名称. (此变量是必要的, 因为不同的系统将 chown 放在不同的位置).
T timestamp RET
Touch 指定的文件 (dired-do-touch). 这意味着将其修改时间更新为 timestamp, 默认为当前时间. 这类似于 shell 命令 touch.
P command RET
打印指定的文件 (dired-do-print). 你必须指定用于打印它们的命令, 但 minibuffer 会根据变量 lpr-commandlpr-switches~(~lpr-buffer 使用相同的变量; 请参阅 Printing Hard Copies)做出的合适猜测开始.
Z
压缩指定的文件 (dired-do-compress). 如果文件似乎已经是压缩文件, 则解压缩它. 每个标记的文件都被压缩到其自己的归档中; 如果有 gzip 程序, 则使用它, 否则使用 compress. 在目录名称上, 此命令根据 dired-compress-directory-default-suffix 用户选项生成压缩归档. 默认是包含所有目录文件的 .tar.gz 归档, 通过运行 tar 命令并将输出管道传输到 gzip 来实现. 为了允许解压缩压缩目录, 在 .tar.gz.tgz 归档文件上输入 Z 会将归档中的所有文件解包到一个名称为去掉扩展名的归档名称的目录中.
c
将指定的文件压缩 (dired-do-compress-to) 到文件系统上任何位置的单个归档中. 默认归档由 dired-compress-directory-default-suffix 用户选项控制. 另请参阅 dired-compress-files-alist.
:d
解密指定的文件 (epa-dired-do-decrypt). 请参阅 EasyPG Assistant User' s Manual 中的 Dired integration.
:v
验证指定文件上的数字签名 (epa-dired-do-verify). 请参阅 EasyPG Assistant User' s Manual 中的 Dired integration.
:s
对指定文件进行数字签名 (epa-dired-do-sign). 请参阅 EasyPG Assistant User' s Manual 中的 Dired integration.
:e
加密指定的文件 (epa-dired-do-encrypt). 请参阅 EasyPG Assistant User' s Manual 中的 Dired integration.
L
加载指定的 Emacs Lisp 文件 (dired-do-load). 请参阅 Libraries of Lisp Code for Emacs.
B
字节编译指定的 Emacs Lisp 文件 (dired-do-byte-compile). 请参阅 The Emacs Lisp Reference Manual 中的 Byte Compilation.
I
对此文件运行 Info(假定为 Info 格式的文件).
N
对此文件运行 man(假定为 nroff 格式的文件).
A regexp RET
在所有指定文件中搜索正则表达式 regexp (dired-do-find-regexp). 此命令是 xref-find-references 的变体(请参阅 Searching and Replacing with Identifiers), 它显示 *xref* buffer, 你可以在其中在匹配项之间导航并根据需要使用 Commands Available in the *xref* Buffer 中描述的命令显示它们. 如果任何标记的文件是目录, 则此命令递归搜索这些目录中的所有文件及其任何子目录, 但名称匹配 grep-find-ignored-files 的文件和名称匹配 grep-find-ignored-directories 的子目录除外.
Q regexp RET to RET
对每个指定的文件执行 query-replace-regexp, 将 regexp 的匹配项替换为字符串 to (dired-do-find-regexp-and-replace). 此命令是 xref-query-replace-in-results 的变体. 它呈现一个 *xref* buffer, 列出 regexp 的所有匹配项, 你可以使用该 buffer 中的特殊命令(请参阅 Commands Available in the *xref* Buffer). 特别是, 如果你退出查询替换循环, 你可以在该 buffer 中使用 r 来替换更多匹配项. 请参阅 Searching and Replacing with Identifiers. 与 dired-do-find-regexp 一样, 如果任何标记的文件是目录, 此命令将在这些目录的所有文件及其任何子目录中递归执行替换, 但名称匹配 grep-find-ignored-files 的文件和名称匹配 grep-find-ignored-directories 的子目录除外.

8. 执行shell命令

Dired 命令 ! (dired-do-shell-command) 在 minibuffer 中读取 shell 命令字符串, 并在一个或多个文件上运行该 shell 命令. shell 命令操作的文件按照 Dired 命令的常规方式确定(请参阅 Operating on Files). 命令 X! 的同义词.

命令 & (dired-do-async-shell-command) 做同样的事情, 除了它异步运行 shell 命令. (你也可以通过在 shell 命令末尾附加 & 字符用 ! 来实现这一点. )当命令对多个文件进行操作时, 它会为每个文件运行指定 shell 命令的多个并行副本. 作为一个例外, 如果指定的 shell 命令以 ;;& 结尾, 则 shell 命令将按顺序在每个文件上后台运行; Emacs 在运行下一个之前等待每个调用的 shell 命令终止.

对于 !&, shell 命令的工作目录是 Dired buffer 的顶级目录.

如果你告诉 !& 对多个文件进行操作, shell 命令字符串决定了这些文件如何传递给 shell 命令:

  • 如果你在命令字符串中使用被空格包围的 *, 则命令只运行一次, 用文件名列表替换 *. 文件名的顺序是它们在 Dired buffer 中出现的顺序. 因此, ! tar cf foo.tar * RET 对整个文件名列表运行 tar, 将它们放入一个 tar 文件 foo.tar 中. 如果你想使用 * 作为周围有空格的 shell 通配符, 请写成 *"". 在 shell 中, 这等同于 *; 但由于 * 没有被空格包围, Dired 不会对其进行特殊处理. 如果你这样做, 除非 dired-confirm-shell-commandnil, 否则 Emacs 将提示确认.
  • 否则, 如果命令字符串包含被空格包围的 ??, Emacs 会为每个文件运行一次 shell 命令, 每次都用当前文件名替换 ??. 你可以在命令中多次使用 ??; 同一个文件名替换每次出现. 如果你将它们与 * 混合使用, 命令会报错.
  • 如果命令字符串既不包含 * 也不包含 ??, Emacs 会为每个文件运行一次 shell 命令, 并在末尾添加文件名. 例如, ! uudecode RET 对每个文件运行 uudecode.

要以更复杂的方式迭代文件名, 你可能更喜欢使用显式 shell 循环. 例如, 这里是如何 uuencode 每个文件, 通过将 .uu 附加到输入文件名来生成输出文件名:

for file in * ; do uuencode "$file" "$file" >"$file".uu; done

使用 ? 符号的相同示例:

uuencode ? ? > ?.uu

!& 命令不会尝试更新 Dired buffer 以显示新的或修改过的文件, 因为它们不知道哪些文件会被更改. 使用 g 命令更新 Dired buffer(请参阅 Updating the Dired Buffer).

有关在 Dired 之外运行 shell 命令的信息, 请参阅 Single Shell Commands.

9. 猜测shell命令

根据文件名, Dired 尝试猜测你可能想要对其应用的 shell 命令. 例如, 如果 point 位于名为 foo.tar 的文件上并且你按 !, Dired 将猜测你想要运行 tar xvf, 并建议将其作为默认 shell 命令.

你可以输入 M-n 将默认值放入 minibuffer 进行编辑. 如果给定文件有多个命令, 请多次输入 M-n 以按顺序查看每个匹配的命令.

Dired 仅尝试为单个文件猜测命令, 从不为标记的文件列表猜测.

  • Variable: dired-guess-shell-alist-default ¶ 此变量指定了用于为某些文件猜测合适 shell 命令的预定义规则. 将其设置为 nil 可关闭猜测. ~dired-guess-shell-alist-user~(由用户定义)的元素将覆盖这些规则.
  • Variable: dired-guess-shell-alist-optional ¶ 此变量类似于 dired-guess-shell-alist-default, 但包含各种媒体格式的外部查看器和播放器. 将其设置为 nil 可关闭猜测. 变量 dired-guess-shell-alist-userdired-guess-shell-alist-default 将覆盖这些规则.
  • Variable: dired-guess-shell-alist-user ¶ 如果为非 nil, 此变量指定用户定义的文件正则表达式及其建议命令的 alist. 这些规则优先于变量 dired-guess-shell-alist-defaultdired-guess-shell-alist-optional 中的预定义规则(当运行 dired-do-shell-command 时). 默认为 nil.

alist 的每个元素看起来像:

(regexp command...)

其中每个 command 可以是字符串或计算结果为字符串的 Lisp 表达式. 如果给出了多个命令, 所有命令都将被临时推入历史记录.

shell 命令中的 * 代表匹配 regexp 的文件名. 当 Emacs 调用命令时, 它将用匹配的文件名替换每个 * 实例.

要为 .foo.bar 文件扩展名添加规则, 请将此添加到你的 Init file 中:

(setq dired-guess-shell-alist-user
      (list
       (list "\\.foo$" "foo-command")  ; 固定规则
       ;; 可能还有更多规则...
       (list "\\.bar$"  ; 带有条件测试的规则
             '(if condition
                  "bar-command-1"
                "bar-command-2"))))

这将覆盖相同扩展名的任何预定义规则.

你可以通过 M-x customize-group RET dired-guess RET 找到更多用户选项.

10. 文件名称转换

本节描述了以系统方式更改文件名的 Dired 命令. 每个命令使用通过转换现有名称生成的新名称对部分或所有标记的文件进行操作.

像基本的 Dired 文件操作命令(请参阅 Operating on Files)一样, 这里描述的命令对接下来的 n 个文件, 或所有标记为 * 的文件, 或当前文件进行操作. (要标记文件, 请使用 Dired Marks vs. Flags 中描述的命令. )

本节描述的所有命令都是交互式工作的: 它们要求你确认每个候选文件的操作. 因此, 你可以选择比实际需要操作的文件更多的文件(例如, 使用匹配许多文件的 regexp), 然后当命令提示确认时, 通过输入 yn 筛选选定的名称.

% u
将每个选定的文件重命名为大写名称 (dired-upcase). 如果旧文件名是 Foobar, 新名称是 FOOBAR.
% l
将每个选定的文件重命名为小写名称 (dired-downcase). 如果旧文件名是 Foobar, 新名称是 foobar.
% R from RET to RET
% C from RET to RET
% H from RET to RET
% S from RET to RET
% Y from RET to RET
这五个命令重命名, 复制, 创建硬链接, 创建软链接和创建相对软链接, 在每种情况下都通过从旧文件名进行正则表达式替换来计算新名称.

这四个正则表达式替换命令有效地对选定的文件名执行搜索和替换. 它们读取两个参数: 正则表达式 from 和替换模式 to; 它们将每个旧文件名与 from 匹配, 然后将匹配部分替换为 to. 你可以在 to 中使用 \&\digit 来引用旧文件名中模式匹配的全部或部分, 如 ~replace-regexp~(请参阅 Regexp Replacement). 如果正则表达式在文件名中匹配多次, 则仅替换第一个匹配项.

例如, % R ^.*$ RET x-\& RET 通过在名称前加上 x- 来重命名每个选定的文件. 与此相反, 从每个文件名前面移除 x- 也是可能的: 一种方法是 % R ^x-\(.*\)$ RET \1 RET; 另一种是 % R ^x- RET RET. (使用 ^$ 来锚定应跨越整个文件名的匹配. )

通常, 替换过程不考虑文件的目录名; 它在目录内的文件名上操作. 如果你指定零作为数字参数, 则替换将影响包括目录名在内的整个绝对文件名. (非零参数指定要操作的文件数量. )

你可能希望使用将用于操作文件的相同 regexp from 来选择要操作的文件集. 为此, 用 % m from RET 标记这些文件, 然后在命令中使用相同的正则表达式对文件进行操作. 为了更方便, 用于操作文件的 % 命令使用任何 % 命令中最后指定的正则表达式作为默认值.

11. 文件比较

= (dired-diff) 命令使用 diff 程序将当前文件(point 所在的文件)与另一个文件(使用 minibuffer 读取)进行比较. 用 minibuffer 指定的文件是 diff 的第一个参数, point 所在的文件是第二个参数. diff 程序的输出使用 Diff mode 显示在 buffer 中(请参阅 Comparing Files).

如果 region 处于活动状态, 使用 minibuffer 读取的文件的默认值是 mark 处的文件(即普通的 Emacs mark, 不是 Dired mark; 请参阅 Setting the Mark). 否则, 如果 point 处的文件有备份文件(请参阅 Backup Files), 那就是默认值.

你也可以使用 ediff-files 比较文件, 请参阅 Ediff User' s Manual 中的 Major Entry Points.

12. 子目录

Dired buffer 通常只显示一个目录, 但你可以选择性地包含其子目录.

在一个 Dired buffer 中包含多个目录的最简单方法是指定 -lR 选项来运行 ls. (如果你在运行 Dired 时给出数字参数, 那么你可以在 minibuffer 中指定这些选项. )这将生成一个递归目录列表, 显示所有层级的所有子目录.

通常, 你只想显示特定的子目录. 你可以用 i (dired-maybe-insert-subdir) 做到这一点:

i
在 buffer 的后面插入子目录的内容.

如果你在描述目录文件的行上使用此命令, 它将把该目录的内容插入到同一个 Dired buffer 中, 并移动到那里. 插入的子目录内容跟随 Dired buffer 的顶级目录, 就像它们在 ls -lR 输出中所做的那样.

如果子目录的内容已经存在于 buffer 中, i 命令只是移动到它.

在这两种情况下, i 在移动之前设置 Emacs mark, 所以 C-u C-SPC 返回你在 Dired buffer 中的先前位置(请参阅 Setting the Mark). 你也可以使用 ^ 返回同一个 Dired buffer 中的父目录(请参阅 Visiting Files in Dired).

使用 l 命令 (dired-do-redisplay) 更新子目录的内容, 并在子目录标题行上使用 C-u k 移除子目录列表(请参阅 Updating the Dired Buffer). 你也可以隐藏和显示已插入的子目录(请参阅 Hiding Subdirectories).

13. 子目录切换

你可以使用 C-u i 在 Dired buffer 中插入带有指定 ls 开关的子目录. 你可以使用 C-u l 更改 point 处已插入子目录的 ls 开关.

如果你 revert buffer, Dired 会保留开关. 删除子目录会忘记它的开关.

使用 dired-undo~(请参阅 Dired Marks vs. Flags)重新插入或删除带有显式开关插入的子目录可以绕过 Dired 记住(或忘记)开关的机制. 使用 ~dired-undo 删除子目录不会忘记它的开关. 当稍后使用 i 重新插入时, 它将使用其旧开关重新插入. 使用 dired-undo 重新插入使用常规 Dired 命令(不是 dired-undo)删除的子目录最初将使用其旧开关插入它. 然而, revert buffer 将使用 buffer 的默认开关重新列出它. 如果这产生任何问题, 你可以使用 C-u iC-u l 轻松纠正这种情况.

Dired 不记得 R 开关. 插入带有包含 R 开关的开关的子目录等同于使用所有剩余开关插入其每个子目录. 例如, 更新或 kill 带有 R 开关插入的子目录将不会更新或 kill 其子目录.

Buffer 的默认开关不影响使用显式指定开关插入的子目录. 特别是, 像 s 这样更改 buffer 开关的命令不影响此类子目录. (然而, 它们确实影响没有显式分配开关的子目录. )

你可以使用 M-x dired-reset-subdir-switches 让 Dired 忘记所有子目录开关并使用 buffer 的默认开关重新列出所有子目录. 这也 revert Dired buffer.

14. 子目录跳转

当 Dired buffer 列出子目录时, 你可以使用页面移动命令 C-x [C-x ] 按整个目录移动(请参阅 Pages).

以下命令在一个 Dired buffer 中的目录树中横向, 向上和向下移动. 它们移动到目录标题行, 即给出目录名称的行, 位于目录内容的开头.

C-M-n
转到下一个子目录标题行, 不论层级 (dired-next-subdir).
C-M-p
转到上一个子目录标题行, 不论层级 (dired-prev-subdir).
C-M-u
向上转到父目录的标题行 (dired-tree-up).
C-M-d
在目录树中向下, 转到第一个子目录的标题行 (dired-tree-down).
<
向上移动到上一个目录文件行 (dired-prev-dirline). 这些行是在其父目录中将目录描述为文件的行.
>
向下移动到下一个目录文件行 (dired-next-dirline).
M-G
提示输入目录并移动到其目录文件行 (dired-goto-subdir).

15. 隐藏子目录

隐藏子目录意味着使其不可见, 除了其标题行.

$
隐藏或显示 point 所在的子目录, 并将 point 移至下一个子目录 (dired-hide-subdir). 这是一个开关. 数字参数用作重复计数.
M-$
隐藏此 Dired buffer 中的所有子目录, 只留下它们的标题行 (dired-hide-all). 或者, 如果当前有任何子目录被隐藏, 则使所有子目录再次可见. 你可以使用此命令在非常深的目录树中获得概览或快速移动到远处的子目录.

普通的 Dired 命令从不考虑隐藏子目录内的文件. 例如, 操作标记文件的命令会忽略隐藏目录中的文件, 即使它们被标记. 因此, 你可以使用隐藏来临时从操作中排除子目录, 而无需移除这些子目录中文件的 Dired 标记.

请参阅 Subdirectories in Dired 了解如何插入子目录列表, 以及 Updating the Dired Buffer 了解如何删除它.

16. 更新dired buffer

本节描述了更新 Dired buffer 以反映目录和文件中的外部(非 Dired)更改以及删除部分 Dired buffer 的命令.

g
更新 Dired buffer 的全部内容 (revert-buffer).
l
更新指定的文件 (dired-do-redisplay). 你指定 l 的文件的方式与文件操作相同.
k
删除指定的文件行–不是文件, 只是行 (dired-do-kill-lines).
s
在字母顺序和日期/时间顺序之间切换 (dired-sort-toggle-or-edit).
C-u s switches RET
使用 switches 作为 dired-listing-switches 刷新 Dired buffer.

输入 g (revert-buffer) 根据列出的文件和目录的更改更新 Dired buffer 的内容. 这将保留所有标记, 除了那些已消失的文件上的标记. 隐藏的子目录会更新但保持隐藏.

要仅更新部分文件, 请输入 l (dired-do-redisplay). 像 Dired 文件操作命令一样, 此命令对接下来的 n 个文件(或前面的 -n 个文件), 或标记的文件(如果有), 或当前文件进行操作. 更新文件意味着读取其当前状态, 然后更新 buffer 中的行以指示该状态.

如果你在子目录标题行上使用 l, 它会更新相应子目录的内容.

如果你使用 C-x d 或其他 Dired 命令访问已在 Dired buffer 中显示的目录, Dired 会切换到该 buffer 但不会更新它. 如果 buffer 不是最新的, Dired 会显示警告告诉你要输入 g 来更新它. 你也可以通过将变量 dired-auto-revert-buffer 设置为非 nil 值来告诉 Emacs 在重新访问时自动 revert 每个 Dired buffer.

要从 buffer 中删除文件行–而不实际删除文件–请输入 k (dired-do-kill-lines). 像文件操作命令一样, 此命令对接下来的 n 个文件或标记的文件(如果有)进行操作. 但是, 它不对当前文件进行操作, 因为否则打错 k 可能会很烦人.

如果你使用 k kill 你作为子目录插入 Dired buffer 的目录文件的行(请参阅 Subdirectories in Dired), 它也会移除子目录列表. 在子目录的标题行上输入 C-u k 也会从 Dired buffer 中移除子目录行.

g 命令会带回你以这种方式 kill 的任何单独的行, 但不会带回子目录–你必须使用 i 重新插入子目录.

Dired buffer 中的文件通常按文件名的字母顺序排列. 或者, Dired 可以按日期/时间对它们进行排序. Dired 命令 s (dired-sort-toggle-or-edit) 在这两种排序模式之间切换. Dired buffer 中的 mode line 指示当前是如何排序的–按名称还是按日期.

C-u s switches RET 让你为 dired-listing-switches 指定新值.

17. 查找文件

通过使用 find 实用程序选择文件, 你可以更灵活地选择一组文件以在 Dired buffer 中显示.

要搜索名称匹配通配符模式的文件, 请使用 M-x find-name-dired. 它读取参数 directorypattern, 并选择 directory 或其子目录中个别名称匹配 pattern 的所有文件.

由此选出的文件显示在 Dired buffer 中, 在该 buffer 中常规 Dired 命令可用.

如果你想测试文件的内容, 而不是它们的名称, 请使用 M-x find-grep-dired. 此命令读取两个 minibuffer 参数, directoryregexp; 它选择 directory 或其子目录中包含 regexp 匹配项的所有文件. 它的工作原理是运行程序 findgrep. 另请参阅 Searching with Grep under Emacs 中的 M-x grep-find. 记住要为 grep 编写正则表达式, 而不是为 Emacs. (显示内容匹配给定 regexp 的文件的另一种方法是 % g regexp 命令, 请参阅 Dired Marks vs. Flags. )

本系列中最通用的命令是 M-x find-dired, 它允许你指定 find 可以测试的任何条件. 它接受两个 minibuffer 参数, directoryfind-args; 它在 directory 中运行 find, 传递 find-args 以告诉 find 要测试什么条件. 要使用此命令, 你需要知道如何使用 find.

这些命令生成的列表格式由变量 find-ls-option 控制. 这是一对选项; 第一个指定如何调用 find 以生成文件列表, 第二个告诉 Dired 解析输出.

命令 M-x locatelocate 程序提供类似的接口. M-x locate-with-filter 类似, 但只保留名称匹配给定正则表达式的文件.

这些 buffer 的工作方式不完全像普通的 Dired buffer: 文件操作有效, 但并不总是自动更新 buffer. 用 g revert buffer 会删除所有插入的子目录, 并擦除所有旗标和标记.

18. 编辑dired buffer

Wdired 是一种特殊的 mode, 允许你通过直接编辑 Dired buffer 来执行文件操作(" Wdired" 中的" W" 代表" 可写 (writable)" ). 要进入 Wdired mode, 请在 Dired buffer 中输入 C-x C-q (dired-toggle-read-only). 或者, 使用 Immediate / Edit File Names 菜单项.

在 Wdired mode 下, 你可以通过编辑 Dired buffer 中显示的文件名来重命名文件. 所有常规的 Emacs 编辑命令, 包括矩形操作和 query-replace, 都可用于此. 完成编辑后, 输入 C-c C-c (wdired-finish-edit). 这将应用你的更改并切换回普通 Dired mode.

除了简单地重命名文件外, 你还可以通过输入新文件名(绝对路径或相对路径)将文件移动到另一个目录. 要标记文件进行删除, 请删除整个文件名. 要更改符号链接的目标, 请编辑出现在链接名称旁边的链接目标名称.

如果你编辑文件名以创建新的子目录, Wdired 将自动创建这些新目录. 要禁止此行为, 请将 wdired-create-parent-directories 设置为 nil.

buffer 中的其余文本, 如文件大小和修改日期, 被标记为只读, 因此你不能编辑它. 但是, 如果你将 wdired-allow-to-change-permissions 设置为 t, 你可以编辑文件权限. 例如, 你可以将 -rw-r--r-- 更改为 -rw-rw-rw- 以使文件世界可写. 当你输入 C-c C-c 时, 这些更改也会生效.

19. 缩略图

Image-Dired 是一种浏览图像文件的工具. 它提供了以缩略图或全尺寸查看图像的功能, 既可以在 Emacs 内部查看, 也可以通过外部查看器查看. 这与用于在 Emacs buffer 中访问图像文件的 Image mode 不同(请参阅 Viewing Image Files).

要进入 Image-Dired, 请像往常一样使用 m 在 Dired buffer 中标记你要查看的图像文件. 然后输入 C-t d (image-dired-display-thumbs). 这将创建并切换到一个包含对应于标记文件的 Image-Dired 的 buffer.

你也可以通过输入 M-x image-dired 直接进入 Image-Dired. 这会提示输入目录; 指定一个包含图像文件的目录. 这将为该目录中的所有图像创建缩略图, 并在缩略图 buffer 中显示它们. 缩略图在后台生成, 并在可用时加载.

Image-Dired 支持三种生成和存储缩略图的方法, 由选项 image-dired-thumbnail-storage 的值控制:

image-dired
此方法将缩略图作为 JPEG 图像存储在变量 image-dired-dir 指定的单个目录中. 这是默认值. 在这种情况下, 缩略图文件的名称是根据 image-dired-thumb-naming 的值构造的.
standard
standard-large
standard-x-large
standard-xx-large
这些方法由 Thumbnail Managing Standard 强制规定, 将缩略图作为 PNG 图像存储在环境变量 XDG_CACHE_HOME~(默认为 ~~/.cache)指定的目录下的 thumbnails 子目录中.
per-directory
此方法将每个目录的缩略图作为 jpeg 图像存储在该目录的 .image-dired 子目录中.

你可以通过自定义变量 image-dired-thumb-size 来控制缩略图图像的大小. 默认是 128 像素. 此变量仅对上述第一种和第三种缩略图存储方法有效; Thumbnail Managing Standard 使用由方法确定的固定大小: standard 使用 128 像素, standard-large 使用 256 像素等. 如果你在已经创建了一些缩略图后更改大小, 你需要从目录中擦除缩略图文件以使新大小生效.

当 point 在缩略图 buffer 中时, 你可以输入 RET (image-dired-display-this) 在另一个窗口中显示图像. 使用标准的 Emacs 移动键绑定或方向键在缩略图 buffer 中移动. 为了方便浏览, 使用 SPC (image-dired-display-next) 前进并显示下一个图像. 输入 DEL (image-dired-display-previous) 备份到上一个缩略图并显示它.

输入 C-RET (image-dired-thumbnail-display-external) 在外部查看器中显示图像. 你必须先配置 image-dired-external-viewer.

你也可以通过 Image-Dired 删除图像. 输入 d (image-dired-flag-thumb-original-file) 在 Dired buffer 中标记图像文件以进行删除. 或者, 你可以通过输入 C-d (image-dired-delete-char) 从缩略图 buffer 中移除图像的缩略图, 而不标记图像进行删除.

你也可以使用 Image-Dired 进行" 内联" 操作(即直接在 Dired buffer 中). 输入 C-t C-t, Dired 中所选图像的缩略图将出现在它们的名称前面 (image-dired-dired-toggle-marked-thumbs). C-t iC-t x 将分别在 Emacs 中或使用外部查看器显示 point 下的图像.

更高级的功能包括图像标签, 这是用于分类图像文件的元数据. 标签存储在由 image-dired-tags-db-file 配置的纯文本文件中.

要标记图像文件, 请在 Dired buffer 中标记它们(你也可以在缩略图 buffer 中通过输入 m 标记 Dired 中的文件), 然后输入 C-t t (image-dired-tag-files). 这在 minibuffer 中读取标签名称. 要标记具有特定标签的文件, 请输入 C-t f (image-dired-mark-tagged-files). 用特定标签标记图像文件后, 你可以使用 C-t d 查看它们.

你也可以直接从缩略图 buffer 中通过输入 t t 标记文件, 并且你可以通过输入 t r 移除标签. 每个文件还有一个名为" comment" 的特殊标签(它在意义上与其他标签不完全相同, 处理方式略有不同). 这用于输入关于图像的注释或描述. 你通过输入 c 从缩略图 buffer 对文件进行注释. 你将被提示输入注释. 输入 C-t c 从 Dired 添加注释 (image-dired-dired-comment-files). C-t e 将弹出一个 buffer 来编辑注释和标签 (image-dired-dired-edit-comment-and-tags).

如果你安装了 exiftool 程序, 你可以通过在图像文件的缩略图处调用 image-dired-thumbnail-set-image-description 命令来设置图像文件的 EXIF ImageDescription 标签. 此命令提示输入图像的描述, 并将 EXIF 标签添加到其中.

如果 image-dired-thumb-visible-marks 为非 nil(这是默认值), 则在 Dired 中标记的文件也将在 Image-Dired 中被标记.

Image-Dired 还提供简单的图像处理. 在缩略图 buffer 中, 输入 L 将原始图像逆时针旋转 90 度, 输入 R 将其顺时针旋转 90 度. 这种旋转是无损的, 并使用名为 jpegtran 的外部实用程序, 你需要先安装它.

20. 其他功能

默认情况下, Dired 在目录列表的第一行(紧随目录名称之后)显示目录磁盘上的可用空间. 你可以通过自定义变量 dired-free-space 来控制此显示. 其默认值为 first, 这在目录名称之后产生可用空间. 如果你将其自定义为值 separate, Dired 将在单独的行上(紧随目录名称行之后)显示磁盘空间信息, 并在该行中包括当前目录中文件使用的空间以及可用磁盘空间. 如果你将其设置为 nil, 则根本不会显示可用磁盘空间信息.

命令 + (dired-create-directory) 读取目录名称, 并创建该目录. 如果目录已存在, 它会发出错误信号.

命令 dired-create-empty-file 读取文件名, 并创建该文件. 如果文件已存在, 它会发出错误信号.

命令 M-s a C-s (dired-do-isearch) 在标记的文件上开始多文件增量搜索. 如果搜索在文件末尾失败, 输入 C-s 会前进到下一个标记的文件并重复搜索; 在最后一个标记文件的末尾, 搜索会回绕到第一个标记的文件. 命令 M-s a M-C-s (dired-do-isearch-regexp) 执行相同的操作, 但使用正则表达式搜索. 有关搜索重复的信息, 请参阅 Repeating Incremental Search.

命令 w (dired-copy-filename-as-kill) 将标记的(或接下来的 n 个)文件的名称放入 kill ring, 就好像你用 C-w kill 了它们一样. 名称用空格分隔.

使用零前缀参数, 这将使用每个标记文件的绝对文件名. 仅使用 C-u 作为前缀参数, 它使用相对于 Dired buffer 默认目录的文件名. (如果在子目录中, 这仍然可以包含斜杠. )作为特殊情况, 如果 point 在目录标题行上, w 给你该目录的绝对名称. 在这种情况下, 任何前缀参数或标记的文件都将被忽略.

此命令的主要目的是让你可以将文件名 yank 到其他 Emacs 命令的参数中. 它还显示了它添加到 kill ring 的内容, 因此你可以使用它在 echo area 中显示当前标记文件的列表.

如果你在文件列表中有一个 HTML 文件, 用浏览器查看该文件可能很有用. W (browse-url-of-dired-file) 命令将使用标准配置的浏览器查看该文件.

命令 ( (dired-hide-details-mode) 切换当前 Dired buffer 中是否可见详细信息(如所有权或文件权限). 默认情况下, 它还会隐藏符号链接的目标, 以及除标题行和文件/目录列表之外的所有行. 要更改此设置, 请分别自定义选项 dired-hide-details-hide-symlink-targetsdired-hide-details-hide-information-lines.

如果你正在访问的目录处于版本控制之下(请参阅 Version Control), 那么正常的 VC diff 和 log 命令将对选定的文件进行操作.

命令 M-x dired-compare-directories 用于将当前 Dired buffer 与另一个目录进行比较. 它标记两个目录之间不同的所有文件. 它在列出这些文件的所有 Dired buffer 中放置这些标记, 这当然包括当前 buffer.

默认比较方法(如果你在提示符下按 RET 使用)是仅比较文件名–如果文件名未出现在另一个目录中, 则文件名不同. 你可以通过输入 Lisp 表达式来指定更严格的比较, 该表达式可以引用变量 size1size2~(相应的文件大小); ~mtime1mtime2~(以浮点数表示的最后修改时间, 单位为秒); 以及 ~fa1fa2~(相应的属性列表, 由函数 ~file-attributes 返回). 此表达式对每一对同名文件求值, 如果表达式的值为非 nil, 则文件不同.

例如, 序列 M-x dired-compare-directories RET (> mtime1 mtime2) RET 标记此目录中比另一个目录中更新的文件, 并标记另一个目录中比这个目录更旧的文件. 它还像往常一样在两个目录中标记没有对应项的文件.

在 X Window 系统上, Emacs 支持拖放协议. 你可以从另一个程序拖动文件对象并将其放到 Dired buffer 上; 这将在该目录中移动, 复制或创建指向该文件的链接. 采取的具体操作由源程序确定. 也支持将文件从 Dired buffer 中拖出, 通过启用用户选项 dired-mouse-drag-files, 可以使用鼠标将文件拖到其他程序上. 当设置为 link 时, 它将使其他程序(通常是文件管理器)创建指向文件的符号链接; 当设置为 move 时, 它将使其他程序将文件移动到新位置, 将其设置为任何其他非 nil 值将使其他程序打开或创建文件的副本. 在拖放操作期间按下的键盘修饰符也可以控制其他程序对文件采取的操作.

Author: 青岛红创翻译

Created: 2025-11-22 Sat 17:46