对“错误类型论证”作出反应

时间:2012-03-25 17:37:38

标签: emacs lisp elisp

所以我开始学习一些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。或者是否有办法绕过这个错误(有点像异常处理)?

2 个答案:

答案 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)表达式post

无论如何,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")))