所以我开始学习一些lisp / elisp来优化我的emacs环境,并且我已经开始创建一个简单的emacs库,主要障碍是能够判断输入的括号是否匹配。我一直在查看emacs源代码(paren.el.gz)并意识到我可以使用函数show-paren-function
来确定它是否匹配。
这是我到目前为止所得到的:
(defun it-is-a-paren()
(interactive)
(insert ")")
(if (show-paren-function)
(message "%s" "it is a match")
(message "%s" "it is not")))
所以这是非常基本的,并且“它是一个匹配”可以正常工作,但当它应该抛出“它不是”时,它不会,而是它给了我“错误的类型参数:整数 - or-marker-p,t“。
是否有人熟悉建议使用不同的功能,或者我应该完全自己编写,而不是使用show-paren-function
。或者是否有办法绕过这个错误(有点像异常处理)?
答案 0 :(得分:4)
您正在寻找的“异常处理”式构造是condition-case
。
(defun its-a-paren()
(interactive)
(insert ")")
(condition-case ex
(if (show-paren-function)
(message "its a match")
(message "its not"))
(error (message "its not"))))
修改:查看show-paren-function
的代码,在我看来,此错误是一个错误,因为它来自(goto-char pos)
表达式pos
是t
。
无论如何,show-paren-function
使用scan-sexps
来寻找匹配的paren。根据{{1}}中的方式进行调整,适用于您案例的简化函数将是:
show-paren-function
答案 1 :(得分:2)
为此目的使用show-paren-function是过度的(比如让你的车到车库检查油位是否已经改变,以确定汽车是否需要更多的油)并且不能正常工作,就像你一样已经注意到了。
我建议你试试
(condition-case nil
(progn (forward-sexp -1)
(message "Moved to the matching opener"))
(scan-error (message "No matching opener")))