【问题标题】:Vim auto-indenting xml strangelyVim 奇怪地自动缩进 xml
【发布时间】:2021-05-28 22:54:21
【问题描述】:

在 vim (neovim) 中,当属性放在自己的行时,XML 代码会奇怪地缩进,如下所示:

<test
    first="text"
    second="more text"
    third="last">
<foo
    a="a"
    b="b">
<bar />
</foo>
</test>

当我期望和渴望时:

<test
    first="text"
    second="more text"
    third="last">
    <foo
        a="a"
        b="b">
        <bar />
    </foo>
</test>

这对我来说就像一个错误。我找不到解决这个问题的插件。也许我可以在我的 init.vim 中添加一些东西来纠正这种行为?

编辑: 下面的补丁几乎解决了这个问题,但不能正确处理以下情况:

<test
    first="text"
    second="more text"
    third="last">
    <foobar>
    </foobar>
    <foobar>
    </foobar>
</test>

编辑 2: 删除第 90 行上的 + shiftwidth() 可以解决除这种情况之外的所有问题:

<test
    first="text">
    <foobar>
    </foobar>
</test>

&lt;foobar&gt; 应该像上图那样缩进,因为跨越前两行的标签是一个开始标签,表示接下来的行应该缩进。

编辑 3:出于某种原因,&lt;foo 在补丁中缩进了两次。预期:

<test>
    <foo
        a="a">
    </foo>
</test>

我知道正则表达式足以使用它,但 vim 脚本让这很棘手。

编辑 4: 预期输出应该是:

<test>
    <foo
        a="a" />
    <foobar
        a="a" >
        <test>
        </test>
    </foobar>
</test>

/&gt; 不应缩进下一行。

【问题讨论】:

    标签: xml vim indentation neovim


    【解决方案1】:

    我对 XML 的了解不够,无法确定它是否是预期的行为,也无法进行适当的测试,所以我不知道我的解决方案是否是最好的。

    但如果您怀疑这是一个错误,那么最好的做法是在 XML 运行时文件的官方 GitHub 存储库上报告1chrisbra/vim-xml-runtime


    通过应用此补丁2,我设法获得了您预期的结果:

    @@ -81,11 +81,16 @@
     endfun
    
     " [-- return the sum of indents of a:lnum --]
    -fun! <SID>XmlIndentSum(line, style, add)
    +fun! <SID>XmlIndentSum(line, style, add, ...)
         if <SID>IsXMLContinuation(a:line) && a:style == 0 && !<SID>IsXMLEmptyClosingTag(a:line)
             " no complete tag, add one additional indent level
             " but only for the current line
             return a:add + shiftwidth()
    +    elseif a:0 && a:line =~ '^\s*<[^/]' && a:1 =~ '^\s*<[^/]' && a:1 !~ '>\s*$'
    +                \ && getline(prevnonblank(a:2-1)) !~ '/\s*>\s*$'
    +        return a:add + shiftwidth()
    +    elseif a:0 && a:line =~ '^\s*</' && a:1 =~ '^\s*<' && a:1 !~ '>\s*$'
    +        return a:add
         elseif <SID>HasNoTagEnd(a:line)
             " no complete tag, return initial indent
             return a:add
    @@ -156,7 +161,7 @@
         " Get indent from previous tag line
         let ind = <SID>XmlIndentSum(pline, -1, pind)
         " Determine indent from current line
    -    let ind = <SID>XmlIndentSum(curline, 0, ind)
    +    let ind = <SID>XmlIndentSum(curline, 0, ind, pline, a:lnum)
         return ind
     endfun
    

    只需将indent file 复制到~/.vim/indent/xml.vim 3 并应用更改。


    1您可以在问题中链接此答案
    2这只是一个临时破解的质量
    3 如果是 Neovim,我相信是 $XDG_CONFIG_HOME/nvim/indent/xml.vim

    【讨论】:

    • 这恰恰指向了正确的方向。该补丁几乎可以满足我的要求,但是当添加一个新的开始标签时,它会给出一个额外的缩进,而当添加一个结束标签时,它会减去一个额外的缩进。我将在上面编辑我的问题以进行说明。
    • @Christian 现在呢?
    • 如果我只删除你的+ shiftwidth(),这似乎满足除了一个之外的所有情况。很近!我在上面进行了第二次编辑。感谢您在这方面的帮助!
    • @Christian 我不明白?当我测试第三个示例时,我得到了与预期相同的结果。如果你删除了+ shiftwidth(),所有其他的例子都应该被破坏,因为这是这个补丁的核心部分。
    • 这很奇怪。我在常规 vim 上安装并测试了它,+ shiftwidth() 缩进了两次而不是一次...
    猜你喜欢
    • 2013-05-14
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2011-04-25
    相关资源
    最近更新 更多