为什么从 vim 本地访问 X 服务器这么慢?

为什么从 vim 本地访问 X 服务器这么慢?

我遇到了 vim 启动缓慢的问题。我使用 flag--startuptime进行调查,结果如下:

times in msec
 clock   self+sourced   self:  sourced script
 clock   elapsed:              other lines

000.003  000.003: --- VIM STARTING ---
000.082  000.079: Allocated generic buffers
000.103  000.021: locale set
000.112  000.009: GUI prepared
000.115  000.003: clipboard setup
000.119  000.004: window checked
000.496  000.377: inits 1
000.513  000.017: parsing arguments
000.514  000.001: expanding arguments
000.527  000.013: shell init
1000.786  1000.259: xsmp init
1001.055  000.269: Termcap init
1001.108  000.053: inits 2
1001.315  000.207: init highlight
1001.702  000.298  000.298: sourcing /usr/share/vim/vim80/debian.vim
1002.839  000.950  000.950: sourcing /usr/share/vim/vim80/syntax/syncolor.vim
1002.954  001.139  000.189: sourcing /usr/share/vim/vim80/syntax/synload.vim
1013.304  000.029  000.029: sourcing /home/daniel/.vim/ftdetect/tree.vim
1013.520  010.526  010.497: sourcing /usr/share/vim/vim80/filetype.vim
1013.594  011.841  000.176: sourcing /usr/share/vim/vim80/syntax/syntax.vim
1013.642  012.296  000.157: sourcing $VIM/vimrc
1014.184  000.410  000.410: sourcing /usr/share/vim/vim80/debian.vim
1014.724  000.270  000.270: sourcing /home/daniel/.vim/bundle/Vundle.vim/autoload/vundle.vim
1015.021  000.197  000.197: sourcing /home/daniel/.vim/bundle/Vundle.vim/autoload/vundle/config.vim
1015.683  000.015  000.015: sourcing /usr/share/vim/vim80/filetype.vim
1015.782  000.040  000.040: sourcing /usr/share/vim/vim80/ftplugin.vim
1015.875  000.035  000.035: sourcing /usr/share/vim/vim80/indent.vim
1016.281  000.298  000.298: sourcing /usr/share/vim/vim80/syntax/nosyntax.vim
1016.592  000.211  000.211: sourcing /usr/share/vim/vim80/syntax/syncolor.vim
1016.715  000.390  000.179: sourcing /usr/share/vim/vim80/syntax/synload.vim
1016.744  000.796  000.108: sourcing /usr/share/vim/vim80/syntax/syntax.vim
1016.810  000.011  000.011: sourcing /usr/share/vim/vim80/filetype.vim
1016.875  000.009  000.009: sourcing /usr/share/vim/vim80/ftplugin.vim
1016.937  000.009  000.009: sourcing /usr/share/vim/vim80/indent.vim
1017.797  000.567  000.567: sourcing /usr/share/vim/vim80/pack/dist/opt/matchit/plugin/matchit.vim
1017.906  000.013  000.013: sourcing /usr/share/vim/vim80/filetype.vim
1018.017  000.011  000.011: sourcing /usr/share/vim/vim80/ftplugin.vim
1018.085  000.010  000.010: sourcing /usr/share/vim/vim80/indent.vim
1018.539  000.209  000.209: sourcing /usr/share/vim/vim80/syntax/syncolor.vim
1019.006  000.203  000.203: sourcing /usr/share/vim/vim80/syntax/syncolor.vim
1019.385  000.203  000.203: sourcing /usr/share/vim/vim80/syntax/syncolor.vim
1020.619  002.482  001.867: sourcing /home/daniel/.vim/colors/minimalist.vim
1020.903  000.207  000.207: sourcing /home/daniel/.vim/autoload/camelcasemotion.vim
1021.384  007.678  002.596: sourcing ~/.vim/vimrc
1021.387  000.098: sourcing vimrc file(s)
1022.101  000.586  000.586: sourcing /home/daniel/.vim/plugin/camelcasemotion.vim
1022.503  000.221  000.221: sourcing /home/daniel/.vim/autoload/ctrlp/mrufiles.vim
1022.753  000.632  000.411: sourcing /home/daniel/.vim/plugin/ctrlp.vim
1023.103  000.273  000.273: sourcing /home/daniel/.vim/bundle/tabular/plugin/Tabular.vim
1023.450  000.090  000.090: sourcing /usr/share/vim/vim80/plugin/getscriptPlugin.vim
1023.712  000.247  000.247: sourcing /usr/share/vim/vim80/plugin/gzip.vim
1023.994  000.268  000.268: sourcing /usr/share/vim/vim80/plugin/logiPat.vim
1024.023  000.013  000.013: sourcing /usr/share/vim/vim80/plugin/manpager.vim
1024.263  000.229  000.229: sourcing /usr/share/vim/vim80/plugin/matchparen.vim
1024.941  000.662  000.662: sourcing /usr/share/vim/vim80/plugin/netrwPlugin.vim
1025.013  000.043  000.043: sourcing /usr/share/vim/vim80/plugin/rrhelper.vim
1025.066  000.033  000.033: sourcing /usr/share/vim/vim80/plugin/spellfile.vim
1025.286  000.202  000.202: sourcing /usr/share/vim/vim80/plugin/tarPlugin.vim
1025.408  000.098  000.098: sourcing /usr/share/vim/vim80/plugin/tohtml.vim
1025.658  000.231  000.231: sourcing /usr/share/vim/vim80/plugin/vimballPlugin.vim
1025.937  000.246  000.246: sourcing /usr/share/vim/vim80/plugin/zipPlugin.vim
1026.087  000.026  000.026: sourcing /usr/share/vim/vim80/pack/dist/opt/matchit/plugin/matchit.vim
1026.105  000.839: loading plugins
1026.146  000.041: loading packages
1026.676  000.274  000.274: sourcing /home/daniel/.vim/bundle/tabular/autoload/tabular.vim
1028.950  002.703  002.429: sourcing /home/daniel/.vim/bundle/tabular/after/plugin/TabularMaps.vim
1028.955  000.106: loading after plugins
1029.433  000.478: inits 3
1029.736  000.303: reading viminfo
1031.466  001.730: setup clipboard
1031.483  000.017: setting raw mode
1031.490  000.007: start termcap
1031.510  000.020: clearing screen
1031.954  000.444: opening buffers
1032.050  000.096: BufEnter autocommands
1032.052  000.002: editing files in windows
1032.146  000.094: VimEnter autocommands
1032.148  000.002: before starting main loop
1033.609  001.461: first screen update
1033.613  000.004: --- VIM STARTED ---

有问题的行显然是1000.786 1000.259: xsmp init,我相信这表明 vim 正在连接到 X 服务器。

谷歌搜索表明,解决这个问题的唯一方法是重新编译而不使用xclip。但人们总是使用系统剪贴板,而这种缓慢连接引起的大多数问题似乎与远程使用 vim 有关,而我并没有这样做。延迟如此接近一秒的事实也让我怀疑有些愚蠢的事情可能很容易解决。

那么,我该怎么做才能调查 X 在这里初始化的速度有多慢?

额外信息:当我通过 gnome-terminal 和简单终端运行带有 bash 的 vim 时遇到了这个问题。

答案1

在窗口管理器合成器使我的 Xorg 会话(或至少是我的窗口管理器)崩溃后,我遇到了同样的问题,在此过程中将我的所有应用程序踢出。在我的新 Xorg 会话中,我打开了一个新终端并重新连接到我现有的 tmux(2.8)会话,但注意到我现在在启动 Vim 时有延迟,在“xsmp init”中恰好有一秒钟,只有在通过 tmux 使用 Vim 时才会出现这种情况。这一秒是如此完美,以至于我怀疑这是超时,可能是由于 tmux 尝试连接到我之前的 Xorg 实例。

对我有用的是:我完全退出了 tmux 会话,确认没有 tmux 进程仍在运行,然后我启动了一个新的 tmux 会话。延迟消失了!

所以我猜测 tmux 存在 Xorg 会话消失的问题。

答案2

vim-gtk3我在 Ubuntu 上的 Xmonad 上运行 Vim(包中的常规 vim)时遇到了类似的问题。

添加以下内容即可.xprofile解决:

export SESSION_MANAGER=

这样做可以保留 Vim 的 X-clipboard 功能(使用寄存器复制/粘贴"),同时消除启动时的 1 秒延迟。

这个答案从何而来?通过查看 Vim 的源代码,我确实确认它尝试建立某种连接,在 1 秒后超时。挖掘协议后,xsmp我发现为此指定的环境变量是SESSION_MANAGER,检查它后,我确认它指向的可能是我的情况中已死的东西(我发行版中的“其他”窗口管理器)

我怀疑当周围环境重新启动时,Tmux 内部的会话也会发生同样的情况。

相关内容