vimrc 设置不在开始时应用,但仅在采购后应用

vimrc settings apply not at start but only after sourcing

我的 vimrc 文件中有这些行:

set concealcursor=n
set conceallevel=3
hi AsteriskBold ctermfg=Green cterm=bold
syn match Asterisks contained "**" conceal
syn match AsteriskBold "\*\*[^*]\+\*\*" contains=Asterisks

如果我在 vim 中打开一个新文件,它们适用,但如果我打开一个已经存在的文件,它在我 运行 :source ~/.vim 之前不起作用rc

但是其他设置也适用,我不必获取它们:

set directory=~/.vim/swapfiles//
colo torte
set tabstop=2
set autoindent
set number

我不明白为什么?我想它们会被其他 vim 设置覆盖,但如果它是一个新文件则不会,而且我不知道如何找到设置被覆盖的位置?

例如如果我运行

touch test.txt

echo hello > test.txt

echo \*\*world\*\* >> test.txt

vim test.txt

我得到

1 hello

2 * * world * *

~

~

~

现在如果我 运行 :verbose set conceallevel 它输出 conceallevel=3 last modification in ~/.vimrc

如果那我运行:source ~/.vimrc我得到

1 hello

2 world

~

~

~

如果我再次 运行 :verbose set conceallevel 它仍然输出 conceallevel=3 last modification in ~/.vimrc

所有这些都是在 .txt 文件上完成的,但如果我在 .js 文件上尝试,它的工作原理完全相同。但是,我的设置似乎不适用于 .html 文件,但我不在乎

很可能您的高亮组 AsteriskBold 已被您的配色方案清除(为确认这一点,请输入命令 :hi AsterisksBold)。例如,从 default 配色方案的前几行(位于 :e $VIMRUNTIME/color/default.vim):

" Remove all existing highlighting and set the defaults.
hi clear 

这将清除现有的突出显示组,包括 AsteriskBold。一种可能的解决方案是使用自动命令触发突出显示设置:

autocmd ColorScheme * hi AsteriskBold ctermfg=Green cterm=bold                     
autocmd BufEnter * syn match Asterisks contained "**" conceal                   
autocmd BufEnter * syn match AsteriskBold "\*\*[^*]\+\*\*" contains=Asterisks   

最后起作用的是:

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

因为如果我写 autocmd ColorScheme * hi AsteriskBold ctermfg=Green cterm=bold 它在获取文件后不起作用;不知道为什么...