我有一个defun,方便地添加/删除括号到标记的表达式.(见最后的代码)
作为emacs Lisp的新手,我只知道如何在没有参数的情况下制作简单的键绑定.
但是,我相信如果它的键绑定可以采用两个可选参数来指定是否添加/删除,或者更新(),那么defun会更方便.[]{}
我目前的(简单)键绑定如下所示,是否有一种简单的方法可以使其参与描述?
(global-set-key (kbd "C-M-( )") 'end-of-statement)
Run Code Online (Sandbox Code Playgroud)
感谢任何建议或方向提示!
(代码: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))))))
Run Code Online (Sandbox Code Playgroud)
我假设问题是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您要执行的操作添加功能并进行决定.
| 归档时间: |
|
| 查看次数: |
575 次 |
| 最近记录: |