我有一个defun,方便地添加/删除括号到标记的表达式.(见最后的代码)
作为emacs Lisp的新手,我只知道如何在没有参数的情况下制作简单的键绑定.
但是,我相信如果它的键绑定可以采用两个可选参数来指定是否添加/删除,或者更新()
,那么defun会更方便.[]
{}
我目前的(简单)键绑定如下所示,是否有一种简单的方法可以使其参与描述?
(global-set-key (kbd "C-M-( )") 'end-of-statement)
感谢任何建议或方向提示!
(代码:Istvan Chung)
(defun surround-with-parens () (interactive) (save-excursion (goto-char (region-beginning)) (insert "(")) (goto-char (region-end)) (insert ")")) (defun delete-surrounded-parens () (interactive) (let ((beginning (region-beginning)) (end (region-end))) (cond ((not (eq (char-after beginning) ?\()) (error "Character at region-begin is not an open-parenthesis")) ((not (eq (char-before end) ?\))) (error "Character at region-end is not a close-parenthesis")) ((save-excursion (goto-char beginning) (forward-sexp) (not (eq (point) end))) (error "Those parentheses are not matched")) (t (save-excursion (goto-char end) (delete-backward-char 1) (goto-char beginning) (delete-char 1))))))
Jorgen Schäf.. 5
我假设问题是surround-with-parens
,因为delete-surrounded-parens
可能最好只是猜测它自己使用的括号.
我还假设你这样做是为了练习更多,而不是实际解决问题.如果electric-pair-mode
在最近的Emacsen中启用,则配置的对将围绕任何活动区域进行处理.但这是一个很好的中级emacs lisp练习.
正如评论所指出的,您有多种选择.
命令参数正如您所要求的,命令可以接受参数.命令与其他lisp函数没有什么不同,除了它们有一个interactive
规范.该interactive
规范告诉Emacs如何在使用密钥或通过调用命令时运行该命令M-x
.
Simple (interactive)
将不向函数传递任何参数.(interactive "r")
将作为两个参数传递该区域的开头和结尾.等等.您可以阅读有关不同选项的信息C-h f interactive
.您甚至可以编写lisp代码来计算那里的参数.
你可以用(interactive "cWrap with: ")
.这会提示用户输入密钥,并将密钥传递给您的功能.例如,如果用户键入(
,则函数将接收40作为参数,即左括号的字符代码.?\(
也是40,并(make-string 1 40)
返回"("
.你必须创建一个地图来找出右括号.
这里的缺点是你需要按两个键:第一个调用命令,然后是一个键来指定要使用的括号.
多个键您还可以将命令绑定到不同的键 - 例如,C-M-(
和C-M-[
.然后,您可以使用this-single-command-keys
指定最后一个键事件的内容.遗憾的是,转换回关键序列可能有点棘手.例如C-M-(
返回[201326632]
.
您也可以在每个括号类型中定义一个命令,所有这些命令都只是使用参数调用公共函数,并将这些命令绑定到键.
post-self-insert-hook
最后,您可以使用与电动缩进模式相同的方法:post-self-insert-hook
根据char-before
您要执行的操作添加功能并进行决定.
我假设问题是surround-with-parens
,因为delete-surrounded-parens
可能最好只是猜测它自己使用的括号.
我还假设你这样做是为了练习更多,而不是实际解决问题.如果electric-pair-mode
在最近的Emacsen中启用,则配置的对将围绕任何活动区域进行处理.但这是一个很好的中级emacs lisp练习.
正如评论所指出的,您有多种选择.
正如您所要求的,命令可以接受参数.命令与其他lisp函数没有什么不同,除了它们有一个interactive
规范.该interactive
规范告诉Emacs如何在使用密钥或通过调用命令时运行该命令M-x
.
Simple (interactive)
将不向函数传递任何参数.(interactive "r")
将作为两个参数传递该区域的开头和结尾.等等.您可以阅读有关不同选项的信息C-h f interactive
.您甚至可以编写lisp代码来计算那里的参数.
你可以用(interactive "cWrap with: ")
.这会提示用户输入密钥,并将密钥传递给您的功能.例如,如果用户键入(
,则函数将接收40作为参数,即左括号的字符代码.?\(
也是40,并(make-string 1 40)
返回"("
.你必须创建一个地图来找出右括号.
这里的缺点是你需要按两个键:第一个调用命令,然后是一个键来指定要使用的括号.
您还可以将命令绑定到不同的键 - 例如,C-M-(
和C-M-[
.然后,您可以使用this-single-command-keys
指定最后一个键事件的内容.遗憾的是,转换回关键序列可能有点棘手.例如C-M-(
返回[201326632]
.
您也可以在每个括号类型中定义一个命令,所有这些命令都只是使用参数调用公共函数,并将这些命令绑定到键.
post-self-insert-hook
最后,您可以使用与电动缩进模式相同的方法:post-self-insert-hook
根据char-before
您要执行的操作添加功能并进行决定.