1

我正在尝试编写一个函数来使 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),但这似乎并不想工作。

我认为当文件在拆分之前不在缓冲区中时会发生这种情况?不过,我不是 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()
4

2 回答 2

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()
于 2013-05-15T15:30:22.467 回答
1

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

此外,通过:autocmd!一声巨响,您将清除所有其他此类全局自动命令;这可能会影响其他自定义或插件!您应该通过 定义自己的范围:augroup,然后它是安全的。综合起来:

augroup MyAltSplitPlugin
    autocmd! BufReadPost * nested call SplitOther()
augroup END
于 2013-05-16T06:44:54.117 回答