我该如何修复他那些混乱的大型HTML文件的缩进?
我尝试了通常用来修复代码文件缩进的"gg=G
命令,但是它似乎在HTML文件上无法正常工作。它只是移除了所有格式。
我还尝试设置:filetype = xml
,看看是否欺骗它认为这是一个XML文件会有所帮助,但它仍然没有解决问题。
我该如何修复他那些混乱的大型HTML文件的缩进?
我尝试了通常用来修复代码文件缩进的"gg=G
命令,但是它似乎在HTML文件上无法正常工作。它只是移除了所有格式。
我还尝试设置:filetype = xml
,看看是否欺骗它认为这是一个XML文件会有所帮助,但它仍然没有解决问题。
有几件事情都需要做到位。为了将它们总结在一个位置:
设置以下选项:
:filetype indent on
:set filetype=html # abbrev - :set ft=html
:set smartindent # abbrev - :set si
然后,要么将光标移动到文件的顶部并向结尾缩进:gg
=G
要么选择要缩进的文本,然后按下=来进行缩进。
在我的.vimrc
文件中添加filetype indent on
后,Vim会很好地对HTML文件进行缩进。
以shiftwidth
为2的简单示例:
<html>
<body>
<p>
text
</p>
</body>
</html>
使用智能缩进的主要问题是,如果XML(或HTML)位于一行上,它可能会从curl请求中返回,那么 gg = G
将不起作用。相反,我刚刚通过直接从VI调用整洁来获得良好的缩进体验:
:!tidy -mi -xml -wrap 0 %
这基本上告诉VI调用Tidy来清理一个XML文件,不将行包装到默认的68个字符宽度线上。我处理了一个29MB的大型XML文件,需要5或6秒钟。我猜对于一个HTML文件,命令应该是:
:!tidy -mi -html -wrap 0 %
正如评论中所提到的,tidy
是一种基本工具,您可以在许多基础的Linux/MacOS系统上找到它。如果您需要它但没有它,请访问该项目页面:HTML Tidy。
tidy
随标准的类Unix操作系统一起发布。我在Mac上成功尝试了这个答案,而且以前从未听说过 tidy
。 - Raman Shah正如tylerl在上面所解释的那样,请设置以下内容:
:filetype indent on
:set filetype=html
:set smartindent
然而,请注意,在vim 7.4中,默认情况下不缩进HTML标签html
,head
,body
等一些其他标签。这是有道理的,因为几乎所有HTML文件中的内容都属于这些标签。如果你真的想要,你可以像这样缩进这些标签::let g:html_indent_inctags = "html,body,head,tbody"
请参考"HTML indenting not working in compiled Vim 7.4, any ideas?"和"alternative html indent script"以获取更多信息。
由于我所有的HTML都在一行中,所以这些答案对我都没有用。
基本上,您需要首先使用以下命令将每行代码分开,该命令将><
替换为相同字符但在中间插入换行符。
:%s/></>\r</g
然后是命令
gg=G
将缩进文件。
这是我的解决方案,可以很好地打开“丑陋”的HTML,并以漂亮的间距方式呈现:
vim fileIn.html -c "set sw=2 | %s/>/>\r/ | execute 'normal gg=G' | set nohlsearch | g/^\\s*\$/d"
sw
命令是因为我的默认缩进为4,这对于HTML来说太高了。>
) 后面添加一个新行(Vim 认为它是回车符,叹气)。=
重新缩进整个文件。>
(因为我在我的 vimrc 中设置了 set hlsearch
)。如果您不想进入 Vim,只是清理文件,则甚至可以在结尾添加 | wq! fileOut.html
。
:%s/>\s*/>\r/g
(添加了一个 g
以进行全局替换,并添加了 \s*
以去除尾随空格)。我还添加了 :%s/</\r</g
以在开括号前添加换行符。否则像 <td>foo</td>
这样的标签将被分割成 <td>
和 foo</td>
。 - wisbucky:call HtmlBeautify()
这里有一个重量级的解决方案,它可以让你进行缩进,以及所有你在编辑过程中不需要关心的HTML格式化。
首先,下载 Tidy。确保将二进制文件添加到您的路径中,这样您就可以从任何位置调用它。
接下来,创建一个描述你最喜欢的HTML风格的配置文件。虽然Tidy的文档并不是很好,但这里有一个概述和所有选项的列表。以下是我的配置文件:
bare: yes
break-before-br: no
clean: yes
drop-proprietary-attributes: yes
fix-uri: yes
indent-spaces: 4
indent: yes
logical-emphasis: yes
markup: yes
output-xhtml: yes
quiet: yes
quote-marks: yes
replace-color: yes
tab-size: 4
uppercase-tags: no
vertical-space: yes
word-2000: yes
wrap: 0
将此内容保存为 tidyrc_html.txt
,放在你的 ftplugin
文件夹下(vimfiles文件夹内)。
再添加一个文件:将以下行添加到(或者创建)html.vim
,同样放在 ftplugin
文件夹下。
map <leader>tidy :%! tidy -config ~/vimfiles/ftplugin/tidyrc_html.txt <CR>
/tidy
。(那个/
是<leader>
键。)你尝试过在Vim网站上使用HTML缩进脚本吗?
/usr/share/vim/vim74/indent/html.vim
)。"2014年7月4日:Vim 7.4.356或更高版本包含了这个脚本的一个后代(官方脚本现在由Bram维护,并包含了大量的改变)"。 - wisbucky
vim 7.4
中,默认的缩进设置将失败,因为html
,body
和p
默认情况下不会缩进。请参见此答案。 - Cory Kleinsmartindent
不是必需的。而且它是针对 C 和 C++ 调整的,我更喜欢使用更通用的autoindent
。 - Kos:set smartindent
命令与1G
v
G
$
=
(跳转到第一行,进入可视模式,跳转到最后一行,跳转到最后一行的末尾,智能缩进)相结合时效果很好。这将选择所有文本然后进行缩进。 - connorbode