《elisp 每日一练》—— Minibuffer 与 completing-read

《elisp 每日一练》—— Minibuffer 与 completing-read

Masimaro
2026-09-01 / 0 评论 / 0 阅读 / 正在检测是否收录...

通过前面一段时间的学习,我们学习了如何与窗口进行交互。现在我们进入minibuffer的交互。

从标题上看我们本节主要就是再介绍一遍 completing-read,这个函数我们前面已经多次用到过,读者如果不熟悉,可以再一次阅读本文,如果已经熟悉了,可以跳过。

背景知识

minibuffer 的相关概念就不在这里展开了。我们主要聊的是如何通过控制minibuffer相关的API来实现交互。

本次我们将介绍一个我们之前遇到过相对比较熟悉的老朋友—— completing-read

我们知道,它可以通过往minibuffer中注入一些选项供用户选择。并返回用户选择的字符串。它的函数原形如下:

(completing-read PROMPT COLLECTION &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)
  • PROMPT 是给用户的提示词
  • COLLECTION 是我们传入到minibuffer中的候选数据源, 可以是单纯的字符串、Alist、Hash Table、或者是动态生成候选词的函数
  • PREDICATE 它是一个函数,对加入的选项进行过滤,函数返回非 nil 表示接受,否则视为放弃
  • REQUIRE-MATCH 控制用户是否必须输入一个有效的选项
  • DEF 默认值,当用户不选择内容时选中的默认值
  • HIST 历史记录, 传入一个 Symbol,Emacs 会自动把用户的历史选择存入该变量,支持用 M-p / M-n 翻阅

前面有好几个例子已经用到了该函数,各位读者对它的常规用法应该不陌生。我们一般通过 alist 结构,将key 设置成用户友好的提示词,而它的背后绑定了相对复杂的数据,在用户选择之后通过背后绑定的数据来实现一些功能。

练习

前面我们在学习其他内容时已经通过该函数实现了一些相对复杂的功能了,这次练习我们来点简单的,仅仅为了回顾一下它的用法。

我们实现一个快速打开指定文件的功能。我们预先定义一些常用文件,例如emacs 的配置文件、自己的工作日志等等。然后将这些内容组织一下传入COLLECTION,最后根据用户选择打开

(defvar my/favorite-file-lists
  '("~/.emacs.d/init.el"
    "d:/worklog.el"))

(defun my/quick-open-favorite-file()
  (interactive)
  (let ((selected (completing-read "Input filename to open:(default ~/.emacs.d/init.el)" my/favorite-file-lists nil nil nil nil "~/.emacs.d/init.el")))
    (when selected
      (find-file selected))))

小结

因为本节涉及到的函数,我们已经多次在其他练习中使用过,对于它读者应该比较熟悉了。因为本人能力不够,所以在练习上面我目前也想不出有什么深入的,又尽量少涉及其他概念内容。所以就来一个最简单的,读者如果觉得例子太简单了,可以考虑自己实现一些复杂的功能。本节涉及的函数只有一个 completing-read

0

评论 (0)

取消