【问题标题】:Vim - Inserting Newlines in Python is Extremely SlowVim - 在 Python 中插入换行非常慢
【发布时间】:2019-11-17 10:00:00
【问题描述】:

由于某种原因,当我在 vim 中插入换行符时(使用 o 键或回车键),vim 实际插入新行需要相当长的时间。 当我按住 enter 键时,这个问题会更加严重——在这种情况下,vim 完全冻结,并且需要大约 3-4 秒来呈现所有新行。 这个问题似乎是 Python 文件特有的,因为我已经用其他大型非 Python 文件测试过这种行为,但没有看到这个问题。

一些减速是由 vim-polyglot 语言包引起的,但禁用该插件只会稍微帮助减速,而不是完全消除它。 使用vim -u NORC 打开文件也没有多大帮助,我最终能够顺利插入换行符的唯一方法是使用vim -u NONEsyntax off,这让我相信这是语法高亮问题。

这是只需按住 Enter 键几秒钟的同步时间报告(-u NORC:

  TOTAL      COUNT  MATCH   SLOWEST     AVERAGE   NAME               PATTERN
  0.467286   11548  0       0.000109    0.000040  pythonMatrixMultiply ^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*
  0.404281   12396  968     0.000109    0.000033  pythonNumber       \%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>
  0.376318   11548  0       0.000085    0.000033  pythonString       [uU]\=\z('''\|"""\)
  0.340580   11548  0       0.000222    0.000029  pythonMatrixMultiply \%(\w\|[])]\)\s*@
  0.263625   14333  5095    0.000063    0.000018  pythonString       [uU]\=\z(['"]\)
  0.250727   11548  0       0.000058    0.000022  pythonRawString    [uU]\=[rR]\z('''\|"""\)
  0.241550   11548  0       0.000061    0.000021  pythonRawString    [uU]\=[rR]\z(['"]\)
  0.229741   21954  13645   0.000047    0.000010  pythonNumber       \<\%([1-9]\d*\|0\)[Ll]\=\>
  0.228875   11548  0       0.000392    0.000020  pythonNumber       \<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@=
  0.202706   11548  0       0.000050    0.000018  pythonMatrixMultiply [^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@
  0.175705   11548  0       0.000040    0.000015  pythonNumber       \<\d\+[eE][+-]\=\d\+[jJ]\=\>
  0.171692   11548  0       0.000047    0.000015  pythonNumber       \<\d\+[jJ]\>
  0.059275   24104  16355   0.000032    0.000002  pythonAttribute    \.\h\w*
  0.047092   11660  2977    0.000035    0.000004  pythonComment      #.*$
  0.021249   4826   4826    0.000020    0.000004  pythonString       \z1
  0.008962   11548  0       0.000015    0.000001  pythonNumber       \<0[xX]\x\+[Ll]\=\>
  0.008958   11548  0       0.000015    0.000001  pythonNumber       \<0[oO]\=\o\+[Ll]\=\>
  0.008755   11548  0       0.000004    0.000001  pythonNumber       \<0[bB][01]\+[Ll]\=\>
  0.004358   11548  952     0.000016    0.000000  pythonEscape       \\$
  0.003670   11484  0       0.000017    0.000000  pythonDecoratorName @\s*\h\%(\w\|\.\)*
  0.001265   4760   0       0.000001    0.000000  pythonEscape       \\N{\a\+\%(\s\a\+\)*}
  0.001153   4826   0       0.000001    0.000000  pythonString       \\\\\|\\\z1
  0.001129   4760   0       0.000001    0.000000  pythonEscape       \%(\\u\x\{4}\|\\U\x\{8}\)
  0.001116   4760   0       0.000001    0.000000  pythonEscape       \\[abfnrtv'"\\]
  0.001098   4760   0       0.000001    0.000000  pythonEscape       \\\o\{1,3}
  0.001072   4760   0       0.000001    0.000000  pythonEscape       \\x\x\{2}
  0.000749   3104   0       0.000001    0.000000  pythonDecorator    @
  0.000700   3119   0       0.000001    0.000000  pythonDoctestValue ^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\+
  0.000601   3119   0       0.000010    0.000000  pythonDoctest      ^\s*>>>\s
  0.000068   62     0       0.000007    0.000001  pythonSync         ^\%(def\|class\)\s\+\h\w*\s*[(:]

  3.524359   288911

我不完全确定为什么有这么多正则表达式被匹配,因为我唯一要做的就是插入新行。此外,大多数这些正则表达式,例如 pythonMatrixMultiply,甚至都不匹配任何东西。 任何帮助,将不胜感激。 作为参考,这是我的 vim 和 neovim 版本(我主要使用 neovim,但这个问题也发生在 vim 中)。

NVIM v0.3.1
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Jun 07 2019 11:40:34)

【问题讨论】:

标签: vim neovim


【解决方案1】:

由于-u NORC 保持插件可用,而-u NONE 关闭所有插件,因此似乎是插件导致了您的问题。进一步的侦探工作将涉及逐步添加插件,直到您发现罪魁祸首。

在 Neovim 的上下文中,您还可以运行 :checkhealth,这有时会显示 Python2 和 Python3 提供程序的问题。

最后,您可能还会发现this answer about Vim profiling 很有帮助。

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 2013-11-01
    • 2017-11-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    相关资源
    最近更新 更多