我正在尝试编写一个函数,使vim在拆分窗口中打开相关的头文件/源文件。
我所做的工作(见下文)除了它在分割中打开的文件外没有语法高亮。
function! SplitOther()
let s:fname = expand("%:p:r")
if expand("%:e") == "h"
set splitright
exe "vsplit" fnameescape(s:fname . ".cpp")
elseif expand("%:e") == "cpp"
set nosplitright
exe "vsplit" fnameescape(s:fname . ".h")
endif
endfunction
autocmd! BufReadPost *.h,*.cpp call SplitOther()
我尝试将syntax on
附加到命令(就在endfunction
之前),但似乎不想工作。
我认为在拆分之前文件不在缓冲区中会发生这种情况吗?我不是百分百肯定的。
我改变我的功能以允许文件对的定义,我不确定它是否会改变我的问题所以这里是扩展版本:
function! SplitOther()
let s:pairs = [ [ "h", "cpp" ], [ "vert", "frag" ] ]
let s:fname = expand("%:p:r")
for [s:left, s:right] in s:pairs
if expand("%:e") == s:left
set splitright
exe "vsplit" fnameescape(s:fname . "." . s:right)
elseif expand("%:e") == s:right
set nosplitright
exe "vsplit" fnameescape(s:fname . "." . s:left)
endif
endfor
endfunction
autocmd! BufReadPost * call SplitOther()
答案 0 :(得分:2)
知道了!
当文件被加载到vsplit时,它的文件类型没有被设置。
我注意到当调用vsplit时,新的split会抓取焦点,那就是没有语法高亮的窗口,所以你可以在函数末尾添加exe "filetype" "detect"
来告诉vim检测文件类型当前窗口。
结果:
function! SplitOther()
let s:pairs = [ [ "h", "cpp" ], [ "vert", "frag" ] ]
let s:fname = expand("%:p:r")
for [s:left, s:right] in s:pairs
if expand("%:e") == s:left
set splitright
exe "vsplit" fnameescape(s:fname . "." . s:right)
break
elseif expand("%:e") == s:right
set nosplitright
exe "vsplit" fnameescape(s:fname . "." . s:left)
break
endif
endfor
exe "filetype" "detect"
endfunction
autocmd! BufRead * call SplitOther()
答案 1 :(得分:1)
问题是文件类型检测是由autocmd
触发的,但默认情况下,自动命令不会嵌套(cp。:help autocmd-nested
)。
此外,通过使用:autocmd!
使用爆炸,您将清除所有其他此类全局自动登录;这可能会影响其他自定义或插件!您应该通过:augroup
定义自己的范围,然后才是安全的。合在一起:
augroup MyAltSplitPlugin
autocmd! BufReadPost * nested call SplitOther()
augroup END