Vim split会导致语法高亮显示打开

时间:2013-05-15 13:46:04

标签: vim

我正在尝试编写一个函数,使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()

2 个答案:

答案 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