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".