如何匹配除特定模式之外的所有内容 after/before 特定字符串常量

How to match everything except a particular pattern after/before a specific string constant

ATS(inline, const, unused) /* Variadic Macro */
OTS(inline, const, unused)

我试图在 ATS 宏中匹配 inlineconstunused 关键字 。 我试过 ATS([^,]*) 但它只匹配 inline 关键字。

编辑: 我需要更改所有 ATS 参数的颜色。这仅适用于第一个参数。

(font-lock-add-keywords nil
  '(("ATS(\([^,]*\)" 1 font-lock-builtin-face)))

如果匹配的都是小写,你可以简单地使用:

[a-z]+

确保正则表达式区分大小写。

这是一种简单的方法:

加载库Highlight (highlight.el)

然后调用command/function foo:

(defun foo ()
  (interactive)
  (hlt-highlight-regexp-to-end "ATS([^)]*\(inline\)[^)]*)"
                               'font-lock-builtin-face  nil nil 1)
  (hlt-highlight-regexp-to-end "ATS([^)]*\(const\)[^)]*)"
                               'font-lock-constant-face nil nil 1)
  (hlt-highlight-regexp-to-end "ATS([^)]*\(unused\)[^)]*)"
                               'font-lock-warning-face  nil nil 1))

您也可以使用 font-lock-add-keywords 来做同样的事情。

(defun foo ()
  (interactive)
  (font-lock-add-keywords nil
                          '(("ATS([^)]*\(inline\)[^)]*)" (1 'font-lock-builtin-face t)))
                          'APPEND)
  (font-lock-add-keywords nil
                          '(("ATS([^)]*\(const\)[^)]*)"  (1 'font-lock-constant-face t)))
                          'APPEND)
  (font-lock-add-keywords nil
                          '(("ATS([^)]*\(unused\)[^)]*)" (1 'font-lock-warning-face t)))
                          'APPEND))

如果您知道它们都将以相同的顺序出现在相同的 ATS sexp 中,那么您可以将单独的正则表达式组合成一个并使用单个调用 hlt-highlight-regexp-to-endfont-lock-add-keywords.

您可以使用 anchored 字体锁定规则。这就像搜索中的搜索。下面的代码搜索 AST(。找到后,它会找到参数列表的末尾并搜索其中的所有单词。

(defun foo ()
  (interactive)
  (setq font-lock-multiline t)
  (font-lock-add-keywords
   nil
   '(("\_<ATS("
      ("\_<\sw+\_>"
       ;; Pre-match form -- limit the sub-search to the end of the argument list.
       (save-excursion
         (goto-char (match-end 0))
         (backward-char)
         (ignore-errors
           (forward-sexp))
         (point))
       ;; Post-match form
       (goto-char (match-end 0))
       (0 font-lock-builtin-face))))))

这将匹配括号内的所有单词,即使它们分布在多行中。

预匹配形式有两个目的:它可以将点定位到合适的位置,它控制子搜索的扩展(其中nil表示行的结束)。例如,post-匹配形式可用于 return 指向其他关键字规则的良好位置。

当然,这可以扩展为仅突出显示一组特定的单词,但我将其留作练习。