【问题标题】:Emacs lisp - autocomplete bookmark namesEmacs lisp - 自动完成书签名称
【发布时间】:2011-05-06 01:31:21
【问题描述】:

我是 elisp 的新手。 http://www.gnu.org/s/emacs/manual/html_node/elisp/Interactive-Codes.html#Interactive-Codes 列出交互式参数的“代码字符”,AFAIK 在提示用户输入时修改输入机制的行为(例如:如果您指定输入是存在的文件名,emacs 的自动完成功能将查找文件存在的名称)。

我正在尝试查找已经存在的书签名称的代码 - 即:emacs 将提示用户输入书签名称,并且在按下选项卡时,emacs 将显示可能的书签名称完成。

这样的代码存在吗?

【问题讨论】:

    标签: emacs elisp bookmarks


    【解决方案1】:

    为此使用completing-read。您可以编写一个提示用户输入书签的函数,如下所示:

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

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

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

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

    (require 'bookmark)
    

    【讨论】:

    • 这就是大部分的方式 - 你知道是否有一些 emacs 用于存储书签的默认列表?
    • 应该是bookmark-all-names返回的列表。你能检查一下上面更新的代码吗?我自己不使用书签...如果书签列表为空怎么办?
    • 很抱歉回复晚了 - 所以由于某种原因没有通过电子邮件通知我 (??)。我收到以下错误消息:符号的函数定义无效:书签所有名称。更新:我认为您需要将书签列表加载到缓冲区中(M-x bookmark-bmenu-list)
    • 那是因为bookmark-all-names默认不加载。将(require 'bookmark) 添加到您的 .emacs 文件中(我已经相应地更新了我的答案)。运气好吗?
    【解决方案2】:

    函数bookmark-completing-read 是完成书签名称的标准方法。您确实不需要为此需要较低级别的函数completing-read。示例:

    (书签完成阅读“书签”书签当前书签)

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

    • ALIST -- 可供选择的书签列表(而不是所有书签:bookmark-alist

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

    • HIST -- 输入历史列表

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

    【讨论】:

      猜你喜欢
      • 2017-02-04
      • 2013-11-11
      • 1970-01-01
      • 2011-05-04
      • 2014-12-21
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多