match-* 功能不正常?

match-* functions not behaving?

我正在尝试编写一个 elisp 函数,根据输入将 Python 测试函数标记为绿色或红色。这些论点是不言自明的。导航部分有效,但 put-text-property 部分什么都不做。我试过 eval-ing match-* 函数,但我无法理解 return 值。它们似乎也 return 不同的东西,这取决于我 eval 在哪个缓冲区。

这个的基本要点是从 rainbow-mode.el 的相关部分借来的,并且在那里它完美地工作。

put-text-property 调用有什么问题?相关地,我可以做些什么来调试它并了解更多信息?

(defun snake-decorate-test (file class func status)
  ; FIXME: Path hardcoded while developing.
  (find-file (format "/home/thiderman/git/piper/%s" file))
  (beginning-of-buffer)
  (re-search-forward (format "^class %s(" class) nil t)
  (re-search-forward (format "^    def \(%s\)(" func) nil t)
  (put-text-property
   (match-beginning 1) (match-end 1)
   'face `((:background ,(if (s-equals? status ".")
                             "#007200" "#720000")))))```
  1. 那个缓冲区是字体锁定的吗?如果是这样,请尝试使用 font-lock-face 而不是 face 作为文本 属性。字体锁定是贪婪的 - 它会清除(覆盖)您添加的任何 face 突出显示。

  2. 你试过调试吗?

    一个。您是否在您认为代码应该突出显示的字符上使用了 C-u C-x =?你可能会发现它确实有你试图给它的 face 属性,但字体锁定覆盖了突出显示(见#1)。

    b。使用 M-x debug-on-entry snake-decorate-test 然后使用 d 遍历该函数(偶尔使用 c 以跳过一个步骤)。随时使用 e 来评估任何 sexp 并查看 return 值。

    c。或者,添加对 message 的调用以打印出您要检查的中间状态,这样您就可以看到发生了什么。例如,向自己展示 (match-beginning 1) 的真实情况,看看它是否如您所愿。