首页 > 解决方案 > 在 vimrc 中,仅对某些文件类型应用某些突出显示规则

问题描述

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

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

编辑 => 解决方案

在阅读完答案后,我在我的 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

标签: vimfile-type

解决方案


文件类型

特定于文件类型的设置进入~/.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可以尝试调整这些)。请注意这一点。


推荐阅读