21.6.5 读取文件名

高级补全函数 read-file-nameread-directory-nameread-shell-command 分别用于读取文件名、目录名和 Shell 命令。 它们提供了专门的功能,包括自动插入默认目录。

Function: read-file-name prompt &optional directory default require-match initial predicate

该函数读取一个文件名,使用 prompt 作为提示并提供补全。

作为一种例外情况,如果以下所有条件均成立, 该函数将使用图形文件对话框而非小缓冲区读取文件名:

  1. 它是通过鼠标命令调用的。
  2. 当前选中的帧位于支持此类对话框的图形显示器上。
  3. 变量 use-dialog-boxnil。 See Dialog Boxes in The GNU Emacs Manual
  4. 下面描述的参数 directory 没有指定远程文件。 See Remote Files in The GNU Emacs Manual

使用图形文件对话框时的确切行为与平台相关。 这里我们只说明使用小缓冲区时的行为。

read-file-name 不会自动展开返回的文件名。 如果需要绝对文件名,你可以自行调用 expand-file-name

可选参数 require-match 的含义与 completing-read 中相同。 See 补全与小缓冲

参数 directory 指定用于补全相对文件名的目录。 它应当是一个绝对目录名。 如果变量 insert-default-directorynildirectory 也会作为初始内容插入到小缓冲区中。 它的默认值为当前缓冲区的 default-directory

如果你指定了 initial,它是要插入到缓冲区中的初始文件名 (如果插入了 directory,则在其后面)。 在这种情况下,光标位于 initial 的开头。 initial 的默认值为 nil——不插入任何文件名。 要了解 initial 的作用,可以在访问文件的缓冲区中试用命令 C-x C-v请注意:在大多数情况下,我们建议使用 default 而非 initial

如果 defaultnil,那么当用户以 read-file-name 最初插入的非空内容退出小缓冲区时, 函数将返回 default。 如果 insert-default-directorynil(默认如此), 小缓冲区的初始内容始终非空。 无论 require-match 的值如何,都不会检查 default 的有效性。 但是,如果 require-matchnil, 小缓冲区的初始内容应当是一个合法的文件(或目录)名。 否则,如果用户未做任何编辑就退出,read-file-name 会尝试补全, 并且不会返回 defaultdefault 也可以通过历史命令访问。

如果 defaultnilread-file-name 会尝试寻找一个替代默认值,其处理方式与显式指定完全相同。 如果 defaultnilinitialnil, 则默认值为由 directoryinitial 得到的绝对文件名。 如果 defaultinitial 均为 nil 且缓冲区正在访问某个文件,read-file-name 会使用该文件的绝对文件名作为默认值。 如果缓冲区未访问任何文件,则没有默认值。 在这种情况下,如果用户不做任何编辑直接按 RETread-file-name 只返回小缓冲区预先插入的内容。

如果用户在空的小缓冲区中按 RET, 无论 require-match 的值如何,该函数都返回空字符串。 例如,用户可以通过 M-x set-visited-file-name 使当前缓冲区不访问任何文件。

如果 predicatenil,它指定一个单参数函数, 用于判断哪些文件名是可接受的补全候选项。 如果 predicate 对某个文件名返回非 nil, 则该文件名是可接受的值。

下面是使用 read-file-name 的示例:如果用户在空的小缓冲区中按 RET, 无论 require-match 的值如何,该函数都返回空字符串。 例如,用户可以通过 M-x set-visited-file-name 使当前缓冲区不访问任何文件。

如果 predicatenil,它指定一个单参数函数, 用于判断哪些文件名是可接受的补全候选项。 如果 predicate 对某个文件名返回非 nil, 则该文件名是可接受的值。

下面是使用 read-file-name 的示例:

(read-file-name "The file is ")

;; After evaluation of the preceding expression,
;;   the following appears in the minibuffer:

---------- Buffer: Minibuffer ----------
The file is /gp/gnu/elisp/∗
---------- Buffer: Minibuffer ----------

输入 manual TAB 会得到如下结果:

---------- Buffer: Minibuffer ----------
The file is /gp/gnu/elisp/manual.texi∗
---------- Buffer: Minibuffer ----------

如果用户按 RETread-file-name 会将文件名以字符串 "/gp/gnu/elisp/manual.texi" 形式返回。

Variable: read-file-name-function

如果非 nil,它应当是一个与 read-file-name 接受相同参数的函数。当调用 read-file-name 时, 它会使用传入的参数调用该函数,而不执行自身的常规逻辑。

User Option: read-file-name-completion-ignore-case

如果该变量非 nilread-file-name 在执行补全时忽略大小写。

Function: read-directory-name prompt &optional directory default require-match initial

该函数与 read-file-name 类似,但只允许将目录名作为补全候选项。

如果 defaultnilinitialnilread-directory-name 会通过组合 directory (如果 directorynil,则使用当前缓冲区的默认目录) 和 initial 构造一个替代默认值。 如果 defaultinitial 均为 nil, 该函数使用 directory 作为替代默认值, 如果 directorynil,则使用当前缓冲区的默认目录。

User Option: insert-default-directory

该变量由 read-file-name 使用, 因此也间接地被大多数读取文件名的命令使用。 (这包括所有在交互式形式中使用代码字符 ‘f’ 或 ‘F’ 的命令。 See Code Characters for interactive。) 它的值控制 read-file-name 是否在开始时 将默认目录名(以及可能的初始文件名)放入小缓冲区。 如果该变量的值为 nil, 则 read-file-name 不会在小缓冲区中放入任何初始输入 (除非你通过 initial 参数指定初始输入)。 在这种情况下,默认目录仍会用于相对文件名的补全,但不会显示出来。

如果该变量为 nil 且小缓冲区初始内容为空, 用户可能需要显式获取下一个历史元素才能访问默认值。 如果该变量非 nil,小缓冲区初始内容始终非空, 用户只需在未编辑的小缓冲区中直接按 RET 即可获取默认值。(见上文。)

例如:

;; Here the minibuffer starts out with the default directory.
(let ((insert-default-directory t))
  (read-file-name "The file is "))

---------- Buffer: Minibuffer ----------
The file is ~lewis/manual/∗
---------- Buffer: Minibuffer ----------

;; Here the minibuffer is empty and only the prompt
;;   appears on its line.
(let ((insert-default-directory nil))
  (read-file-name "The file is "))

---------- Buffer: Minibuffer ----------
The file is ∗
---------- Buffer: Minibuffer ----------
Function: read-shell-command prompt &optional initial history &rest args

该函数从小缓冲区读取一条 Shell 命令, 使用 prompt 作为提示并提供智能补全。 它会对命令的第一个单词使用适合命令名的候选项进行补全, 对命令的其余单词则按照文件名进行补全。

该函数使用 minibuffer-local-shell-command-map 作为小缓冲区输入的键盘映射。 参数 history 指定要使用的历史列表; 如果省略或为 nil,则默认为 shell-command-history (see shell-command-history)。 可选参数 initial 指定小缓冲区的初始内容 (see 初始输入)。 如果存在,args 的其余部分将作为 read-from-minibuffer 中的 defaultinherit-input-method 参数使用 (see 使用迷你缓冲区读取文本字符串)。

Variable: minibuffer-local-shell-command-map

该键盘映射由 read-shell-command 使用, 用于补全作为 Shell 命令一部分的命令名和文件名。 它以 minibuffer-local-map 作为父键盘映射, 并将 TAB 绑定到 completion-at-point


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike