Динамическая интерактивная подсказка Emacs Elisp
Я пытаюсь получить динамическое приглашение из моей функции elisp. Я хочу что-то вроде replace-regexp, где будет показано последнее введенное regexp. Я пытался (интерактивный (concat "sab" "bab" )))
это не работает!
Я также пробовал как формат
(интерактивный "s% s" last-used-regexp)
и это не сработает!
Кто-нибудь знает, как это сделать?
Спасибо!
Ответы
Ответ 1
M-x find-function
- ваш друг. Он расскажет вам, как все работает в emacs, показывая вам исходный код. Используя это, я нахожу, что query-regexp-replace
вызывает query-replace-read-args
, который вызывает query-replace-read-from
, который вызывает read-from-minibuffer
, используя приглашение, созданное из последнего используемого регулярного выражения, которое сохраняется в пунктирной паре query-replace-defaults
.
Итак:
(defun my-func ()
"Do stuff..."
(interactive)
(read-from-minibuffer "Regexp? " (first query-replace-defaults)))
- это команда, которая выдает приглашение с последним введенным регулярным выражением как значение по умолчанию.
Ответ 2
Используйте переменную для истории ввода и интерактивно со списком:
(defvar my-func-history nil)
(defun my-func (str)
(interactive (list (read-from-minibuffer "Input string: " (car my-func-history) nil nil 'my-func-history)))
(insert str))
Если вы не хотите, чтобы последнее значение, введенное там первоначально, измените (car my-func-history)
на nil
. Вы можете, конечно, стрелку вверх/вниз, чтобы просмотреть историю в командной строке.