2014-01-02 9 views
4

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

Например, вариант 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)) 
+0

Спасибо! Это, кажется, работает отлично, я могу даже запустить макросы и команды в минибуфере перед запуском. – PythonNut

0

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

Если вы используете icicle-define-command или icicle-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)))