如何在Vim中快速关闭HTML标签?

时间:2008-09-25 00:10:09

标签: html xml vim autocomplete

已经有一段时间了,因为我必须在Vim中执行任何类似HTML的代码,但最近我又遇到了这个问题。说我正在写一些简单的HTML

<html><head><title>This is a title</title></head></html>

如何快速写下title,head和html的结束标记?我觉得我错过了一些非常简单的方法,不会让我一个接一个地写下来。

当然我可以使用 Ctrl P 来自动填充单个标签名称,但是我的笔记本电脑键盘上的内容实际上是正确的括号和斜线。

11 个答案:

答案 0 :(得分:73)

我发现使用xmledit插件非常有用。它增加了两个功能:

  1. 当您打开代码(例如类型<p>)时,只要您将结束>输入<p></p>,它就会展开代码并放置插入模式下标签内的光标。
  2. 如果您然后立即键入另一个>例如。您键入<p>>),则会将其扩展为

    <p>

    </p>

  3. 并将光标置于标记内,以插入模式缩进一次。

    xml vim插件为这些功能添加了代码折叠和嵌套标记匹配。

    当然,如果您在Markdown中编写HTML内容并使用%!通过您选择的Markdown处理器过滤Vim缓冲区,则根本不必担心关闭标记: )

答案 1 :(得分:55)

我喜欢最小的东西,

imap ,/ </<C-X><C-O>

答案 2 :(得分:45)

我发现让vim为我编写开始和结束标记更方便,而不仅仅是结束标记。 Tim Pope可以使用出色的ragtag plugin。用法看起来像这样(让|标记光标位置) 你输入:

span|

CTRL + x SPACE

你得到了

<span>|</span>

您还可以使用 CTRL + x ENTER 而不是 CTRL + x SPACE ,你得到了

<span>
|
</span>

Ragtag可以做的不仅仅是它(例如插入&lt;%=围绕此%&gt;或DOCTYPE的东西)。您可能希望通过author of ragtag查看其他插件,尤其是surround

答案 3 :(得分:38)

检查出来..

closetag.vim

Functions and mappings to close open HTML/XML tags

https://www.vim.org/scripts/script.php?script_id=13

我使用类似的东西。

答案 4 :(得分:23)

如果您正在做一些精心设计,sparkup非常好。

他们网站上的一个例子:

ul > li.item-$*3扩展为:

<ul>
    <li class="item-1"></li>
    <li class="item-2"></li>
    <li class="item-3"></li>
</ul>

使用<C-e>

要做问题中给出的例子,

html > head > title{This is a title}

产量

<html>
  <head>
    <title>This is a title</title>
  </head>
</html>

答案 5 :(得分:17)

还有一个zencoding vim插件:https://github.com/mattn/zencoding-vim

教程:https://github.com/mattn/zencoding-vim/blob/master/TUTORIAL


更新:现在称为 Emmet http://emmet.io/


教程摘录:

1. Expand Abbreviation

  Type abbreviation as 'div>p#foo$*3>a' and type '<c-y>,'.
  ---------------------
  <div>
      <p id="foo1">
          <a href=""></a>
      </p>
      <p id="foo2">
          <a href=""></a>
      </p>
      <p id="foo3">
          <a href=""></a>
      </p>
  </div>
  ---------------------

2. Wrap with Abbreviation

  Write as below.
  ---------------------
  test1
  test2
  test3
  ---------------------
  Then do visual select(line wize) and type '<c-y>,'.
  If you request 'Tag:', then type 'ul>li*'.
  ---------------------
  <ul>
      <li>test1</li>
      <li>test2</li>
      <li>test3</li>
  </ul>
  ---------------------

...

12. Make anchor from URL

  Move cursor to URL
  ---------------------
  http://www.google.com/
  ---------------------
  Type '<c-y>a'
  ---------------------
  <a href="http://www.google.com/">Google</a>
  ---------------------

答案 6 :(得分:10)

映射

我喜欢让我的块标签(与内联相对)立即关闭并尽可能简单地使用快捷方式(我希望尽可能避免像 CTRL 这样的特殊键,尽管我使用{ {1}}关闭我的内联标签。)我喜欢在启动标签块时使用此快捷方式(感谢@kimilhee;这是他的答案的起飞):

closetag.vim

样本用法

类型 -

inoremap ><Tab> ><Esc>F<lyt>o</<C-r>"><Esc>O<Space>

结果 -

<p>[Tab]

其中<p> | </p> 表示光标位置。

说明

  • | 表示以插入模式创建映射
  • inoremap 表示结束尖括号和制表符;这是匹配的
  • ><Tab> 表示结束第一个标记并从插入转换为正常模式
  • ><Esc> 表示找到最后一个开放角括号
  • F< 表示向右移动光标(不要复制开口尖括号)
  • l 表示从光标位置向上移动直到下一个结束尖括号(即复制标签内容)
  • yt> 表示在插入模式下启动新行,并添加一个左右括号和斜杠
  • o</ 表示从默认寄存器(<C-r>"
  • 以插入模式粘贴
  • " 表示关闭结束标记并退出插入模式
  • ><Esc> 表示在光标上方以插入模式开始新行并插入空格

答案 7 :(得分:6)

allml(现在是Ragtag)和Omni-completion(&lt; C-X&gt;&lt; C-O&gt;) 在.py或.java等文件中不起作用。

如果要在这些文件中自动关闭标记, 你可以这样映射。

imap <C-j> <ESC>F<lyt>$a</^R">

(^ R是Contrl + R:您可以输入类似此Control + v然后按Control + r)

(|是光标位置) 现在,如果你输入..

&LT; p为H. ABCDE |

并输入^ j

然后关闭这个标签..

&LT; p为H. ABCDE&LT; / p为H. |

答案 8 :(得分:5)

这是另一个基于易于发现的Web写作的简单解决方案:

  1. Auto closing an HTML tag

    :iabbrev </ </<C-X><C-O>

  2. Turning completion on

    autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags

答案 9 :(得分:5)

查看vim-closetag

这是一个非常简单的脚本(也可用作vundle插件),可以为您关闭(X)HTML标记。从README开始:

  

如果这是当前内容:

<table|
     

现在按&gt; ,内容将是:

<table>|</table>
     

现在如果再次按&gt; ,内容将是:

<table>
   |
</table>

注意:|是此处的光标

答案 10 :(得分:3)

建立@KeithPinson的优秀答案(对不起,还没有足够的声誉点评论你的答案),这个替代方案将阻止自动完成复制可能在html标签内的任何额外内容(例如,类,ID, etc ...)但不应该复制到结束标记。

更新我已更新我对使用filename.html.erb文件的回复 我注意到我的原始响应在Rails视图中常用的文件中没有用,例如some_file.html.erb当我使用嵌入式ruby时(例如<p>Year: <%= @year %><p>)。 下面的代码将使用.html.erb个文件。

inoremap ><Tab> ><Esc>?<[a-z]<CR>lyiwo</<C-r>"><Esc>O

示例用法

类型:

<div class="foo">[Tab]

结果:

<div class="foo">
  |
<div>

其中|表示光标位置

作为添加结束标记内联而不是块样式的示例:

inoremap ><Tab> ><Esc>?<[a-z]<CR>lyiwh/[^%]><CR>la</<C-r>"><Esc>F<i

示例用法

类型:

<div class="foo">[Tab]

结果:

<div class="foo">|<div>

其中|表示光标位置

上述两个示例都依赖于>[Tab]来表示结束标记(意味着您必须选择 内联或块样式),这是正确的。就个人而言,我使用>[Tab]的块样式和>>的内联样式。