【问题标题】:Vim Surround: Create new tag but don't indent/new lineVim Surround:创建新标签但不缩进/换行
【发布时间】:2011-08-31 03:22:39
【问题描述】:

我想模仿 Textmates CTRL+ALT+w,它会在同一行创建一对新的打开和关闭 HTML 标记。

在 VIM Surround 中,我在编辑模式下使用 CTRL+st,但它总是在设置标签后缩进并创建一个新行,所以它看起来像这样(* = 光标位置):

<p>
  *
</p>

有没有办法做到这一点? :

<p>*</p>

【问题讨论】:

    标签: vim surround


    【解决方案1】:

    我猜你的问题是选择的区域是“行明智的”。例如,如果您选择了几个带有V 的生命并用标签将其包围,则标签将放置在所选行的上一行和下一行。

    您可能想要创建一个“字符明智”选择,在包围它之前使用v

    无论如何,请发布您创建的地图,以便我们帮助调试。


    更新

    在 cmets 中进行了一些澄清后,我会告诉您环绕插件不是最佳选择。正如它的名字所描述的,它是为处理被包围的内容而创建的。所以你可能需要内容来包围。

    就您而言,我建议您查看HTML AutoCloseTag。一旦你输入&gt;,这个插件就会关闭 html 标签。它肯定比环绕更合适,并且使用的击键次数更少。

    <p         <--- Now when you type ">", if becomes:
    <p>|</p>   <--- Where "|" is the cursor.
    

    显然,您将在每个标签上都获得这种行为。但如果你喜欢它可能会很方便。

    【讨论】:

    • Afaik 我描述的行为是标准的 Vim Surround - 意味着我自己没有创建任何地图。而且我不想将现有内容包装到标签中,而只是创建一个空对来写入。
    • @Thomas:对不起,我不知道你描述的任何名为“CTRL-st”的 Vim 命令,所以我认为那是你创建的地图。无论如何,现在我正确理解了您的问题并更新了答案。
    • sparkup[1] 用 "Ctrl-e" 安静地关闭标签并做除 1 之外的其他事情 - va.mu/Dmh
    【解决方案2】:

    在普通模式下,键入vstp&gt; 进入可视模式,并在当前光标位置的同一行输出一个打开和关闭&lt;p&gt; 标签。使用大写字母 S 来保持当前缩进级别。

    这不会将光标放在您描述的标签之间,但 Textmate 的 CtrlW 快捷方式也没有(我认为您的意思是 CTRL+Shift+w,不是 CTRL+ALT+w,因为后者只是输出一个菱形符号。)

    【讨论】:

    • 也很高兴知道,谢谢,但我认为 sidyls 的推荐更接近我想要的。
    【解决方案3】:

    我的回答可能来晚了,但我会尽力提供帮助。 我对 Vimsurround 插件有类似的问题。每次我使用 ctrl+V 选择句子(一行)并尝试用我得到的东西包围它时:

    {
    var myVar
    }
    

    而不是这个:

    { var myVar } // what I wanted
    

    我找到了简单的解决方案:在正常模式下,我选择一行 vis 命令,然后输入大写 C(我的 vim 环绕映射)并选择要环绕的括号。然后我很好地得到一行被包围了。

    【讨论】:

      【解决方案4】:

      根据作者实际寻找的内容,问题标题在技术上贴错了标签,但由于我实际上是在寻找标题中提出的问题的答案,我想我也应该提供答案。

      要创建一个围绕元素的新标签,而不使用 Vim Surround 在使用块明智选择时使用的自动缩进(即:VysS),您可以改为执行以下操作:

      ^ys$

      此命令会将您的光标移动到该行的第一个非空白字符,发出您要使用 You Surround 的命令,然后移动到该行的末尾。然后,只需开始输入您的标签。

      结果是这样的:

      <input type="email" name="email">
      

      可能变成这样:

      <li><input type="email" name="email"></li>
      

      该命令也可重复使用 和所有正常的其他 Vim 优点。

      【讨论】:

        【解决方案5】:

        偶然发现了这个问题,因为我也想知道这个问题 - 我相信最简单的方法就是:

        yss<p>
        

        yss 用没有缩进的东西包围了一行 - 请参见此处:http://www.catonmat.net/blog/vim-plugins-surround-vim/

        【讨论】:

          【解决方案6】:

          您可以通过选择相关的文本对象来完成此操作::h text-objects

          ...并围绕它而不是围绕视觉线选择。

          我发现自己遇到的最常见的例子是试图用另一个标签包围一个标签。在这种情况下,itat 文本对象非常有用:

                                  *v_at* *at*
          at          "a tag block", select [count] tag blocks, from the
                      [count]'th unmatched "<aaa>" backwards to the matching
                      "</aaa>", including the "<aaa>" and "</aaa>".
                      See |tag-blocks| about the details.
                      When used in Visual mode it is made characterwise.
          
                                  *v_it* *it*
          it          "inner tag block", select [count] tag blocks, from the
                      [count]'th unmatched "<aaa>" backwards to the matching
                      "</aaa>", excluding the "<aaa>" and "</aaa>".
                      See |tag-blocks| about the details.
                      When used in Visual mode it is made characterwise.
          

          例如,如果您将光标放在一个段落中,并且想在同一行用一个 div 将其包围,ysat&lt;div&gt; 就可以做到这一点。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-08-05
            • 1970-01-01
            • 1970-01-01
            • 2017-08-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多