Динамическая интерактивная подсказка 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. Вы можете, конечно, стрелку вверх/вниз, чтобы просмотреть историю в командной строке.