Windows10系统gvim的tagbar插件显示tag侧边栏时点击函数名导致gvim程序崩溃的bug
错误时的调用栈
comctl32.dll!CToolTipsMgr::GetToolAtPoint(struct HWND__ *,int,int,int,int) Unknown
comctl32.dll!CToolTipsMgr::ToolAtMessagePos(void) Unknown
comctl32.dll!CToolTipsMgr::ShowVirtualBubble(void) Unknown
comctl32.dll!CToolTipsMgr::HandleRelayedMessage(struct HWND__ *,unsigned int,unsigned int,long,unsigned int) Unknown
comctl32.dll!CToolTipsMgr::ToolTipsWndProc(struct HWND__ *,unsigned int,unsigned int,long) Unknown
comctl32.dll!CToolTipsMgr::s_ToolTipsWndProc(struct HWND__ *,unsigned int,unsigned int,long) Unknown
user32.dll!__InternalCallWinProc@20() Unknown
user32.dll!_UserCallWinProcCheckWow@36() Unknown
user32.dll!_SendMessageWorker@24() Unknown
user32.dll!_SendMessageW@16() Unknown
comctl32.dll!_CallNextSubclassProc@20() Unknown
comctl32.dll!_MasterSubclassProc@16() Unknown
user32.dll!__InternalCallWinProc@20() Unknown
user32.dll!_UserCallWinProcCheckWow@36() Unknown
user32.dll!_DispatchMessageWorker@8() Unknown
user32.dll!_DispatchMessageW@4() Unknown
gvim.exe!00464eeb() Unknown
是鼠标移上去的时候 显示一个 tooltip,也就是 函数原型的 ballon 提示时,出发了windows 10 里面comctl32 控件的动作导致崩溃了。
看上去是 vim里面的一个 ‘balloonexpr’ ‘bexpr’ 的特性 http://vimdoc.sourceforge.net/htmldoc/options.html#’balloonexpr’
对应的tagbar的代码
if has('balloon_eval')
setlocal balloonexpr=TagbarBalloonExpr()
set ballooneval
endif
function! TagbarBalloonExpr() abort
let taginfo = s:GetTagInfo(v:beval_lnum, 1)
if empty(taginfo)
return ''
endif
return taginfo.getPrototype(0)
endfunction
这个是很鸡肋的功能, 简单的禁用了这个 ballon eval 功能就可以了。 可以通过这个来设置,不过默认vim是关闭的, 是tagbar 用set ballooneval给打开了的。 看vimrc的最后加上这一句是有效的。
set noballooneval “ vimrc比插件早加载,后面那些插件里面又打开了,导致设置无效。进入界面再手工设置就可以。用autocmd 设置延时执行? set balloondelay=10000000 “ 设置一个超长停留时间,鼠标停10000秒才显示 ballon tooltip, 插件里面不改这个,这样基本就禁止tooltip功能了
set noballooneval
set balloondelay=10000000
更好的办法当然是修复vim 源码中的bug, 让他在 windows 10 不会崩溃。