Vim split使语法高亮显示打开
我试图编写一个函数,使vim在拆分窗口中打开相对的头文件/源文件 除了在拆分中打开的文件之外,我所做的工作(见下文)没有语法高亮显示Vim split使语法高亮显示打开,vim,Vim,我试图编写一个函数,使vim在拆分窗口中打开相对的头文件/源文件 除了在拆分中打开的文件之外,我所做的工作(见下文)没有语法高亮显示 function! SplitOther() let s:fname = expand("%:p:r") if expand("%:e") == "h" set splitright exe "vsplit" fnameescape(s
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
,但它可能会给你一个想法。我确实在一个组中有自动命令,我只是在该组中有很多命令,所以我省略了它。我会好好读的,谢谢!