Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个命令的Emacs密钥绑定_Emacs_Elisp_Key Bindings - Fatal编程技术网

多个命令的Emacs密钥绑定

多个命令的Emacs密钥绑定,emacs,elisp,key-bindings,Emacs,Elisp,Key Bindings,我是emacs的新手,有一个菜鸟问题。我可以通过(全局设置键(kbd“C-C a b C”)“some命令)将键绑定到特定函数,其中some命令是一个函数。如何使用一个键绑定调用两个函数(例如somecommand和someothercommand)?非常感谢 您可以使用defun定义另一个函数,在该函数中,您可以使用funcall或apply调用其他函数,因此,当您调用第三个函数(也可以绑定)时,它将调用其他函数。定义一个命令,有条件地调用您想要的每个函数(命令)。使用前缀arg来区分要调用哪

我是emacs的新手,有一个菜鸟问题。我可以通过
(全局设置键(kbd“C-C a b C”)“some命令)
将键绑定到特定函数,其中
some命令
是一个函数。如何使用一个键绑定调用两个函数(例如
somecommand
someothercommand
)?非常感谢

您可以使用
defun
定义另一个函数,在该函数中,您可以使用
funcall
apply
调用其他函数,因此,当您调用第三个函数(也可以绑定)时,它将调用其他函数。

定义一个命令,有条件地调用您想要的每个函数(命令)。使用前缀arg来区分要调用哪个。因此,如果新的调度命令绑定到,例如,
C-o
,则
C-u C-o
将调用其中一个函数,而
C-o
(不带前缀arg)将调用另一个函数

您需要执行
C-h f interactive
,以了解如何定义识别前缀参数等的命令。请参阅Elisp手册-使用
i interactive
,以了解它在何处教导这一点


这是一个简单而有趣的练习。学习定义自己的简单命令是开始用自己的语言与Emacs对话的好方法。

您可以定义自己的函数,调用这两个函数,并将键绑定到自己的函数。或者使用简单的lambda:

(global-set-key (kbd "C-c a b c") (lambda () (interactive) (some-command) (some-other-command)))

我建议永远不要将lambda表达式绑定到键,原因很简单,当您询问Emacs该键做什么时,它最终会告诉您类似的事情(以字节编译时使用接受的代码为例):

C-cabc运行命令#[nil”\300\210\301\207”[some命令
其他一些命令]1 nil nil],这是一个交互式编译的Lisp
功能。
它绑定到C-C a b C。
(匿名)
没有记录。
如果您从未对代码进行字节编译,那么代码就不那么神秘,但仍然未格式化:

C-cabc运行命令(lambda nil(交互式)(some命令)
(其他一些命令)),这是一个交互式Lisp函数。
虽然在这样的小函数中仍然可读,但对于更大的函数,它很快变得不可理解

与之相比:

C-C a b C运行命令my run some commands,这是一个
“foo.el”中的交互式编译Lisp函数。
它绑定到C-C a b C。
(我的任务是运行一些命令)
依次运行'some command'和'some other command'。
如果你命名函数,你会得到它(这会鼓励你比匿名函数更多地记录它)

(取消我的运行某些命令()
“按顺序运行'some command'和'some other command'
(互动)
(一些命令)
(其他命令)
(全局设置键(kbd“C-C a b C”)“我的运行某些命令”)

最后,正如abo abo所指出的,这也意味着您可以随时轻松访问该函数的定义,查看或编辑/重新评估代码,方法是遵循帮助缓冲区中提供的链接(在我的示例中为
foo.el
),或使用M-x
find function
(输入函数名称),或者M-x
在键上查找函数
(键入绑定到的键序列)。

@Stefan请您解释一下为什么不引用lambdas?这非常有效。谢谢不过我对引用也有同样的问题——我通常也引用lambda,我想知道为什么不引用。@songyuanyao:因为
“(…)
是一个列表,而不是一个函数。另请参见,引用lambdas会影响字节编译。我可以在命令后跟踪输入吗。例如:
find name dired)
enter
*py
t
Q
。。从这一点继续@Songyuanyao非常重要的是,你可以使用这种方法跳转到定义。