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

在vimrc中,仅对某些文件类型应用某些突出显示规则,vim,file-type,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 Aster

在我的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的条件不起作用,因为这个规则不再适用于我的任何文件,不管是文本还是非文本

编辑=>解决方案

在阅读了答案之后,我在我的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
你在找一个团队

请参阅: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
你在找一个团队

请参阅: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。这要求您具有:打开文件类型插件;使用after目录可以覆盖$VIMRUNTIME/ftplugin/text.vim完成的任何默认文件类型设置。或者,您可以定义:autocmd文件类型文本。。。直接在~/.vimrc中,但是一旦有了许多自定义项,这就变得很麻烦了

语法 对于:syntax命令,有一个对应的目录~/.vim/after/syntax/text.vim。Vim目前没有提供专用的文本语法;您可以删除后面的部分,并使您的语法成为主要语法

按照语法脚本约定,语法组应以文件类型作为前缀;e、 g.文本星号。hi组也必须重命名;但是,通常语法脚本使用:hi def link将语法组链接到更通用的突出显示组:hi def link textAsteriskBold AsteriskBold。更多信息请参见本章末尾

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

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

文件类型 特定于文件类型的设置进入~/.vim/after/ftplugin/text.vim。这要求您具有:打开文件类型插件;使用after目录可以覆盖$VIMRUNTIME/ftplugin/text.vim完成的任何默认文件类型设置。或者,您可以定义:autocmd文件类型文本。。。直接在~/.vimrc中,但是一旦有了许多自定义项,这就变得很麻烦了

语法 对于:syntax命令,有一个对应的目录~/.vim/after/syntax/text.vim。Vim目前没有提供专用的文本语法;您可以删除后面的部分,并使您的语法成为主要语法

按照语法脚本约定,语法组应以文件类型作为前缀;e、 g.文本星号。hi组也必须重命名;但是,通常语法脚本使用:hi def link将语法组链接到更通用的突出显示组:hi def link textAsteriskBold AsteriskBold。更多信息请参见本章末尾

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

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

您不必要地重复了文件类型检测。如果OP已经为文本文件类型设置了该选项,您可以简单地跳到该选项之上并使用au文件类型文本。请注意,与此方法相比,我仍然更喜欢内置的文件类型插件!谢谢你,英戈!目前,我喜欢将所有设置放在我的vimrc中,因为我没有很多设置,而且我经常在新的计算机上工作,所以很容易保存我的vimrc并将所有设置放在一个位置。你在不必要地复制文件类型检测。如果OP已经为文本文件类型设置了该选项,您可以简单地跳到该选项之上并使用au文件类型文本。请注意,与此方法相比,我仍然更喜欢内置的文件类型插件!谢谢你,英戈!目前,我喜欢将我的所有设置放在我的vimrc中,因为我没有很多设置,而且我经常在新的计算机上工作,所以很容易保存我的vimrc并将所有设置放在一个地方。很棒的帖子+1.非常有趣!但我不认为这是公认的答案,因为这并不能立即解决我的问题,
但是,它提供了有关Stack Overflow实际工作原理的信息,而不是提供您只需要复制和粘贴的现成答案。特别是你的问题可以通过不同的努力在不同的层面上得到解决。当然,您可以再等一段时间:-当然,但同时,我了解了augroup命令,并且我的if语句语法不正确,我仍然需要自己弄清楚为什么需要augroup,因为每个aucommand行都是从验证文件类型开始的,所以它不是一个现成的答案,我觉得这更接近我的确切问题,但我已经非常仔细地阅读了你的文章,以便在将来使用,这真的是一篇非常有用的文章+1.非常有趣!虽然我没有将其标记为可接受的答案,因为它并不能立即解决我的问题,但它提供了有关WorkStack Overflow实际应该如何教您的信息,而不是提供您只需要复制和粘贴即可获得的现成答案。特别是你的问题可以通过不同的努力在不同的层面上得到解决。当然,您可以再等一段时间:-当然,但同时,我了解了augroup命令,并且我的if语句语法不正确,我仍然需要自己弄清楚为什么需要augroup,因为每个aucommand行都是从验证文件类型开始的,所以它不是一个现成的答案,我觉得这更接近我的确切问题,但我已经非常仔细地阅读了你的帖子,以便将来使用它,它真的很有帮助