Vim对于.html.erb文件的缩进有问题

5

我正在编辑我的 .html.erb 文件,发现 vim 的缩进行为很奇怪。

<p>
  <strong>Expires On:</strong>
  <%= @item.expires_on %>
</p>

当我在</p>后按下回车键时,为什么会出现这种情况?
<p>
  <strong>Expires On:</strong>
  <%= @item.expires_on %>
  </p>
  _ <= new cursor space 

请注意,我确实使用了 filetype indent on
3个回答

4

Vim默认的HTML缩进不会缩进<p>标签。这意味着,它不仅不会在</p>之后去掉一个缩进级别,而且可能也不会在打开的<p>标签后自动添加一个缩进级别。如果是这种情况,您可以通过设置变量g:html_indent_tags来更改此行为。它应该包含与标签名称匹配的正则表达式。例如:

let g:html_indent_tags = 'p\|li\|nav'

这将为plinav标签添加一个缩进级别。如果你只想针对<p>标签进行设置,只需将其设置为“p”:

let g:html_indent_tags = 'p'

如果vim确实对初始的<p>进行了缩进,那么你的indentkeys选项可能不包含">"字符。你可以通过执行set indentkeys来检查其内容。如果它不包含<>>,你可以在.vim/ftplugin/html.vim中添加它:
setlocal indentkeys+=<<>

编辑:

不幸的是,vim似乎取消了该变量...这对我来说毫无意义,但你可以将该变量分配添加到.vim/after/ftplugin/html.vim中。这应该能解决问题。个人而言,我采取了不同的方法--我复制了默认文件到.vim/indent/html.vim并注释掉了删除变量的行。然而,使用after目录可能是更好的选择。

编辑:

html5插件似乎没有遇到这个问题。安装它可能是一个好主意。否则,g:html_indent_tags变量仍然是去的地方,但最好的地方可能是~/.vim/after/indent/html.vim

let g:html_indent_tags .= '\|p\|nav\|othertags'

请注意使用.=而不是=。这是原地连接。您需要它,因为变量在此时已经存在,您不想删除它。

我在我的 .vimrc 文件中添加了 let g:html_indent_tags = 'p|li|nav',但它没有生效。但是当我在 vim 窗口中实际运行它时,它起作用了。我应该把它放在哪里? - xjq233p_1
嗯,好的,似乎这个解决方案有点问题。我已经更新了我的答案。 - Andrew Radev
我设置了那个变量(并且执行 :let g:html_indent_tags 显示它没有被取消),但仍然无法缩进 <p> 标签或 <li> 标签。 - steve
Vim取消变量的设置,但之后又重新设置它,以将一个类似于我给出的示例的模式分配给它。即使变量存在,它也可能没有正确的值。如果它不以p\|li\|nav开头,则不会缩进这些标记。为了解决这个问题,您可以将默认文件复制到~/.vim/indent/html.vim中,并删除上述提到的unlet。为了使操作更加简便,这是我自己的vimfiles中调整过的文件:https://github.com/AndrewRadev/Vimfiles/blob/master/indent/html.vim。使用此文件,您应该能够将`g:html_indent_tags`设置为您需要的任何内容。 - Andrew Radev
1
您推荐的HTML5插件对我这个HTML5和.erb用户确实非常有用。谢谢! - cseelus
我已经安装了https://github.com/othree/html5.vim,它单独解决了问题。不需要进行其他更改。 - Artur Trzop

1

他拥有一整套有用的 Vim 插件。vim-rails 非常强大;我也使用 vim-rubyvim-bundlervim-sleuthvim-unimpaired - bjnord

0

我通过全能的谷歌找到了这个问题。

为了补充一下Andrew上面说的,对于那些使用OSX的人,你可能想看一眼/Applications/MacVim.app/Contents/Resources/vim/runtime/indent/html.vim,所需的修改应该很明显。

我简直不敢相信我浪费了这么多时间受到缩进不良的<li>标签的困扰!


1
"必要的修改应该变得明显"... 你不能提供一段代码示例吗?我进行了我认为必要的修改,但没有成功。也许是因为我使用了Janus...? " - steve
2
哦,抱歉。你只需要添加 call <SID>HtmlIndentPush('li')call <SID>HtmlIndentPush('p') 等等 :). 但是你必须确保 Janus/Your Vimrc 没有加载不同的 HTML 缩进文件。 - phillmv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接