【问题标题】:Getting Vim to recognize XML让 Vim 识别 XML
【发布时间】:2026-01-31 05:35:01
【问题描述】:

我希望 Vim 帮助我缩进我的 XML 文件,就像我的 C 代码一样。但是,当我使用

gg=G

它只是将所有内容都设置在左侧。我需要指定语法吗? XML 是否被识别为一种语言?

【问题讨论】:

    标签: xml vim indentation vi


    【解决方案1】:

    filetype plugin indent on
    

    .vimrc 中让 Vim 自动将 .xml 文件识别为 xml。你可能需要把

    set nocompatible
    

    在那之前。

    如果文件扩展名不是.xml,你可以通过使用使Vim像xml一样威胁它

    :set filetype=xml
    

    在你这样做之后,Vim 的自动缩进(和语法高亮,和全能(在 xml 中只是关闭标签,但这仍然是一些东西))将在 xml 中正常工作。

    【讨论】:

    • 在兼容模式下运行 Vim 就像运行旧的 vi... 这是兼容模式的重点,但遗憾的是这是默认模式。
    • 如果您在 javaFX 中编辑 FXML,:set filetype=xml 命令会为您的文件带来有福的语法着色。甜!
    【解决方案2】:

    是的,:set syntax=xml 应该可以工作。在 vim 7.3 中,这设置为 :set indentexpr=XmlIndentGet(v:lnum,1)

    如果你有一个单行文件,你可能需要:%s/\(<[^>]*>\)/\1\r/g,在每个标签后插入换行符(或以不同方式拆分)。

    那么,gg=G 应该可以工作了。

    【讨论】:

    • 我正在运行一个相当旧版本的 Fedora Core :( 卡在 vim 7.2 中,所以我没有自动缩进。
    • @IslandCow 我认为这并不重要。如果您没有 XmlIndentGet 函数,您只需要从 vim-7.3 运行时获取 indent/xml.vim 即可。我在这个文件中没有看到任何 vim-7.3 特定的内容。
    • XML 语法似乎在 Windows 的 7.2 中运行良好。作为用户,您不必担心 indentexpr,只要语法设置正确就可以了。 (虽然你也可以试试:set filetype=xml。)
    • 对于单个行拆分的更简单的命令,我使用: :s/>/>\r/g 即为每个 >(xml 结束标记) a >(xml end标记)带有换行符(>\r)(g 代表全局(在行中))。这将在每个已经有一个新行但快速且易于记忆的结束标记之后留下一个新行。
    • 我不希望在每个标签之后都有换行符,只需要 CLOSING 标签。调整正则表达式::%s/\(<\/[^>]*>\)/\1\r/g
    【解决方案3】:

    将此行添加到您的 .vimrc 文件中:

    :map <Space>fx :%s/\ </\r</g<cr>:%s/\ android/\randroid/g<cr>:g/^$/d<cr>gg=G`
    

    格式化点击space fx

    【讨论】: