【问题标题】:Editing xml files with long lines is really slow in vim. What can I do to fix this?在 vim 中编辑长行的 xml 文件真的很慢。我能做些什么来解决这个问题?
【发布时间】:2009-05-23 10:59:17
【问题描述】:

我用 vim 编辑了很多 xml 文件。问题是,由于行长,vim 中的导航/编辑非常慢。我可以做些什么(除了关闭语法突出显示/文件类型插件和文件类型缩进)来编辑这些文件而不会出现所有延迟?

vim 对语法高亮等琐碎的事情处理得如此糟糕,这真是令人沮丧。我不记得这是任何其他编辑器的问题。我真的很喜欢使用 vim,我希望有办法解决这个问题。

【问题讨论】:

  • 这个问题涉及到为什么 Vim 在大多数情况下通常都很慢!我花了一段时间才“猜测”出问题的原因是排长队!
  • 只是好奇,从目前的角度来看,这个问题离题了吗?

标签: xml vim performance


【解决方案1】:

问题是 VIM 语法高亮对于长行来说很慢。一个只会稍微降低功能的简单解决方法是将语法突出显示限制为前 x 列。在你的.vimrc 中有这样的东西:

set synmaxcol=120

【讨论】:

  • +1 因为如何在多行上漂亮地打印具有大量属性的 xml 元素并不简单。
  • 不能解决我的慢问题,但会导致不慢嘿。好建议!
  • 由于某种原因设置它仍然很慢。 @BenJamin 下面建议的:syntax off 有效。
【解决方案2】:

现在是 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>

编辑 ---- 2014 年 7 月 31 日

进一步的探索使我将语法限制为最大列。这工作得很好,自从我将以下内容添加到我的 vimrc 以来,我没有遇到任何问题。

set synmaxcol=250

这大大限制了前 250 列的语法。

【讨论】:

  • 如果您想在长行中保持高亮显示,语法切换技巧非常棒。
  • :syntax off 是我可以为我的特定文件快速制作 vim 的唯一方法。 synmaxcol 没有太大帮助,如果有的话。
【解决方案3】:

您是否禁用了换行?根据我的经验,在处理很长的行时,换行会降低 vim 的速度。

set nowrap

【讨论】:

    【解决方案4】:

    不。这是语法高亮认为,AFAIK。 Vim 使用的正则表达式方法实际上并不是编辑 xml 文件的最佳解决方案。

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

    【讨论】:

      【解决方案5】:
      :set nocursorline
      

      应该有帮助。

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • 这确实很有用,但当有大量属性使线路变长时无济于事......
        • @naumcho:使用 xmllint 可能无法实现,但您可以编写自己的漂亮打印机,它也会将属性放在新行上。
        【解决方案7】:

        我发现的最简单和最有效的解决方案是简单地禁用语法突出显示:
        syntax off

        这似乎是处理长行时的罪魁祸首。此外,根据我使用 vim 和 xml 的经验,文件的大小似乎并不重要 - 导致这些速度变慢的是长行。

        我发现另一个有用的解决方法是在folds 中用长线包裹区域:

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

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

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            我经常用 >\r :s/&gt;\s*&lt;/&gt;\r&lt;/g 替换 >gg=G 重新缩进整个文件。

            【讨论】:

            • 可能问题出在缩进上。我不记得在编辑非缩进的 SGML 文件时有这些减速。我会尝试删除缩进,看看是否有帮助。
            【解决方案10】:

            注释掉一行

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

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

            可以在 vim 会话中调试此类问题,方法是键入 :syntime on,执行一些显示关注缓慢的操作,然后键入 :syntime report。在我的情况下,它报告xmlSyncDT 在我的 6MB xml 文件中花费了 10 秒以上,其中包含 4000 个字符的行,只是为了显示文件的最后一页。据我所知,注释掉上面的行并没有影响语法突出显示,只是现在显示屏幕的时间不会超过几分之一秒。

            【讨论】:

              【解决方案11】:

              添加到vimrc文件

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

              然后按 x 将自动漂亮地打印 xml 文件。

              【讨论】:

                【解决方案12】:

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

                filetype indent plugin on
                

                请注意,如果在编辑长行文件时输入:filetype indent plugin off 将不起作用。

                【讨论】:

                  【解决方案13】:

                  您可以将此函数添加到您的 .vimrc 以重新格式化您的 xml 文件并希望减少行长。

                  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()
                  

                  【讨论】:

                    猜你喜欢
                    • 2022-11-30
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-05-07
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-04-19
                    • 2020-09-12
                    相关资源
                    最近更新 更多