在 vimrc 中,仅对特定文件类型应用特定的突出显示规则

in vimrc apply certain highlighting rules only for certain filetype

在我的 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

但显然 "if" 的条件不起作用,因为此规则不再适用于我的文件的 none,文本与否

编辑 => 解决方案

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

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

您正在寻找 augroup

参见 :help augroup:help filetype

例如:

augroup asteriskbold
    au!
    au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn set concealcursor=n conceallevel=3
    au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn hi AsteriskBold ctermfg=Green cterm=bold
    au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn syn match Asterisks contained "**" conceal
    au BufNewFile,BufRead *.txt,*.md,*.mkd,*.markdown,*.mdwn syn match AsteriskBold "\*\*.*\*\*" contains=Asterisks
augroup end

文件类型

特定于文件类型的设置进入 ~/.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 到 link 语法组到(更通用的)高亮组:hi def link textAsteriskBold AsteriskBold。更多信息在 usr_44.txt.

末尾

突出显示组

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

隐藏

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