用长行编辑xml文件在vim中确实很慢。 我能做些什么来解决这个问题?

我用vim编辑了很多xml文件。 问题是,由于长行,vim中的导航/编辑非常慢。 有什么我可以做的(除了closures语法高亮/文件types插件和文件types缩进),以便能够编辑这些文件没有任何滞后?

令人沮丧的是,语法高亮等简单的事情被vim处理得如此糟糕。 我不记得这是任何其他编辑的问题。 我真的很喜欢使用vim,我希望有一些方法可以解决这个问题。

问题在于VIM语法突出显示对于长行很慢。 只是稍微降低function的简单解决方法是将语法高亮显示限制在前x列。 在你的.vimrc

 set synmaxcol=120 

现在是2014年,我正在使用Vim 7.4版本。 语法高亮和Long行组合仍然会导致vim的行为慢得令人无法接受。 由于这是Google返回的第一个响应,我想放弃我的“当前”解决scheme。

  • 我发现,加载有问题的文件后,简单地打开和closures语法,可以让vim以可接受的速度运行。 为了方便起见,你可以绑定它

    :syntax off :syntax on

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

  • 我也发现,采购我的.vimrc将产生相同的结果

    :source $MYVIMRC

    和强制性映射: nnoremap <leader>sv :source $MYVIMRC<cr>

EDIt —- 07/31/14

进一步的研究已经导致我用最大的列来限制语法。 这工作得很好,我没有任何问题,因为我已经添加到我的vimrc下面。

 set synmaxcol=250 

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

 :set nocursorline 

应该有帮助。

如何漂亮的打印你的XML文件(如果行长是真正的问题)? 你可以做到这一点,例如使用xmllint ,这是Gnome libxml2包的一部分(还有一个可用于Windows的版本)。

你可以通过执行就地漂亮的打印

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

你有线包装禁用? 在我的经验中,在使用非常长的行时,换行可以减慢vim的速度。

 set nowrap 

我find的最简单和最有效的解决scheme是简单地禁用语法突出显示:
syntax off

这似乎是处理冗长的问题的罪魁祸首。 另外,从我对vim和xml的经验来看,文件的大小似乎并不重要 – 这是导致这些速度变慢的长线。

另一个我发现有用的解决方法是用折叠长行来包装区域:

  <!--{{{ long lines --> <text>A reeealy long line</text> <!--}}}--> 

closures折叠将使vim免于分析这些行的语法。 当然,这种方法并不总是实用的,但是在我只有几行很长的文件,或者它们位于文件的特定区域的情况下,它工作得很好。

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

不。 这是语法突出的想法,AFAIK。 正则expression式Vim使用的并不是最佳的解决scheme,确实是用来编辑xml文件的。

(当然,你总是可以尝试编写你自己的xml语法文件,希望你能做得更好)

有一个插件, LargeFile的工作。 它禁用一些事件,语法高亮,甚至撤消。 你没有提到XML文件的大小,但插件是可configuration的。 您可以以兆字节为单位设置“大文件”的大小,以便可以正常处理“不大的文件”。

我经常用> \ r < – > :s/>\s*</>\r</g来replace>,然后用gg=G重新整个文件。

注释掉该行

 syn sync match xmlSyncDT grouphere xmlDocType +\_.\(<!DOCTYPE\)\@=+ 

在你的xml.vim文件中(用" )。

这种问题可以在vim会话中进行debugging,方法是input:syntime on ,做一些事情来certificate问题的缓慢性,然后:syntime report 。 在我的情况下,它报告xmlSyncDT超过10秒,在我的6MB的XML文件与4000个字符的行,只是为了显示文件的最后一页。 注释掉上面的行不会影响语法突出显示,只要我已经注意到,除了它显示一个屏幕,现在不会超过几分之一秒。

添加到vimrc文件

 nmap <leader>x <Esc>:set filetype=xml<CR>:%s/></>\r</g<CR><ESC>gg=G<Esc>:noh<CR> 

按x将自动相当的xml文件。

这是由vim中的长行parsing造成的。 我终于发现,如果我从.vimrc删除以下内容,问题就解决了:

 filetype indent plugin on 

请注意,如果您input以下内容,则不起作用:filetype indent plugin off使用长行编辑文件时:filetype indent plugin off

你可以通过这个函数来.vimrc来重新格式化你的xml文件,并希望减less行长度。

 function! DoPrettyXML() " save the filetype so we can restore it later let l:origft = &ft set ft= " delete the xml header if it exists. This will " permit us to surround the document with fake tags " without creating invalid xml. 1s/<?xml .*?>//e " insert fake tags around the entire document. " This will permit us to pretty-format excerpts of " XML that may contain multiple top-level elements. 0put ='<PrettyXML>' $put ='</PrettyXML>' silent %!xmllint --format - " xmllint will insert an <?xml?> header. it's easy enough to delete " if you don't want it. " delete the fake tags 2d $d " restore the 'normal' indentation, which is one extra level " too deep due to the extra tags we wrapped around the document. silent %< " back to home 1 " restore the filetype exe "set ft=" . l:origft endfunction command! PrettyXML call DoPrettyXML()