【问题标题】:How can one close HTML tags in Vim quickly?如何在 Vim 中快速关闭 HTML 标签?
【发布时间】:2010-09-12 22:39:11
【问题描述】:

自从我不得不在Vim 中编写任何类似 HTML 的代码以来已经有一段时间了,但最近我又遇到了这个问题。假设我正在写一些简单的HTML

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

如何快速写下title、head和html的结束标签?我觉得我在这里错过了一些非常简单的方法,不涉及我将它们一一写下来。

当然,我可以使用 CtrlP 来自动完成各个标签名称,但让我在笔记本电脑键盘上使用的实际上是正确使用括号和斜线。

【问题讨论】:

    标签: html xml vim autocomplete


    【解决方案1】:

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

    1. 当您打开标签时(例如键入&lt;p&gt;),只要您将结束&gt; 键入&lt;p&gt;&lt;/p&gt;,它就会展开标签并将光标放在插入标签内模式。
    2. 如果您随后立即输入另一个 &gt;例如您输入 &lt;p&gt;&gt;),它会将其扩展为

      &lt;p&gt;

      &lt;/p&gt;

    并将光标置于标签内,缩进一次,处于插入模式。

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

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

    【讨论】:

    • 这个插件可以在输入''时自动关闭标签吗?或者只是用一些击键插入结束标签?有时您删除结束标记并希望在之后插入...
    • 我不喜欢这个插件,因为它没有提供一种简单的方法让你的光标越过生成的标签。例如,如果你想写“Have a nice day”,你首先输入“Have a nice”,它会呈现为“Have a nice|”。然后,您需要向右箭头或退出插入模式以继续句子的其余部分。这就是为什么按一个键插入结束标签的解决方案更好。
    • @exclipy Vim 有很多内置的方法可以做到这一点。尝试使用“E”、“f”和“A”命令作为初学者。
    • 我用git clone https://github.com/sukima/xmledit.git ~/.vim/bundle/xmledit 安装了xmledit 插件。但它仅在编辑 .xml 文件时有效。当文件 ext 为 .html 或 .htm 时,它不起作用。
    • @Chad 目前,我的解决方案是将文件复制粘贴到同一目录中,并将其重命名为“html.vim”,这样它也会影响 HTML 文件。现在,我在 ~/.vim/ftplugin 中有两个完全相同的文件(xml.vim 和 html.vim)。
    【解决方案2】:

    我喜欢极简的东西,

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

    【讨论】:

    • 是做什么的?它对我没有任何作用。
    • 有些情况下想写“,/”,所以我宁愿使用不同的快捷方式。另一个细节是omni-completion应该关闭,而不是等待额外的输入。所以:imap &lt;silent&gt; &lt;C-c&gt; &lt;/&lt;C-X&gt;&lt;C-O&gt;&lt;C-X&gt;
    • 非常酷。还在末尾添加了&lt;Esc&gt;F&lt;i,以便将光标放回标签内。
    • 在插入模式下使用该命令,然后点击,/关闭标签
    • 上述解决方案有很多赞成票,但缺乏解释,尤其是对于像我这样的初学者。它是如何工作的以及如何使用它?
    【解决方案3】:

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

    跨度|

    CTRL+x 空格

    你得到

    |

    您也可以使用 CTRL+x ENTER 代替 CTRL+x SPACE,然后你得到

    |

    Ragtag 可以做的不仅仅是它(例如,在这个 %> 或 DOCTYPE 周围插入 author of ragtag 的其他插件,尤其是surround

    【讨论】:

    • +1 太棒了!顺便说一句,这现在被称为 ragtag: vim.org/scripts/script.php?script_id=1896
    • 这个绝对是最简单的。 Textmate 做得很好,但 Vim 在这方面胜过它,感谢 Krzysiek。
    【解决方案4】:

    看看这个..

    closetag.vim

    Functions and mappings to close open HTML/XML tags
    

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

    我使用类似的东西。

    【讨论】:

    • 我已经安装了这个。它不会自动完成关闭标签。什么是快捷键?我尝试Ctrl-_,但这会使我的终端字体变小。
    【解决方案5】:

    如果你做任何复杂的事情,sparkup 非常好。

    他们网站上的一个例子:

    ul &gt; li.item-$*3 扩展为:

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

    &lt;C-e&gt;

    做题中给出的例子,

    html > head > title{This is a title}
    

    产量

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

    【讨论】:

    • 非常感谢!这比我以前见过的任何东西都要酷,不仅是 Vim,而且在任何其他编辑器中!超级棒!
    • 这是一个很棒的插件
    • 这个插件是从 zen-coding 演变而来的。后者现在称为emmet,具有稍大的功能集。
    【解决方案6】:

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

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


    更新:现在称为 Emmethttp://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>
      ---------------------
    

    【讨论】:

    • 哇,这是ruby的创造者吗?
    【解决方案7】:

    映射

    我喜欢立即关闭我的块标签(而不是内联标签)并使用尽可能简单的快捷方式(我喜欢尽可能避免使用像 CTRL 这样的特殊键,尽管我确实使用 @ 987654321@ 关闭我的内联标签。)我喜欢在开始标签块时使用这个快捷方式(感谢@kimilhee;这是他的回答):

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

    示例用法

    类型——

    <p>[Tab]
    

    结果——

    <p>
     |
    </p>
    

    其中| 表示光标位置。

    说明

    • inoremap 表示以插入模式创建映射
    • &gt;&lt;Tab&gt; 表示一个右尖括号和一个制表符;这是匹配的
    • &gt;&lt;Esc&gt; 意思是结束第一个标签,退出插入进入正常模式
    • F&lt; 表示找到最后一个左尖括号
    • l 表示光标右移一位(不要复制左尖括号)
    • yt&gt; 表示从光标位置拉到下一个右尖括号之前(即复制标签内容)
    • o&lt;/ 表示以插入模式开始新行并添加左尖括号和斜线
    • &lt;C-r&gt;" 表示从默认寄存器以插入模式粘贴 (")
    • &gt;&lt;Esc&gt; 表示关闭结束标签并退出插入模式
    • O&lt;Space&gt; 表示在光标上方以插入模式开始新行并插入一个空格

    【讨论】:

    • @wds 哇,是的,我从没想过l 的意思是“右”而不是“左”,哈哈……真是个有趣的错误。你觉得我的帖子怎么样?我注意到你没有投票。
    • 当然很好。我最近开始使用 xml.vim 插件(它确实工作得很好)。我建议使用特定于文件类型的自动命令将其添加到您的 .vimrc 中,即:au filetype html inoremap &lt;buffer&gt; ...
    • 终于有一个自动关闭命令,它完全可以正常工作——简单!
    • 我喜欢将光标放在标签之间。所以我修改了它以适应我的需要。 inoremap &gt;&lt;Tab&gt; &gt;&lt;Esc&gt;F&lt;lyt&gt;o&lt;/&lt;C-r&gt;"&gt;&lt;Esc&gt;kJxi 我删除了0&lt;Space&gt; 并添加了kJxi。前进 1 步,连接两行,删除一个字符,然后进入插入模式。
    【解决方案8】:

    查看vim-closetag

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

    如果这是当前内容:

    <table|
    

    现在你按>,内容将是:

    <table>|</table>
    

    现在如果你再次按>,内容将是:

    <table>
       |
    </table>
    

    注意:| 是这里的光标

    【讨论】:

      【解决方案9】:

      allml(现在是 Ragtag)和 Omni-completion() 不适用于 .py 或 .java 之类的文件。

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

      imap F$a^R">

      ( ^R 是 Contrl+R : 你可以像这样输入 Control+v 然后 Control+r )

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

      abcde|

      然后输入 ^j

      然后它像这样关闭标签..

      abcde

      |

      【讨论】:

      • with imap mfF`fa"> 克隆标记是当您键入 ^j 而不是行尾时光标所在的位置($ )
      【解决方案10】:

      这是另一个基于易于找到的网络写作的简单解决方案:

      1. Auto closing an HTML tag

        :iabbrev &lt;/ &lt;/&lt;C-X&gt;&lt;C-O&gt;

      2. Turning completion on

        autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags

      【讨论】:

      • 很棒的反应!!!没有插件!!! (第 2 项有 linkrot)也许仍然是最好的答案,因为修改 .vimrc 似乎比处理插件更快。加上最简约的响应
      • 这会在闭合标签后添加空格:(
      【解决方案11】:

      基于@KeithPinson 的出色答案(抱歉,还没有足够的声誉点来评论您的答案),这种替代方法将阻止自动完成复制任何可能在 html 标记内的额外内容(例如类、ID、等...),但不应复制到结束标记。

      更新我已更新我的回复以使用 filename.html.erb 文件。
      我注意到我的原始响应在 Rails 视图中常用的文件中不起作用,例如当我使用嵌入式 ruby​​ 时的some_file.html.erb(例如&lt;p&gt;Year: &lt;%= @year %&gt;&lt;p&gt;)。下面的代码.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>
      

      | 表示光标位置

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

      【讨论】:

        猜你喜欢
        • 2014-04-05
        • 1970-01-01
        • 2011-03-04
        • 2023-04-01
        • 2013-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-13
        相关资源
        最近更新 更多