Vimrc部分语法高亮设置仅source后生效,打开已有文件失效求助
解决Vim自定义语法高亮仅在新文件生效的问题
我来帮你搞定这个困扰~你遇到的问题根源在于:语法规则(syn)和高亮组(hi)的设置属于缓冲区局部配置,而Vim打开已有文件时,会先加载对应文件类型的默认语法脚本,之后才会执行vimrc里的内容——这就导致你的自定义规则被默认语法覆盖了;而像tabstop、directory这类基础配置是全局生效的,所以不受影响。
下面给你几个靠谱的解决方案,按推荐程度排序:
方案1:用after/syntax目录(最符合Vim规范)
这个方法针对特定文件类型生效,能确保你的自定义规则在默认语法之后加载,避免被覆盖:
- 先创建
after/syntax目录(如果没有的话):mkdir -p ~/.vim/after/syntax - 根据你要生效的文件类型创建对应脚本,比如如果是Markdown文件,就创建
~/.vim/after/syntax/markdown.vim,把你的配置写进去:set concealcursor=n set conceallevel=3 hi AsteriskBold ctermfg=Green cterm=bold syn match Asterisks contained "**" conceal syn match AsteriskBold "\*\*[^*]\+\*\*" contains=Asterisks
这样每次打开Markdown文件时,Vim会先加载默认的Markdown语法,再执行这个脚本里的自定义规则,不管是新文件还是已有文件都能直接生效。
方案2:用自动命令(autocmd)全局生效
如果你想让这些配置对所有文件类型生效,可以在vimrc里添加自动命令,确保每次进入缓冲区时都应用设置:
augroup CustomConcealSettings autocmd! " 先清空该组的旧命令,避免重复加载 autocmd BufEnter * set concealcursor=n autocmd BufEnter * set conceallevel=3 autocmd BufEnter * hi AsteriskBold ctermfg=Green cterm=bold autocmd BufEnter * syn match Asterisks contained "**" conceal autocmd BufEnter * syn match AsteriskBold "\*\*[^*]\+\*\*" contains=Asterisks augroup END
BufEnter事件会在你打开文件、切换缓冲区时触发,确保这些局部配置被应用到每个缓冲区里。
补充:为什么其他配置没问题?
像set directory=~/.vim/swapfiles//、colo torte、set tabstop=2这些都是全局配置,Vim启动时就会加载并应用到所有缓冲区,不管是新文件还是已有文件,所以不需要手动source。
内容的提问来源于stack exchange,提问作者hugogogo
相关产品推荐
相关产品推荐

