使用自动命令BufNewFile时未加载Vim colorscheme

时间:2018-12-15 22:39:36

标签: vim vim-syntax-highlighting

当尝试使用自动命令自动打开相应的.cpp或.h文件时,我在打开的相应文件上没有遇到任何颜色问题。 我对vimscript不太熟悉,但我相信Vim会打开该文件,认为它的文件类型为“ .txt”,因此使用默认的colorcheme。

〜/ .vimrc中的两个自动命令行:

au BufRead,BufNewFile *.cpp exe "bel vsplit" fnameescape(expand("%:r").".h")
au BufRead,BufNewFile *.h exe "vsplit" fnameescape(expand("%:r").".cpp")

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您的答案是一种解决方法(尽管您应该使用:setlocal而不是:set来避免语法泄漏到从该缓冲区打开的新缓冲区中),但是它不会攻击根本原因,您会在:help autocmd-nested中找到原因的解释:

  

默认情况下,自动命令不嵌套。如果在自动命令中使用“:e”或“:w”,则Vim不会为这些命令执行BufRead和BufWrite自动命令。如果确实要这样做,请对要嵌套的命令使用“嵌套”标志。

语法突出显示(您在标题中说是colorcheme,但这实际上只是语法突出显示然后使用的颜色和字体属性)基于:autocmd事件( filetype插件也是如此,因此假设您在:filetype plugin on中有~/.vimrc,在拆分文件中也找不到与C ++相关的任何设置。如果没有nested属性,将打开拆分文件,但是不会对它们执行任何常规操作。尽管一般来说嵌套可能会出现问题,但这是需要嵌套的情况之一。

au BufRead,BufNewFile *.cpp nested exe "bel vsplit" fnameescape(expand("%:r").".h")
au BufRead,BufNewFile *.h   nested exe "vsplit" fnameescape(expand("%:r").".cpp")

不幸的是,这带来了另一个问题:一个autocmd会触发另一个,反之亦然(最大)。您需要保护操作,以便仅在文件尚未打开时才进行拆分。 (这在一般情况下还提高了可用性,当您打开另一个已经打开的文件时。):help bufwinnr()检查目标缓冲区在窗口中是否已经可见:

au BufRead,BufNewFile *.cpp nested if bufwinnr("^" . expand("%:r").".h$")   == -1 | exe "bel vsplit" fnameescape(expand("%:r").".h") | endif
au BufRead,BufNewFile *.h   nested if bufwinnr("^" . expand("%:r").".cpp$") == -1 | exe "vsplit" fnameescape(expand("%:r").".cpp") | endif

答案 1 :(得分:0)

如果将来有人在关注这个问题,解决方案是Vim正在以语法= none加载第二个文件。因此,在每个自动命令的末尾添加{{1}}可以解决该问题。