如果文本出现在一系列#
井号之后,我会尝试将其设为粗体。这是我的 中的行.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
到(此处:隐式)文件类型)、文件类型自定义、语法突出显示)。将以下内容分开会更清晰(且更具扩展性):
- 定义一个
text
文件类型:au BufRead,BufNewFile *.txt setf text
。此检测可能已存在于您的 Vim 版本中。 - 定义语法高亮(或扩展)
~/.vim/syntax/text.vim
(或~/.vim/after/syntax/text.vim
扩展现有语法)。