我什至不知道这种Lisp语法的正确术语,所以我不知道我用来问这个问题的词是否有意义。但是,我敢肯定,这个问题是有道理的。

所以,让我告诉你。 cc-mode(cc-fonts.el)具有称为“匹配器”的东西,它们是代码位,用于决定如何对代码区域进行字体化。这听起来很简单,但是匹配器代码的格式我不完全理解,带有反引号和逗号分隔符,只是逗号等等,此外,它还嵌入了c-lang-defcost中,它本身就是一个宏。我不知道该怎么称呼,但是我想在该代码上运行edebug。

看:

 (c-lang-defconst c-basic-matchers-after
   "Font lock matchers for various things that should be fontified after
 generic casts and declarations are fontified.  Used on level 2 and
 higher."

   t `(;; Fontify the identifiers inside enum lists.  (The enum type
       ;; name is handled by `c-simple-decl-matchers' or
       ;; `c-complex-decl-matchers' below.
       ,@(when (c-lang-const c-brace-id-list-kwds)
           `((,(c-make-font-lock-search-function
                (concat
                 "\\<\\("
                 (c-make-keywords-re nil (c-lang-const c-brace-id-list-kwds))
                 "\\)\\>"
                 ;; Disallow various common punctuation chars that can't come
                 ;; before the '{' of the enum list, to avoid searching too far.
                 "[^\]\[{}();,/#=]*"
                 "{")
                '((c-font-lock-declarators limit t nil)
                  (save-match-data
                    (goto-char (match-end 0))
                    (c-put-char-property (1- (point)) 'c-type
                                         'c-decl-id-start)
                    (c-forward-syntactic-ws))
                  (goto-char (match-end 0)))))))

我正在阅读lisp语法,以弄清这些东西是什么以及如何称呼它们,但是除此之外,如何在读取;; Fontify the identifiers inside enum lists.的注释后面的代码上运行edebug?

我知道如何在defun上运行edebug-只需在函数的定义内调用edebug-defun,然后就可以了。我需要做相应的事情来对cc模式匹配器代码形式进行调试吗?
def-edebug-spec是做什么的,我会在这里使用吗?如果是这样,怎么办?

最佳答案

根据(elisp)Top > Debugging > Edebug > Edebug and Macros,您必须告诉Edebug如何通过使用debug语句定义宏或使用def-edebug-spec来调试宏。这告诉它应该评估哪些参数,哪些不应该评估。这样就可以了。实际上,似乎c-lang-defconst已经适合edebug。如果您感兴趣的话,以下是定义:

(def-edebug-spec c-lang-defconst
  (&define name [&optional stringp] [&rest sexp def-form]))

但是,如果您只想查看主体的计算结果,那么执行此操作的方法是使用下面的macro-expand-last-sexp之类的东西来查看结果。将光标定位在要扩展的sexp之后(就像C-x C-e一样),然后运行M-x macro-expand-last-sexp RET。这将向您展示它的扩展范围。如果尝试扩展诸如,(....)之类的内容,可能会遇到麻烦,因此您可能不得不将该sexp复制到其他位置,然后删除,,@
(defun macro-expand-last-sexp (p)
  "Macro expand the previous sexp.  With a prefix argument
insert the result into the current buffer and pretty print it."
  (interactive "P")
  (let*
      ((sexp (preceding-sexp))
       (expanded (macroexpand sexp)))
    (cond ((eq sexp expanded)
           (message "No changes were found when macro expanding"))
          (p
           (insert (format "%S" expanded))
           (save-excursion
             (backward-sexp)
             (indent-pp-sexp 1)
             (indent-pp-sexp)))
          (t
           (message "%S" expanded)))))

我想这完全取决于您要执行的操作。

10-08 12:36