Функция вызова lisp в emacs программно с префиксным аргументом - PullRequest
34 голосов
/ 27 мая 2011

Я хочу вызвать функцию из некоторого кода 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)))

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

Ответы [ 2 ]

52 голосов
/ 27 мая 2011

Если я вас правильно понимаю, вы пытаетесь создать связывание клавиш, которое будет действовать так, как вы напечатали 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)
12 голосов
/ 27 июля 2012

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

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

В этом примере комбинация клавиш «sl» (s («super»)) является клавишей «windows logo»на клавиатуре ПК) вернется кольцо меток, как вы набрали "Cu C-SPC".

...