Vim split使语法高亮显示打开

Vim split使语法高亮显示打开,vim,Vim,我试图编写一个函数,使vim在拆分窗口中打开相对的头文件/源文件 除了在拆分中打开的文件之外,我所做的工作(见下文)没有语法高亮显示 function! SplitOther() let s:fname = expand("%:p:r") if expand("%:e") == "h" set splitright exe "vsplit" fnameescape(s

我试图编写一个函数,使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()
我曾尝试将上的
语法附加到命令中(就在
endfunction
之前),但这似乎不起作用

我认为在分割前文件不在缓冲区时会发生这种情况?但我不是100%肯定

编辑 我将函数更改为允许定义文件对,我不确定它是否会改变我的问题,因此这里是扩展版本:

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()
明白了

将文件加载到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()

问题是文件类型检测是由
autocmd
触发的,但默认情况下,自动命令不嵌套(cp.
:help autocmd nested

另外,通过使用
:autocmd砰的一声,您正在清除所有其他此类全局自动清除;这可能会影响其他定制或插件!您应该通过
:augroup
定义您自己的范围,这样就安全了。综合起来:

augroup MyAltSplitPlugin
    autocmd! BufReadPost * nested call SplitOther()
augroup END

它在没有
autocmd的情况下工作,即使用地图或其他东西。它必须是自动的吗?我使用
le
来实现这一点。自动化更多地是为了让生活更轻松。是的,我可以理解,尽管我不希望像这样的东西被自动强制,因此使用简单的绑定。无论如何,您的函数没有问题,这是因为
autocmd
。我怀疑我使用了错误的事件或其他东西,我将进行实验,您可以查看一下。我没有让它使用
autocmd
,但它可能会给你一个想法。我确实在一个组中有自动命令,我只是在该组中有很多命令,所以我省略了它。我会好好读的,谢谢!