所以我开始学习一些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")))

所以这是非常基本的,而且“它是一个匹配”可以正常工作,但是当它应该抛出“它不是”时,它没有,相反它给了我“错误的类型参数:integer-or-marker-p,t”。
是否有足够熟悉的人建议使用不同的函数,或者也许我应该编写自己的函数,而不是使用show-paren-function或者有办法避免这个错误(类似于异常处理)?

最佳答案

您要查找的“异常处理”类构造是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的代码,在我看来,这个错误是一个bug,因为它来自表达式(goto-char pos),其中post
无论如何,show-paren-function使用scan-sexps查找匹配的paren根据在show-paren-function中的操作方式,您的案例的简化功能是:
(defun its-a-paren()
  (interactive)
  (insert ")")
  (condition-case ()
      (progn
        (scan-sexps (point) -1)
        (message "It's a match"))
    (error (message "It's not a match"))))

关于emacs - 应对“错误类型的论点”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9862401/

10-08 21:15