【问题标题】:HTML indenting not working in compiled Vim 7.4, any ideas?HTML缩进在编译的Vim 7.4中不起作用,有什么想法吗?
【发布时间】:2013-10-19 20:33:24
【问题描述】:

在尝试让vim 正确缩进.html 文件时,我遵循了here 中列出的示例。

给定以下文件index.html

<html>
  <body>
    <p>
    text
    </p>
  </body>
</html>

我尝试打开它like so(忽略我的.vimrc 以确保它不会产生负面影响)

vim -u NONE index.html

然后我设置the options 启用自动缩进:

:filetype plugin indent on
:set filetype=html           # abbrev -  :set ft=html
:set smartindent             # abbrev -  :set si

然后我用gg=G缩进整个文件,结果如下:

<html>
<body>
<p>
text
</p>
</body>
</html>

我检查以确保 html.vim 文件存在,并且肯定存在

$ head -2 ~/.vim/after/ftplugin/html.vim 
" Vim syntax file
" Language: HTML
$ head -2 ~/.vim/ftplugin/html.vim
" Vim syntax file
" Language: HTML

我的vim版本是7.4:

$ vim --version | head -1
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Sep 23 2013 16:12:20)

它包括智能缩进:

$ vim --version | grep smartindent
-ebcdic          +mouse           +smartindent     +xim

我不知道为什么缩进不起作用!有什么线索或想法可以进一步研究这个问题吗?

FWIW,我正在运行 Ubuntu 13.04。

【问题讨论】:

  • 我在 Mac OS X 上遇到了同样的问题,暂时恢复到 7.3。不过,我确信在运行时文件中可以找到一些东西。
  • 在 vim_use 或 vim_dev 邮件列表中询问。这是潜在错误的正确渠道。
  • @glts 我现在实际上在使用 IRC,我们已将其范围缩小到 7.3 和 7.4 之间的运行时变化。
  • @romainl 真的要感谢你带领我朝那个方向发展。我要弄清楚是什么特定的更改破坏了它,看看我是否不能将其作为更改提交。
  • 'smartindent' 如果使用“filetype plugin indent on”启用特定于文件类型的缩进,实际上对 HTML 的影响为零。如果你最终遇到了一个将应用 smartindent 的文件,我想你会失望的。 “智能”缩进……嗯……不是

标签: html vim


【解决方案1】:

正如 Cory 的回答中提到的,当前分发的版本是 Vimscript 2075。如果你去那个插件页面,你可以看到所有默认情况下会增加缩进的标签。

您在示例中提供的所有标签均不在此默认列表中,但有很多。

由于 HTML 的缩进对用户偏好非常开放,因此插件维护者提供了一个选项,可以在增加缩进的标签列表中添加或删除标签。请参阅 :help html-indent,它的建议是:

You can add further tags with:

  :let g:html_indent_inctags = "html,body,head,tbody"

【讨论】:

  • 对于每个软件中的合理默认值都有一些话要说,我认为这是一个特殊的例子,其中合理的默认值严重失败。
  • 我个人认为 、 或 中的任何缩进都是浪费的。每个 HTML 文档都有这些,它们并没有真正添加任何结构。

    我同意不应该缩进,因为我通常在文本中使用它而不是开始一个新行。因此,我认为给出的具体示例是正确缩进的。如果您添加一个 div、一个部分或一个列表,则会缩进,因为它增加了结构。

  • @Ben 感谢您解决这个问题。作为 vim 中 HTML 开发的新手,我什至没有考虑到某些标签不会缩进。
  • 为什么我不能让它与&lt;script&gt;一起工作,这是我真正想要缩进的地方? (该修复适用于htmlheadbody 标签,但我同意缩进会浪费。)
  • 因为在&lt;script&gt; 标签内,html 缩进脚本会尝试根据标签内使用的语言进行缩进。例如,它将根据cindent() 设置缩进javascript。但是,请参阅:help html-indent:您可以使用一些内置选项变量将初始缩进级别应用于&lt;style&gt;&lt;script&gt; 标签。
【解决方案2】:

在版本 7.3 和 7.4 之间,位于 $VIMRUNTIME/indent 中的捆绑 html.vim 文件发生了变化。目前分发的版本其实是Vimscript #2075,默认不缩进一些html标签。

我推荐上面 Ben 的解决方案,但您也可以恢复到分发的 html.vim 文件的先前版本。

为此,只需将现有的 7.4 html.vim 文件替换为 7.3 中的文件即可。

wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
tar jxf vim-7.3.tar.bz2
cp vim73/runtime/indent/html.vim ~/.vim/indent/

【讨论】:

  • “但我会选择“正常运作”而不是“高效”。”我完全同意。谢谢你比我懒。
  • 该脚本的维护者实际上非常关心并要求投诉(请参阅此处:vim-dev list),因此本着开源精神,您应该直接告诉他,以便他改进缩进脚本
  • 那个,脚本确实有效。它只是在帮助中缺少关于将添加到缩进中的默认标签的文档。正如我在回答中提到的,给出的示例中的标签不是默认添加到缩进的标签。只需将其配置为缩进您想要的特定标签,一切都会正常工作,可能比 7.3 版本更好。在 7.4 中选择这个脚本来替代旧版本是有原因的!
  • 如果你这样做(用旧的未维护版本替换插件的新版本),那么你将永远不会再得到任何错误修正或改进。想要任何 HTML5 支持吗?太糟糕了。想要处理您的错误报告吗?太糟糕了。如何配置新插件,或者联系维护者提出具体要求?
  • @ChristianBrabandt 我想也许我会建议他更新 vim.org 上的文档,以清楚地表明一些基本的 html 标签默认不缩进。这可以防止我错误地认为它坏了。我认为当前位于页面中间的文本:let g:html_indent_inctags = "html,body,head,tbody" 不够交流。
【解决方案3】:

截至 7.4.52

在 vim 中:

:let g:html_indent_inctags = "html,body,head,tbody"
:call HtmlIndent_CheckUserSettings()

.vimrc 中的其他内容:

let g:html_indent_inctags = "html,body,head,tbody"

我只是想将其添加到最佳答案的评论中,以回馈,在花了太多时间没有得到答案之后,但显然没有足够的声誉:(

【讨论】:

  • E117: Unknown function: HtmlIndent_CheckUserSettings 在 vi​​m 7.4.1689
【解决方案4】:

故障排除的第一步是运行:scriptnames。如果您没有看到.../indent/html.vim,那么这意味着插件没有正确加载并且缩进将无法正常工作。它可能只会让每一行都缩进。 (问题是 vim 没有报错,所以看起来缩进做得很糟糕。)

让它工作的最可靠方法是将此行放入您的~/.vimrc

filetype plugin indent on

然后再次用vim打开文件,运行:scriptnames。你现在应该看到.../indent/html.vim。然后输入gg=G 以自动格式化整个文件。

一个重要的提示让我困惑了一段时间:如果你没有把它放在~/.vimrc 中,在你打开文件后只输入:filetype plugin indent on,你将不得不再次重新打开文件:e。缩进插件必须在您打开文件之前加载。运行:scriptnames进行确认。

旁注:您无需担心smartindentautoindent 设置,它们是用于其他用途的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2017-11-25
    • 1970-01-01
    • 2011-04-25
    • 2011-01-31
    相关资源
    最近更新 更多