在 vimrc 中,仅对某些文件类型应用某些突出显示规则

hug*_*ogo 1 vim file-type

在我的 vimrc 中,我有一个脚本可以在 * * 双星 * * 之间以粗体形式转换文本(实际上就像在这个编辑器中所做的那样),但我不希望它应用于我的 js 或 c 或任何编程文件当然,所以我试图让它只在它是 .txt 文件时运行:

if (&filetype=='text')
    set concealcursor=n
    set conceallevel=3
    hi AsteriskBold ctermfg=Green cterm=bold
    autocmd BufEnter * syn match Asterisks contained "**" conceal
    autocmd BufEnter * syn match AsteriskBold "\*\*.*\*\*" contains=Asterisks
endif
Run Code Online (Sandbox Code Playgroud)

但显然“如果”的条件不起作用,因为此规则不再适用于我的任何文件,文本与否

编辑 => 解决方案

阅读答案后,我选择了这个解决方案,在我的 vimrc 中(尽管这不是 ingo 解释的 vim 工作的最佳方式)

au BufEnter *.txt setf text "(set a filetype unless it already exist)
au filetype text set cocu=n cole=3
au filetype text hi AsteriskBold ctermfg=Green cterm=bold
au filetype text syn match Asterisks contained "**" conceal
au filetype text syn match AsteriskBold "\*\*.*\*\*" contains=Asterisks
Run Code Online (Sandbox Code Playgroud)

Ing*_*kat 6

文件类型

特定于文件类型的设置进入~/.vim/after/ftplugin/text.vim. (这要求您拥有:filetype plugin on; 使用after目录允许您覆盖由 完成的任何默认文件类型设置$VIMRUNTIME/ftplugin/text.vim。)或者,您可以:autocmd FileType text ...直接在您的 中定义~/.vimrc,但是一旦您进行了许多自定义,这往往会变得笨拙。

语法

对于:syntax命令,有一个相应的目录~/.vim/after/syntax/text.vim。(Vim 目前不附带专用text语法;您可以删除该after部分,并使您的语法成为主要部分。)

根据语法脚本约定,你的语法组应该以文件类型为前缀;例如textAsterisks。该:hi组也必须重命名;但是,通常语法脚本用于:hi def link将语法组链接到(更通用的)高亮组:hi def link textAsteriskBold AsteriskBold. 更多信息在末尾usr_44.txt

突出显示组

这些是全局的,您可以将您的:hi命令直接放入您的命令中~/.vimrc并只定义一次。

隐藏

隐藏设置是window-local,但文件类型和语法适用于buffers。并且通过使用:set(而不是:setlocal),这些设置将被从显示文本文件的窗口打开的任何新窗口继承。根据您的工作流程(以及您编辑的其他文件类型是否完全使用隐藏),您可能永远不会注意到这一点,并且没有好的解决方法(只能:autocmd尝试适应这些)。请注意这一点。