现在突然,你的 Vim/Neovim 需要多长时间才能启动?

嗯? VS 代码.... “我不认识这个女孩……”

Vim/Neovim 有--startuptime {log_file},用于测量加载默认插件和启动所需的时间。
如果使用此选项,您可以查看正在加载哪些插件以及启动前需要多少毫秒。

011.502 000.002: --- NVIM 已启动 ---

牟……我得说完​​……

— yasunori-kirin0418@Vim Swamp (@YKirin0418)2022 年 9 月 4 日

最后我可以用011.502 000.002: --- NVIM STARTED --- 启动了。
这个启动时间是没有文件被指定为参数的时候。
在这个前提下,我想在测量启动速度的同时提高启动速度。

不调整启动速度时的启动时间

正如我之前写的,我使用的是 dein.vim,所以我尽可能使用延迟来启动插件。
即便如此,启动时间是150ms到170ms,你可以看到即使它使用延迟启动,它也没有启动速度。
顺便说一句,当我禁用插件加载并测量启动时间时,它在 12 毫秒到 40 毫秒之间启动。
我们将通过各种方式调整启动时间,以接近这个值。

简化 toml 文件的读取方式

首先,有一个地方需要改进自己插件的加载方式。
如何加载 toml 文件很复杂。具体来说,它看起来像这样:

初始化.vim
" plugins toml-file directory.
let s:toml_dir = g:base_dir ..'toml/'
let s:toml_files = systemlist('ls ' .. s:toml_dir .. '*.toml')

" Begin settings
if dein#min#load_state(s:dein_dir)

  " dein inline_vimrcs setting.(今回は省略)

  call dein#begin(s:dein_dir)

  " ================問題のコード==================
  for toml_file in s:toml_files
    if toml_file == s:toml_dir .. 'dein.toml'
      call dein#load_toml(toml_file, {'lazy': 0})
    else
      call dein#load_toml(toml_file, {'lazy': 1})
    endif
  endfor
  "==============================================

  " end settings
  call dein#end()
  call dein#save_state()
endif

如果你在这段代码tomlディレクトリ中放了一个toml文件,不需要特殊定义就可以读取,所以它有以下优点。

  • 通过 toml 文件名分隔插件类型,以便于管理。
  • lsp 相关、denops 相关、ddc/ddu 相关插件等...
  • 即使toml文件增加,也会被无权读取。

其实这部分写完的时候,我还以为自己能写出好代码,但是从启动速度上来说,就是没用的代码了。
顺便说一句,当我有这段代码时,读取init.vim 需要 100 毫秒到 115 毫秒。
所以dein#load_toml(...)写得很扎实,把多个文件分开管理的插件归为lazy.toml

通过此更改,init.vim 的读取可以被抑制到 18 毫秒到 25 毫秒。

禁用默认插件

首先,如果你看如何加快启动时间,你可以通过使用 Lua 插件来解决,但这不是根本的解决方案。
这是我参考的文章:

  • 修改了 Neovim 设置,使启动速度提高了 30 倍

  • 11 + 1 个我不常看到的 Vim 技巧

这些文章展示了如何禁用在 Vim/Neovim 安装期间安装的默认插件的加载。
当加载 Vim/Neovim 插件时,此方法将从 plugin/ 目录中的文件中读取最少的设置。
放置在该目录中的文件包含以下代码,这是礼貌的。

插件.vim
if exists('g:loaded_plugin_name')
    finish
endif
let g:loaded_plugin_name = 1

在内容方面,plugin 总是被读取,所以它只被读取一次。
如果g:loaded_plugin_name 在启动时,插件将终止而不被加载。
这也是在默认插件中,变量名不同,但如果声明变量,加载时间会更短。

最后添加以下设置:

选项.vim
" Disable default plugins {{{
" Fast Startup Settings!!
" Disable TOhtml.
let g:loaded_2html_plugin       = v:true

" Disable archive file open and browse.
let g:loaded_gzip               = v:true
let g:loaded_tar                = v:true
let g:loaded_tarPlugin          = v:true
let g:loaded_zip                = v:true
let g:loaded_zipPlugin          = v:true

" Disable vimball.
let g:loaded_vimball            = v:true
let g:loaded_vimballPlugin      = v:true

" Disable netrw plugins.
let g:loaded_netrw              = v:true
let g:loaded_netrwPlugin        = v:true
let g:loaded_netrwSettings      = v:true
let g:loaded_netrwFileHandlers  = v:true

" Disable `GetLatestVimScript`.
let g:loaded_getscript          = v:true
let g:loaded_getscriptPlugin    = v:true

" Disable other plugins
let g:loaded_man                = v:true
let g:loaded_matchit            = v:true
let g:loaded_matchparen         = v:true
let g:loaded_shada_plugin       = v:true
let g:loaded_spellfile_plugin   = v:true
let g:loaded_tutor_mode_plugin  = v:true
let g:did_install_default_menus = v:true
let g:did_install_syntax_menu   = v:true
let g:skip_loading_mswin        = v:true
let g:did_indent_on             = v:true
let g:did_load_ftplugin         = v:true
let g:loaded_rrhelper           = v:true

" }}}

写作风格因人而异,但我使用v:true 将值放入变量中。
任何truthy 值都可以。这部分留给作者。

文件名仍然没有从启动时消失

引入抑制文件加载的设置后,一下子变成了蛮力的方法,但是有一种方法是先移动要加载的文件,不加载。
前面的设置是即使发生文件读取也立即完成读取的方法。
在这种状态下,即使执行--startuptime {log_file},也会读取无效文件。
我什至想禁用这种轻微的加载,所以我在 Twitter 上喃喃自语是否有办法引用它,我听说 Shougo 正在通过设置将其限制到极限。

我在那里学到的是这里文件。
从内容上看,好像是用 ArchLinux 安装时同时安装的运行时被删除了。
但是,我害怕删除文件,所以我创建了一个单独的目录并将我不想使用的默认插件保存在那里并尝试不加载它们。
以下是您可以用来执行此操作的脚本。

ゔい m_phies_ewa kachoon。嘘
#!/bin/bash
if [ "$EUID" -ne 0 ]; then
  echo "Please run as root."
  exit 1
fi

evacation_dir=/usr/local/share/vimfiles_evacation

etc_nvim_dir=/etc/xdg/nvim/
etc_nvim_evacation_dir=$evacation_dir/etc/xdg/

vim_dir=/usr/share/vim/vimfiles/plugin/
vim_evacation_dir=$evacation_dir/vim/vimfiles/

nvim_dir=/usr/share/nvim
nvim_evacation_dir=$evacation_dir/nvim

nvim_evacation_files=( \
  runtime/plugin/gzip.vim \
  runtime/plugin/health.vim \
  runtime/plugin/man.vim \
  runtime/plugin/matchit.vim \
  runtime/plugin/matchparen.vim \
  runtime/plugin/netrwPlugin.vim \
  runtime/plugin/shada.vim \
  runtime/plugin/spellfile.vim \
  runtime/plugin/tarPlugin.vim \
  runtime/plugin/tohtml.vim \
  runtime/plugin/tutor.vim \
  runtime/plugin/zipPlugin.vim \
  runtime/menu.vim \
  runtime/mswin.vim \
  runtime/ftoff.vim \
  archlinux.vim)

# Check exists evacation directory.
# When not exists make evacation directory.
if [ ! -d $evacation_dir ]; then
  mkdir -p $nvim_evacation_dir/runtime/plugin
  mkdir -p $vim_evacation_dir
  mkdir -p $etc_nvim_evacation_dir
fi

# XDG/nvim evacation directory
if [ -d $etc_nvim_dir ]; then
  mv $etc_nvim_dir $etc_nvim_evacation_dir
fi

# Vim evacation directory
if [ -d $vim_dir ]; then
  mv $vim_dir $vim_evacation_dir
fi

# Neovim evacation file
for vim_file in "${nvim_evacation_files[@]}"; do
  if [ -e ${nvim_dir%/}/${vim_file} ]; then
    mv $nvim_dir/$vim_file $nvim_evacation_dir/$vim_file
  fi
done

上面的脚本复制并保存了/usr/local/share/vimfiles_evacation 下的目录结构,其中放置了启动时加载的文件。
即使由于缺少配置文件而导致加载或启动出现问题,您也可以通过查看保存目标目录找到恢复的位置。
搬家后,我在这个环境下工作,包括工作,但到目前为止我还没有遇到任何麻烦。
注意,这个脚本假定 ArchLinux 环境和目录(如果它是用 pacman 安装的)。
请注意,我并没有假设您是否在 ArchLinux 上自己构建它。

更快的启动时间,同时保留您通常使用的插件

现在,通过到目前为止的设置,我的环境中的总启动时间不到 20 毫秒。
进一步减少启动时间的方法是删除您通常使用的插件。
但是,您将无法使用花哨的配色方案。

请记住,--startuptime 测量文件加载时间,直到它开始。
这种方法可能被称为作弊,但您可以在启动后加载插件。
幸运的是,dein.vim 是一个插件管理器,擅长调整类似的东西,所以尽可能使用延迟启动设置来控制插件何时启动。

Neovim 独有 ~ impatient.nvim & filetype.nvim

此方法仅适用于 Neovim,但它添加了插件以加快插件加载。
不要想,“你在说什么添加插件来加速启动?”
通过正确添加此处介绍的插件,其他插件将加载更快。

  • 更快地加载 Neovim lua 模块以缩短启动时间impatient.nvim

  • 提高filetype.vim的加载时间filetype.nvim

详细解释请在 GitHub 上查看。
还有这些插件这里也有介绍。

想在dein.vim中引入这些插件怎么写

这个答案在我之前的帖子中。是的,它是一个合并 no_lazy 插件目录的功能。
如果我在设置为{'lazy': 0} 的 toml 文件中管理这些插件,它工作正常。

deintoml
[[plugins]]
repo = 'nathom/filetype.nvim'

[[plugins]]
repo = 'lewis6991/impatient.nvim'
hook_add = '''
lua require('impatient')
'''

关于filetype.nvim,看GitHub页面有地方可以设置各种设置,但我体验过没有特别设置的效果。

推送设置 ~ on_eventdepends 在启动后经过一段时间后读取

dein.vim 有多种计时插件方式。
受欢迎的地方是每个文件类型和每个命令执行。
如果详细介绍的话,它是一个多功能的插件管理器,可以再写一篇文章,这里就省略了。
所以这次我将重点关注on_eventdepends,讲解插件启动的控制。

on_event

Vim/Neovim 有各种事件可以用来触发autocmd 命令和函数。
dein.vim 可以在此事件发生时加载插件。那是on_event

您可以在:h autocmd-events-abc 看到这个时间列表。
如果指定在此on_event 启动后发生的事件并加载插件,则不会记录在startuptime 的日志输出中。

对于启动后发生的事件,建议使用以下事件。

事件名称 解释
光标保持 updatetime 期间未执行任何键操作时发生的事件。
默认值为 4 秒不活动。 :h updatetime
光标移动 移动光标时触发的事件。
插入 Enter 进入插入模式时触发的事件。
命令行输入 进入命令模式时发生的事件。

这些事件可以在状态栏插件和配色方案中指定,以显着减少启动时间。

depends

可以指定on_event中引入的事件,加载一个启动时间较长的插件,但是有些插件依赖设置等等。
粗略地指定事件和加载插件很容易,但你无法避免出错的可能性。
depends 可以在这里使用。

在 dein.vim 中,当一个插件在一个指定{'lazy': 1} 的 toml 文件中描述时,除非明确指定插件启动时间,否则它不会启动。
换句话说,您必须在on_* 系统设置中指定开始时间。
使用该规范,depends 可以为另一个插件指定一个依赖插件来启动,而无需指定插件的启动时间。

根据是否可以使用此depends,加载插件的方法范围更广。

可用于缩短启动时间的情况如下。


vim-gitbranchnightfox.nvim 用于设置lightline.vim。 → 将数组添加到dependslightline.vim 的激活时间指定了on_event 中解释的事件组。
nightfox.nvim 需要 nvim-treesitter。 → 为 depends 指定 nvim-treesitter。不要设置启动时间的on_*系统。

例如,上面的设置将是我的环境中设置的引导顺序。
如果设置正确,插件将在启动后按以下流程加载。

CursorHold/CursorMoved/InsertEnter/CmdlineEnter 的任何事件都作为lightline.vim 的激活时间而发生。

nvim-treesitternightfox.nvim & vim-gitbranchlightline.vim

另外,作为与depends类似的设置,有on_source的启动时机。
这会钩住on_source 指定的插件的启动,并加载带有on_source 设置的插件。

这里的区别是很难的,所以请尝试设置各种插件的延迟启动。

最终启动速度和总结

到目前为止,我能够设置,并且我的 Neovim 就像我一开始写的那样启动。
但是,这个启动时间是测量中最快的时间,不可能始终以 11 ms 开始。模糊也以数值形式出现。
通过加快启动时间,我有一种轻微的优越感,我认为在 Vim 活动没有进展的情况下这样做是正确的。
请尝试一下。

另外,正如你们中的一些人可能已经注意到的那样,这篇文章也可以作为对 dein.vim 的评论。
在寻找有用的设置时,我在 GitHub 上使用代码搜索,但是我开始看到设置似乎不太好用,所以我希望这篇文章会有所帮助。。
由于 dein.vim 是一个非常复杂的插件管理器,因此很难 100% 处理它。
就算是写这个的人,还是有看不懂的地方,就参考大家之前设置的代码吧……

谢谢你读到这里。

参考链接


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308626090.html

相关文章:

  • 2021-10-11
  • 2021-11-20
  • 2022-02-20
  • 2021-11-17
  • 2022-01-24
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-19
  • 2021-09-22
  • 2022-12-23
  • 2021-07-30
  • 2021-11-27
  • 2021-10-07
相关资源
相似解决方案