在vim中编辑具有长行的xml文件非常缓慢。我应该怎么办才能解决这个问题?

50

我用vim编辑很多xml文件。问题在于,由于行太长,vim中的导航/编辑非常缓慢。除了关闭语法高亮/文件类型插件和文件类型缩进之外,我能做些什么来编辑这些文件而不会出现所有的卡顿?

真的很令人沮丧,像语法高亮这样微不足道的事情,vim处理得如此糟糕。我不记得其他任何编辑器都有这个问题。我真的喜欢使用vim,希望有一种方法来解决这个问题。


这个问题涉及到为什么Vim在大多数情况下都很慢!我花了一段时间才“猜测”出来,原因是长行导致的问题! - Andriy Drozdyuk
只是好奇,从当前的角度来看,这个问题是否不在话题范围内? - Gqqnbig
链接:https://superuser.com/questions/302186/vim-scrolls-very-slowly-when-a-line-is-too-long - Ciro Santilli OurBigBook.com
13个回答

61

问题是VIM对于长行的语法高亮处理较慢。一种简单的解决方法是将语法高亮限制在前x列中,以轻微降低功能为代价。可以在.vimrc文件中添加以下内容:

set synmaxcol=120

+1 因为如何在多行上漂亮地打印具有许多属性的 XML 元素并不是一件直截了当的事情。 - Reimund
这并不能彻底解决我的缓慢问题,但却有助于使速度更快。好的提示! - Hassek
由于某些原因,设置这个仍然很慢。下面@BenJamin建议的:syntax off起作用了。 - David

13

现在是2014年,我使用的是Vim版本7.4。 语法高亮和长行组合仍然会导致vim表现不可接受的缓慢。 由于这是从Google返回的第一个响应,我想放弃我的“当前”解决方案。

  • 我发现只需在加载有问题的文件后简单地切换语法开关即可使vim以可接受的速度运行。 为方便起见,您可以将其绑定

    :syntax off :syntax on

    或绑定:nnoremap <leader>ts :syntax off<cr>:syntax on<cr>

  • 我还发现,源化我的.vimrc也会产生同样的结果

    :source $MYVIMRC

    和必要的映射:nnoremap <leader>sv :source $MYVIMRC<cr>

编辑----07/31/14

进一步探索导致我限制了最大列的语法。 这很有效,自从我将以下内容添加到我的vimrc以来,我就没有遇到任何问题。

set synmaxcol=250

这慷慨地将语法限制在前250列。


1
如果您想在长行中保持高亮显示,语法切换技巧非常棒。 - Bryan Head
1
“:syntax off” 是我让 vim 在处理特定文件时变快的唯一方法。即使使用了 “synmaxcol”,也没有什么帮助。 - David

10
:set nocursorline

应该会有所帮助。


8

你是否禁用了自动换行?在我个人的经验中,当处理非常长的行时,禁用自动换行会使 vim 速度变慢。

set nowrap

7

如果行长是真正的问题,那么对您的XML文件进行漂亮打印怎么样?您可以使用Gnome libxml2软件包中的xmllint来完成这个任务(Windows也有可用版本)。

您可以通过执行以下命令在原地进行漂亮打印:

xmllint --format -o xmlFile.xml xmlFile.xml

这确实很有用,但当有大量属性使一行变长时并没有帮助... - naumcho
@naumcho:使用xmllint可能不太可能实现,但您可以编写自己的漂亮打印程序,该程序还会将属性放在新行上。 - Dirk Vollmar

4
我发现最简单和最有效的解决方案是禁用语法高亮:
syntax off 当处理长行时,这似乎是罪魁祸首。另外,根据我在vim和xml上的经验,文件大小似乎并不重要,而是长行导致了这些减速。
我发现的另一个有用的解决方法是将长行区域包裹在折叠中。 (参考链接)
  <!--{{{ long lines -->
  <text>A reeealy long line</text>
  <!--}}}-->

关闭折叠可以使vim不必分析这些行的语法。当然,这种方法并不总是实用的,但在我只有少量长行或它们位于文件的特定区域时效果非常好。

通常情况下,Vim仍然明显较慢,但大多数情况下性能是可以接受的。


4

不是的。据我所知,这是语法高亮的问题。Vim使用的正则表达式方法并不是编辑XML文件的最佳解决方案。

当然,你可以尝试编写自己的XML语法文件,希望你能做得更好。


2

有一个插件叫做LargeFile,可以用来处理这个任务。它会禁用一些事件、语法高亮甚至撤销功能。你没有提到XML文件的大小,但是这个插件是可配置的。你可以设置一个以兆字节为单位的“大文件”大小,这样“非大文件”就可以正常处理了。


1
注释掉这行代码。
syn sync match xmlSyncDT grouphere  xmlDocType +\_.\(<!DOCTYPE\)\@=+

在您的xml.vim文件中(带有"),可以通过在vim会话中键入:syntime on,执行显示缓慢的操作,然后键入:syntime report来调试此类问题。在我的情况下,它报告说在我6MB的xml文件中,4000个字符一行,仅显示文件的最后一页就需要超过10秒钟的xmlSyncDT。尽管我注意到注释掉上面的行并没有影响语法高亮,但现在屏幕显示所需的时间从未超过一秒钟。

1

我经常使用 :s/>\s*</>\r</g 命令将 >< 替换为 >\r<,然后用 gg=G 命令重新缩进整个文件。


也许问题出在缩进上。我记不起来在编辑非缩进的SGML文件时有这些减速现象。我会尝试去掉缩进,看看是否有所帮助。 - random

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接