我有一个defun,方便地添加/删除括号到标记的表达式。 (见最后的代码)
作为emacs Lisp的新手,我只知道如何在没有参数的情况下制作简单的键绑定。
但是,我相信如果其键绑定可以采用两个可选参数来指定是否添加/删除()
,[]
或{}
< / p>
我当前的(简单的)键绑定如下所示,是否有一种简单的方法可以使其参与描述?
(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))))))
答案 0 :(得分:5)
我认为这个问题适用于surround-with-parens
,因为delete-surrounded-parens
最好只是猜测自己使用的括号。
我还假设你这样做是为了练习,而不是实际解决问题。如果在最近的Emacsen中启用electric-pair-mode
,则配置的对将围绕任何活动区域进行处理。但这是一个很好的中级emacs lisp练习。
如评论所述,您有多种选择。
命令可以根据您的要求获取参数。命令与其他lisp函数没有区别,只是它们具有interactive
规范。 interactive
规范告诉Emacs在使用密钥或M-x
调用命令时如何运行该命令。
简单(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
决定您想要做什么。