高级补全函数 read-file-name、read-directory-name
和 read-shell-command 分别用于读取文件名、目录名和 Shell 命令。
它们提供了专门的功能,包括自动插入默认目录。
该函数读取一个文件名,使用 prompt 作为提示并提供补全。
作为一种例外情况,如果以下所有条件均成立, 该函数将使用图形文件对话框而非小缓冲区读取文件名:
use-dialog-box 非 nil。
See Dialog Boxes in The GNU Emacs Manual。
使用图形文件对话框时的确切行为与平台相关。 这里我们只说明使用小缓冲区时的行为。
read-file-name 不会自动展开返回的文件名。
如果需要绝对文件名,你可以自行调用 expand-file-name。
可选参数 require-match 的含义与 completing-read 中相同。
See 补全与小缓冲。
参数 directory 指定用于补全相对文件名的目录。
它应当是一个绝对目录名。
如果变量 insert-default-directory 非 nil,
directory 也会作为初始内容插入到小缓冲区中。
它的默认值为当前缓冲区的 default-directory。
如果你指定了 initial,它是要插入到缓冲区中的初始文件名
(如果插入了 directory,则在其后面)。
在这种情况下,光标位于 initial 的开头。
initial 的默认值为 nil——不插入任何文件名。
要了解 initial 的作用,可以在访问文件的缓冲区中试用命令
C-x C-v。请注意:在大多数情况下,我们建议使用 default
而非 initial。
如果 default 非 nil,那么当用户以
read-file-name 最初插入的非空内容退出小缓冲区时,
函数将返回 default。
如果 insert-default-directory 非 nil(默认如此),
小缓冲区的初始内容始终非空。
无论 require-match 的值如何,都不会检查 default 的有效性。
但是,如果 require-match 非 nil,
小缓冲区的初始内容应当是一个合法的文件(或目录)名。
否则,如果用户未做任何编辑就退出,read-file-name 会尝试补全,
并且不会返回 default。
default 也可以通过历史命令访问。
如果 default 为 nil,read-file-name
会尝试寻找一个替代默认值,其处理方式与显式指定完全相同。
如果 default 为 nil 但 initial 非 nil,
则默认值为由 directory 和 initial 得到的绝对文件名。
如果 default 和 initial 均为 nil
且缓冲区正在访问某个文件,read-file-name
会使用该文件的绝对文件名作为默认值。
如果缓冲区未访问任何文件,则没有默认值。
在这种情况下,如果用户不做任何编辑直接按 RET,
read-file-name 只返回小缓冲区预先插入的内容。
如果用户在空的小缓冲区中按 RET, 无论 require-match 的值如何,该函数都返回空字符串。 例如,用户可以通过 M-x set-visited-file-name 使当前缓冲区不访问任何文件。
如果 predicate 非 nil,它指定一个单参数函数,
用于判断哪些文件名是可接受的补全候选项。
如果 predicate 对某个文件名返回非 nil,
则该文件名是可接受的值。
下面是使用 read-file-name 的示例:如果用户在空的小缓冲区中按 RET,
无论 require-match 的值如何,该函数都返回空字符串。
例如,用户可以通过 M-x set-visited-file-name
使当前缓冲区不访问任何文件。
如果 predicate 非 nil,它指定一个单参数函数,
用于判断哪些文件名是可接受的补全候选项。
如果 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 ----------
如果用户按 RET,read-file-name
会将文件名以字符串 "/gp/gnu/elisp/manual.texi" 形式返回。
如果非 nil,它应当是一个与 read-file-name
接受相同参数的函数。当调用 read-file-name 时,
它会使用传入的参数调用该函数,而不执行自身的常规逻辑。
如果该变量非 nil,read-file-name 在执行补全时忽略大小写。
该函数与 read-file-name 类似,但只允许将目录名作为补全候选项。
如果 default 为 nil 且 initial 非 nil,
read-directory-name 会通过组合 directory
(如果 directory 为 nil,则使用当前缓冲区的默认目录)
和 initial 构造一个替代默认值。
如果 default 和 initial 均为 nil,
该函数使用 directory 作为替代默认值,
如果 directory 为 nil,则使用当前缓冲区的默认目录。
该变量由 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 ----------
该函数从小缓冲区读取一条 Shell 命令, 使用 prompt 作为提示并提供智能补全。 它会对命令的第一个单词使用适合命令名的候选项进行补全, 对命令的其余单词则按照文件名进行补全。
该函数使用 minibuffer-local-shell-command-map
作为小缓冲区输入的键盘映射。
参数 history 指定要使用的历史列表;
如果省略或为 nil,则默认为 shell-command-history
(see shell-command-history)。
可选参数 initial 指定小缓冲区的初始内容
(see 初始输入)。
如果存在,args 的其余部分将作为
read-from-minibuffer 中的 default
和 inherit-input-method 参数使用
(see 使用迷你缓冲区读取文本字符串)。
该键盘映射由 read-shell-command 使用,
用于补全作为 Shell 命令一部分的命令名和文件名。
它以 minibuffer-local-map 作为父键盘映射,
并将 TAB 绑定到 completion-at-point。