以编程方式使用前缀参数的emacs lisp调用函数

Posted

技术标签:

【中文标题】以编程方式使用前缀参数的emacs lisp调用函数【英文标题】:emacs lisp call function with prefix argument programmatically 【发布时间】:2011-09-03 14:51:06 【问题描述】:

我想从一些 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)

【讨论】:

在这种特殊情况下无关紧要,但总的来说,我会使用(let ((current-prefix-arg '(4))) (call-interactively 'grep)),以便命令中调用的后续函数的行为不受影响。【参考方案2】:

或者你可以使用keyboard macro

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

在本例中,组合键“sl”(s(“super”)是 PC 键盘上的“windows logo”键)将向上标记环,就像键入“Cu C-SPC”一样.

【讨论】:

以上是关于以编程方式使用前缀参数的emacs lisp调用函数的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战[53]---新的思维方式:函数式编程

Emacs我想从lisp函数调用execute-kbd-macro

检查字符串是不是以 Emacs Lisp 中的后缀结尾

Common Lisp 入门配置开发环境 in Emacs

Clojure 的 Emacs/Swank/Paredit 教程

安装Emacs并设置racket环境