以编程方式将文本插入到通常阻止事件循环的命令中

时间:2014-01-02 20:18:25

标签: emacs event-loop icicles

我想实现一个命令,将前几个字符键入现有命令,然后让我输入其余的字符。

例如,icicle-execute-extended-command的变体以“icicle-”开头已经输入。

我试过了:

  • 键盘宏
    • 失败(即使是M-x i c i c l e s这样的简单事情)也没有明显的原因。
  • 功能
    • 调用icicle-execute-extended-command阻止命令序列

我将如何以一般化的方式进行此操作?

2 个答案:

答案 0 :(得分:2)

好问题。 以下是您可以尝试的通用内容:

(defun no-mondays ()
  (interactive)
  (minibuffer-with-setup-hook
    (lambda()
      (insert "monday"))
    (call-interactively 'query-replace)))

这是重构:

(defun with-initial-minibuffer (str fun)
  `(lambda ()
     (interactive)
     (minibuffer-with-setup-hook
         (lambda ()
            (insert ,str))
       (call-interactively ',fun))))

(defalias 'no-weekends
    (with-initial-minibuffer
        "\\(?:satur\\|sun\\)day"
      'query-replace-regexp))

答案 1 :(得分:0)

如果您在命令定义中自己调用completing-read,那么只需将文本作为INITIAL-INPUT参数传递给insert。这就是它的用途。

如果你使用icicle-define-commandicicle-define-file-command(这样你的命令将是multi-command),那么同样的事情:传递INITIAL-INPUT arg。

如果您使用这样的宏,请确保在定义命令的文件中放置类似的内容,因此宏定义可用于字节编译时间:

 (eval-when-compile
  (or (condition-case nil
          (load-library "icicles-mac")   ; Use load-library to ensure latest .elc.
        (error nil))
      (require 'icicles-mac)))