如何匹配除特定模式之外的所有内容 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
宏中匹配 inline
、const
、unused
关键字 仅。
我试过 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-end
或 font-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 指向其他关键字规则的良好位置。
当然,这可以扩展为仅突出显示一组特定的单词,但我将其留作练习。
ATS(inline, const, unused) /* Variadic Macro */
OTS(inline, const, unused)
我试图在 ATS
宏中匹配 inline
、const
、unused
关键字 仅。
我试过 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-end
或 font-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 指向其他关键字规则的良好位置。
当然,这可以扩展为仅突出显示一组特定的单词,但我将其留作练习。