【问题标题】:VIM: dynamic runtimepath per module.vim and slow startupVIM:每个 module.vim 的动态运行时路径和缓慢的启动
【发布时间】:2026-01-25 05:40:02
【问题描述】:

我在 Debian 上使用 VIM 7.1。我有 9 个插件,我通过 Pathogen.vim 加载。加载大约需要 8 秒,这很慢,因为这是在非 GUI/xterm 模式下。我运行 vim -V 它显示每个模块都在多个目录中被搜索。

最初,在 ~/.vim/ 中搜索 ftoff.vim、debian.vim 和其他“系统”相关的 .vim 文件,然后在 /usr/share/vim/vim71/ 中搜索 - 我通过移动我的 . vimrc 到 .vim/vimrc 和:export VIM=/root/.vim,在 .vimrc 我做了一个 set runtimepath=/usr/share/vim/vim71

但是现在,当模块加载时,它们会改变这个运行时路径,而当病原体加载时,情况会更糟。有没有办法为 dirPath 指定模块名称的散列,以避免这种容易出错的查找?或者在 vimrc 中手动指定每个模块的运行时路径?

以下是病原体加载我的模块后的运行时路径示例。显然,任何进一步的模块加载都涉及在找到正确路径之前搜索所有这些路径名。

runtimepath=~/.vim,~/.vim/bundle/Align294,~/.vim/bundle/minibufexpl.vim_-_Elegant_buffer_explorer,~/.vim/bu ndle/The_NERD_Commenter,~/.vim/bundle/The_NERD_tree,~/.vim/bundle/pathogen,~/.vim/bundle/vim-addon-mw-utils, /.vim/bundle/tlib,~/.vim/bundle/snipMate,~/.vim/bundle/SuperTab,~/.vim/bundle/surround,~/.vim/bundle/taglist ~/.vim/bundle/Align294,~/.vim/bundle/minibufexpl.vim_-_Elegant_buffer_explorer,~/.vim/bundle/pathogen,~/.vim bundle/snipMate,~/.vim/bundle/SuperTab,~/.vim/bundle/surround,~/.vim/bundle/taglist,~/.vim/bundle/The_NERD_C mmenter,~/.vim/bundle/The_NERD_tree,~/.vim/bundle/tlib,~/.vim/bundle/vim-addon-manager,~/.vim/bundle/vim-add n-manager-known-repositories,~/.vim/bundle/vim-addon-mw-utils,/var/lib/vim/addons,/usr/share/vim/vimfiles,/u r/share/vim/vim71,/usr/share/vim/vimfiles/after,/var/lib/vim/addons/after,~/.vim/bundle/snipMate/after,~/.vi /after,~/.vim/bundle/snipMate/after

【问题讨论】:

  • 顺便说一句,1)如果你有 vim-addon-manager,为什么还要使用病原体? 2)我不明白第二段。你能把它写得更清楚吗(例如,写一个脚本来处理我的 ~/.vim* 就像你用你的一样)?

标签: vim


【解决方案1】:

我使用 vim-addon-manager 并在 rtp 中有 33 个路径,但启动和立即关闭 vim 大约需要 0.7-0.8 秒(使用 vim -c 'qa!'),所以问题是插件之一或你的系统。要检查加载每个插件需要多长时间,请尝试以下脚本:

vim --cmd 'profile start profile.log' \
    --cmd 'profile func *' \
    --cmd 'profile file *' \
    -c 'profdel func *' \
    -c 'profdel file *' \
    -c 'qa!'

您将在 profile.log 中获得所有计时。具有功能时序的表将是 出现在文件的末尾,要获取每个脚本的时间,请使用以下命令 脚本:

" Open profile.log file in vim first
let timings=[]
g/^SCRIPT/call add(timings, [getline('.')[len('SCRIPT  '):], matchstr(getline(line('.')+1), '^Sourced \zs\d\+')]+map(getline(line('.')+2, line('.')+3), 'matchstr(v:val, ''\d\+\.\d\+$'')'))
enew
call setline('.', ['count total (s)   self (s)  script']+map(copy(timings), 'printf("%5u %9s   %8s  %s", v:val[1], v:val[2], v:val[3], v:val[0])'))

这将打开一个新文件,其中包含与末尾相​​同的表 profile.log,但 1) 用于脚本,而不用于函数,2) 未排序。

如果您的系统有问题,您可以尝试以下方法:

  1. 当计算机启动时,创建一个 ram 磁盘并将其挂载到 ~/.vim,然后将所有插件复制到那里。
  2. 尝试将插件合并到一个文件中,参见:h scriptmanager2#MergePluginFiles()(必须激活vim-addon-manager)
  3. 升级您的计算机
  4. 尝试为 ~/.vim 中的所有插件创建硬链接:

    cd ~/.vim/bundle;for d in *;do cd "$d";for f in **/*.vim;do t="$HOME/.vim/$(dirname "$f")";test -d "$t"||mkdir -p "$t";ln "$f" "$t";done;cd ..;done
    

【讨论】:

    【解决方案2】:

    它可能不相关,但对我来说,变量 DISPLAY 对启动 vim 的时间有很大影响(即使我在没有 gui 的情况下编译了 vim)。 试试

    DISPLAY= vim
    

    DISPLAY=:0 vim
    

    看看你是否注意到了不同。

    【讨论】:

      【解决方案3】:

      http://pastebin.com/R6E4czN7

      我已将 vim -V 的输出粘贴到 pastebin (应该有效期为 1 个月)。这是不言自明的。有数以千计的搜索(414 条搜索行——其中大部分是无用的)。我需要减少错误搜索的次数。

      1297651453.71068:搜索“/root/.vim/bundle/pathogen/autoload/scriptmanager.vim”[J 1297651453.71456:搜索“/root/.vim/bundle/snipMate/autoload/scriptmanager.vim”[J 1297651453.71846:搜索“/root/.vim/bundle/SuperTab/autoload/scriptmanager.vim”[J 1297651453.78737:搜索“/root/.vim/bundle/surround/autoload/scriptmanager.vim”[J 1297651453.79179:搜索“/root/.vim/bundle/taglist/autoload/scriptmanager.vim”[J 1297651453.79684:搜索“/root/.vim/bundle/The_NERD_Commenter/autoload/scriptmanager.vim”[J 1297651453.80756:搜索“/root/.vim/bundle/The_NERD_tree/autoload/scriptmanager.vim”[J 1297651453.83:搜索“/root/.vim/bundle/tlib/autoload/scriptmanager.vim”[J 1297651453.86193:搜索“/root/.vim/bundle/vim-addon-manager/autoload/scriptmanager.vim”[J 1297651453.8662:第 3 行:采购“/root/.vim/bundle/vim-addon-manager/autoload/scriptmanager.vim”[J 1297651453.88259:完成采购/root/.vim/bundle/vim-addon-manager/autoload/scriptmanager.vim[J

      【讨论】:

      • 你是如何记录这些时间的?
      • 您的系统有问题:1) 您通常不应该在 root 下工作,2) 您有 414 次搜索需要 4.5 秒(所有初始化需要 12 秒),但我有 805 次搜索并且正如我所说,vim 仍然在 0.7-0.8 秒内正常加载。我唯一能想到的减少搜索次数的方法是将所有内容都放入 ~/.vim 目录。
      • 嗨,计时:vim -V 1>&2|perl -MTime::HiRes=time -ne '打印时间, ": ", $_' | tee vilog "*.com/questions/1687799/profiling-vim-startup-time" 有点固定:我编辑了 /etc/vim/vimrc 并插入了以下内容:autocmd SourcePre foo.vim set runtimepath=/usr/share/vim/vim71/ source /etc/vim/foo。 vim 在 foo.vim 我有: autocmd SourcePre *vimrc set runtimepath=/usr/share/vim/vim71/ autocmd SourceCmd */indent.vim set runtimepath+=/root/.vim/ 我注意到这个问题的地方是Celeron 400MHz 带 IDE 磁盘 :)
      • 我有一台配备 Celeron 600Hz 的计算机和一个可用作路由器的 IDE 磁盘,但我从未尝试使用那里的所有插件启动 vim。如果我需要一些快速修复,那么我使用最少设置的 vim,如果我需要更多编辑,我要么使用 sshfs,要么将所有内容放在 SCM 下。但除了我上面提出的建议之外,您还可以尝试将所有插件保存在单独的目录中,但在每个插件更新时,递归地创建一个指向它们的硬链接到 ~/.vim(请参阅更新答案中的脚本)。
      • @Paleywiener 你最好使用vim -V 2> >( perl -MTime::HiRes=time -ne 'print time, ": ", $_' | tee vilog ),它将stderr 传送到你的脚本而不会中断stdout。你的版本根本不适合我。