有没有办法分析 Vim 插件?
当我打开一个大的
.py
时,我的MacVim变得越来越慢。我知道我可以取消选择所有插件并逐一重新选择以检查哪个插件是罪魁祸首,但是有没有更快的方法?
我的 dotvim 在这里:https://github.com/charlax/dotvim
您可以使用内置的分析支持:启动 vim 后执行
:profile start profile.log
:profile func *
:profile file *
" At this point do slow actions
:profile pause
:noautocmd qall!
(与退出不同,
noautocmd
并不是真正需要的,它只是让 vim 退出得更快)。
注意:您不会获得有关 vim 退出之前删除的函数的信息。
我发现了另一个非常有用的 vim 内置方法,可以在加载 .vimrc 时显示准确的计时消息。
vim --startuptime timeCost.txt timeCost.txt
请运行:
:help --startuptime
在 VIM 中获取更多信息。
可以是插件,也可以是语法高亮;发生这种情况时尝试
:syntax off
,看看 Vim 是否立即变得更快。
使用插件时,“普遍缓慢”通常来自自动命令; a
:autocmd
列出了所有这些。通过 :autocmd! [group] {event}
杀死其中一些来进行调查。从较频繁的事件(即 CursorMoved[I]
)到较不频繁的事件(例如 BufWinEnter
)。
如果您可以在某种程度上可靠地重现缓慢情况,二分搜索可能会有所帮助:移走
~/.vim/plugin/
中的一半文件,然后移走另一个,在较慢的集合中重复。
如果您确实需要深入了解,请获取启用了
:profile
命令的 Vim 版本。 (不是普通的 BIG Windows 版本,而是 Cygwin 附带的版本有它;而且,在大多数发行版下自编译非常容易。)
我发现通过使用
-V
选项启动 Vim 将所有 Vim 活动打印到文件很有帮助:
vim -V12log
这提供了最大详细程度(级别 12)并将其输出到文件
log
。然后,您可以执行一些您知道速度很慢的 Vim 操作,然后查看内部调用了哪些函数/映射。
如果您遇到屏幕更新操作(
^L
、滚动等)缓慢的问题,您的问题可能是语法高亮文件效率低下。您可以通过暂时禁用语法突出显示 (:syn off
) 来测试这一点,并查看问题是否消失;如果您想深入了解详细信息,可以使用 :syntime
: 分析当前语法文件
:syntime on
开始分析。:syntime report
生成报告。报告中首先列出的模式是处理时间最长的模式。一个非常简单的解决方案:找到一个慢速命令。将一个插件移动到某处的临时文件夹。再次尝试该命令。如果仍然很慢,请将另一个插件移至该文件夹。重复,直到找到使命令变慢的插件。 (由于
/tmp/
可能会在重新启动时被删除,请考虑使用不同的临时文件夹。)
如果你使用的是lazy.nvim (https://github.com/folke/lazy.nvim),你可以这样做:
disabled_plugins = { }
-- If there are plugins here, they will be the only enabled ones.
enable_just_these_plugins = { }
plugins = {}
-- This allows us to modify all the plugins before we load them.
local function add(plugin)
if type(plugin) == "string" then
plugin = { plugin }
end
if vim.tbl_contains(disabled_plugins, plugin[1]) then
print('disabling plugin: ' .. plugin[1])
plugin.enabled = false
return
end
if #enable_just_these_plugins == 0 or vim.tbl_contains(enable_just_these_plugins, plugin[1]) then
table.insert(plugins, plugin)
end
end
然后你可以这样做:
add "abeldekat/lazyflex.nvim"
add "SmiteshP/nvim-gps"
-- and so on, and finally:
require("lazy").setup(plugins, lazy_options)
将插件名称添加到
disabled_plugins
或 enable_just_these_plugins
以暂时关闭它们。