Vim 高亮显示多个“#”后的所有文本

Vim 高亮显示多个“#”后的所有文本

如果文本出现在一系列#井号之后,我会尝试将其设为粗体。这是我的 中的行.vimrc

au BufRead,BufNewFile *.txt hi header cterm=cyan ctermbg=red

以及我尝试的正则表达式:

au BufRead,BufNewFile *.txt syn match header /\n#+\zs.*\ze/
au BufRead,BufNewFile *.txt syn match header /^#+\zs.*\ze/ "Why doesn't ^ work?

有点有效,但它也匹配了#s 和一些不正确的文本。它也是非常速度很慢,在我的 MacBook 上匹配大约需要 10 秒钟:

au BufRead,BufNewFile *.txt syn match header /\zs\n#*\w*\ze/

我不确定我做错了什么——这些在在线正则表达式测试器上起作用。

这个测试者,正则表达式^#*(.*)完美运行,我与第一个捕获组匹配。我如何将其翻译为 vim?

干杯。

答案1

1 个或多个匹配的乘数是\+;您忘记了反斜杠(或\v“非常神奇”的修饰符)。\ze在末尾使用 是多余的。仅从第二行开始^匹配每行的开头\n。请注意,Vim 使用特殊的正则表达式方言,因此各种网站告诉您的内容可能需要调整。这些:help pattern页面是最佳和权威的参考资料。

syn match header /^#\+\zs.*/

此外,您添加的语法可能会被现有的语法规则所掩盖。您可以尝试附加containedin=ALL,但这不是通用的解决方案。您可能需要分析现有的语法并为每个语法制定一个特殊的解决方案。作为替代方案,您可以使用命令:match。这在语法突出显示之上(并且独立于语法突出显示)工作。缺点是这是窗口局部:autocmd,因此如果您想要将其仅应用于某些缓冲区或窗口分割,则需要魔法。

match header /^#\+\zs.*/

风格批评

使用au BufRead,BufNewFile *.txt syn match,您会将几个方面混合在一起:文件类型检测(映射*.txt到(此处:隐式)文件类型)、文件类型自定义、语法突出显示)。将以下内容分开会更清晰(且更具扩展性):

  1. 定义一个text文件类型:au BufRead,BufNewFile *.txt setf text。此检测可能已存在于您的 Vim 版本中。
  2. 定义语法高亮(或扩展)~/.vim/syntax/text.vim(或~/.vim/after/syntax/text.vim扩展现有语法)。

相关内容