Emacs Lisp - 自动完成书签名称

5
我是新手elisp。http://www.gnu.org/s/emacs/manual/html_node/elisp/Interactive-Codes.html#Interactive-Codes列出了交互式参数的“代码字符”,据我所知,这些字符在提示用户输入时修改输入机制的行为(例如:如果您指定输入是存在的文件名,则emacs的自动完成功能将查找存在的文件名)。
我正在尝试查找现有书签名称的代码-即:emacs将提示用户输入书签名称,并在按下tab键后显示可能的书签名称完成。
是否存在这样的代码?
2个回答

1

函数bookmark-completing-read是完成书签名称的标准方式。您不需要低级函数completing-read来完成它。例如:

    (bookmark-completing-read "Bookmark" bookmark-current-bookmark)

如果您使用Bookmark+,那么bookmark-completing-read接受一些可选参数(类似于completing-read),这可以帮助您:

  • ALIST -- 一个书签列表(而不是所有书签: bookmark-alist

  • PRED -- 过滤书签候选列表的谓词

  • HIST -- 输入历史记录列表

还有一个非严格版本的函数bmkp-completing-read-lax,如果您想接受新的书签名称或根据现有名称进行完成,则很有用。


1
使用completing-read来完成这个任务。你可以编写一个函数,提示用户输入书签,如下所示:
(defun my-function ()
  (interactive)
  (let ((bookmark (completing-read "Bookmark: " (bookmark-all-names))))
    ...))

如果您希望提示成为交互式的一部分(这样结果将自动绑定到函数的参数),您可以使用以下替代方法:

(defun my-function (bookmark)
  (interactive (list (completing-read "Bookmark: " (bookmark-all-names))))
  ...)

如果要让Emacs找到函数bookmark-all-names,您还需要在您的.emacs文件中添加以下行:

(require 'bookmark)

这已经完成了大部分 - 你知道emacs是否有一些默认列表来存储书签吗? - Trent
这应该是由 bookmark-all-names 返回的列表。你能否请检查上面更新的代码?我自己不使用书签... 如果书签列表为空,会发生什么? - Thomas
抱歉回复晚了 - SO 没有通过电子邮件通知我,原因不明(??)。我收到以下错误消息:符号的函数定义为空:bookmark-all-names。更新:我认为您需要将书签列表加载到缓冲区中(M-x bookmark-bmenu-list)。 - Trent
这是因为bookmark-all-names默认没有加载。将(require 'bookmark)添加到您的.emacs文件中(我已经相应地更新了我的答案)。有进展了吗? - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接