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

时间:2015-04-26 01:51:53

标签: regex emacs

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

我尝试在inline宏中匹配constunusedATS个关键字 。 我尝试ATS([^,]*),但只匹配inline个关键字。

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

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

3 个答案:

答案 0 :(得分:1)

您可以使用锚定字体锁定规则。这就像在搜索中搜索一样。以下代码搜索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表示行的结尾)。例如,匹配后表单可用于将该点返回到其他关键字规则的良好位置。

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

答案 1 :(得分:0)

如果匹配都是小写,您只需使用:

[a-z]+

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

答案 2 :(得分:0)

这是一个简单的方法:

加载库Highlighthighlight.el

然后调用命令/函数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性别中,那么您可以将单独的正则表达式合并为一个,并使用单个调用来hlt-highlight-regexp-to-end或{ {1}}。