【问题标题】:How to programmatically input answer for user prompt?如何以编程方式输入用户提示的答案?
【发布时间】:2016-03-13 11:20:48
【问题描述】:

一些 emacs 函数将用户输入字符串作为参数。例如,M-x search-forward,接受用户输入字符串并在缓冲区中搜索它。

有一些我经常使用的搜索字符串。因此,我想创建自己的函数并将这个搜索字符串硬编码为搜索转发的参数。对于这个函数 search-forward,这很容易,因为这个函数的函数参数列表有一个用于搜索字符串的参数,如在其 defun 声明中:(search-forward STRING &optional BOUND NOERROR COUNT)。我可以将字符串传递给 STRING 参数。

但是对于其他一些进行类似字符串搜索的函数,它没有将搜索字符串指定为参数。例如,在 Magnar 的多光标库中,mc/mark-all-in-region-regexp 是一个搜索用户提供的正则表达式字符串的函数。我想制作自己的快捷函数,它接受一个固定的字符串,比如“abc”。但是,mc/mark-all-in-region-regexp 的参数列表没有搜索字符串的参数。这是函数参数列表:(mc/mark-all-in-region-regexp BEG END)。它只有区域开始和结束位置的参数。但是,如果您将其作为 M-x 命令执行,即M-x mc/mark-all-in-region-regexp ENTER,则会提示您输入搜索字符串。

我的问题是,如何编写函数,将搜索字符串传递给mc/mark-all-in-region-regexp

我的初审是这样的。但没有达到我的预期。

(defun my-mc-mark-non-empty-lines ()
  (interactive)
  (mc/mark-all-in-region)
  (insert-string "abc")
  )

【问题讨论】:

  • 考虑修改您的问题,使其与 Magnar 的库 multiple-cursors 明确相关,并提供之前和之后提出的示例,以便该线程的读者可以建议该问题的潜在解决方案。此外,您可能不想吸引regex 标签人群,因为大多数人可能对 Magnar 的库一无所知——也就是说,他们甚至可能不使用 Emacs。
  • 问题不清楚。举一些你想要的输入和输出的例子。
  • Magnar 已在 2015 年 4 月 3 日将其作为第三个参数添加:github.com/magnars/multiple-cursors.el/blob/master/… -- 见第 327 行。考虑将整个多游标库升级到最新版本。这是提交:github.com/magnars/multiple-cursors.el/commit/…
  • 您需要创建一个新函数或修改现有函数,就像 Magnar 在我之前评论中的第二个链接的提交中所做的那样。如果您想将新函数放入您的.emacs 文件中(而不是直接修改源代码),您可能需要在重新定义该库中包含的函数之前(require ...) 库。如果直接修改源代码,可能还需要重新字节编译。
  • 以下链接包含一个示例,用于以编程方式输入用户请求的是/否响应(这与您的问题有点相关),但 Drew 的评论已经有 7 人赞成其中他说不要那样做:emacs.stackexchange.com/questions/19077/…

标签: emacs


【解决方案1】:

在设计处理最初设计为请求用户输入的函数的编程解决方案时,通常建议设计一种方法以参数形式传递值或从变量派生值。

例如,该函数的作者之前在 2015 年 4 月 3 日的提交中创建了一个附加参数 -- 以下是 diff -- 即,- 表示已删除,+ 表示已添加.

-(defun mc/mark-all-in-region (beg end)
+(defun mc/mark-all-in-region (beg end &optional search)
   "Find and mark all the parts in the region matching the given search"
   (interactive "r")
-  (let ((search (read-from-minibuffer "Mark all in region: "))
+  (let ((search (or search (read-from-minibuffer "Mark all in region: ")))
         (case-fold-search nil))
     (if (string= search "")
         (message "Mark aborted")

以下链接包含一个示例,用于以编程方式输入用户请求的是/否响应(这与您的问题有点相关),但 Drew 的评论已经有 7 人赞成,其中他说“不要”不要那样做:https://emacs.stackexchange.com/questions/19077/how-to-programmatically-answer-yes-to-those-commands-that-prompt-for-a-decisio

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2022-08-15
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多