Emacs lisp функция вызова с аргументом префикса программно

Я хочу вызвать функцию из некоторого кода elisp, как если бы я вызывал его в интерактивном режиме с аргументом префикса. В частности, я хочу вызвать grep с префиксом.

Ближайшим, с которым я работал, является использование execute-extended-command, но для этого все еще требуется, чтобы я вводил команду, которую я хочу для вызова с префиксом...

;; calls command with a prefix, but I have to type the command to be called...
(global-set-key (kbd "C-c m g")
                (lambda () (interactive)
                  (execute-extended-command t)))

В документации указано, что execute-extended-command использует command-execute для выполнения команды, считанной с минибуфера, но я не смог заставить ее работать:

;; doesn't call with prefix...
(global-set-key (kbd "C-c m g")
                (lambda () (interactive)
                  (command-execute 'grep t [t] t)))

Есть ли способ вызвать функцию с префиксом, но не интерактивным?

Ответ 1

Если я понимаю вас правильно, вы пытаетесь сделать привязку клавиш, которая будет действовать так, как вы набрали C-u M-x grep <ENTER>. Попробуйте следующее:

(global-set-key (kbd "C-c m g")
                (lambda () (interactive)
                  (setq current-prefix-arg '(4)) ; C-u
                  (call-interactively 'grep)))

Хотя я бы, вероятно, сделал именованную функцию для этого:

(defun grep-with-prefix-arg ()
  (interactive)
  (setq current-prefix-arg '(4)) ; C-u
  (call-interactively 'grep))

(global-set-key (kbd "C-c m g") 'grep-with-prefix-arg)

Ответ 2

Или вы можете просто использовать макрос клавиатуры

(global-set-key (kbd "s-l") (kbd "C-u C-SPC"))

В этом примере комбинация клавиш "sl" (s ( "супер" ) - это "логотип Windows" на клавиатуре ПК) вернет кольцо меток, точно так же, как вы набрали "Cu C-SPC".