Программно вставить текст в команду, которая обычно блокирует цикл событий

Я хотел бы реализовать команду, которая вводит первые несколько символов в существующую команду и позволяет мне вводить остальные.

Например, вариант icicle-execute-extended-command который начинается с "icicle-" уже введен.

Я пытался:

  • макросы клавиатуры
    • не удается (даже на простых вещах, таких как M-x i c i c l e s) без видимой причины.
  • функции
    • призвание icicle-execute-extended-command заблокировать последовательность команд

Как бы я сделал это в обобщенном виде?

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))

Если вы звоните completing-read сами в определении вашей команды, а затем просто передать текст для вставки в качестве INITIAL-INPUT аргумент. Вот для чего это.

Если вы используете icicle-define-command или же icicle-define-file-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)))
Другие вопросы по тегам