Vim Surround:创建新标签但不缩进/换行

4
我想模仿Textmates的CTRL+ALT+w功能,在同一行上创建新的开始和结束HTML标签。
在VIM Surround中,我使用编辑模式下的CTRL+st进行操作,但它总是缩进并在设置标记后创建新行,因此看起来像这样(* = 光标位置):
<p>
  *
</p>

有没有一种方法可以实现这个?:
<p>*</p>
6个回答

3
我猜你的问题是所选区域是“按行选择”的。例如,如果你使用 V 选择几行并用标签包围它们,则标签将放置在所选行的上方和下方各一行。
你可能想要创建一个“按字符选择”的选择,在包围之前使用 v
无论如何,请发布你创建的地图,这样我们就可以帮助调试问题。

更新

在评论中进行了一些澄清后,我告诉你,surround插件不是最好的选择。正如其名称所描述的那样,它是为处理周围内容而创建的。因此,您可能需要将内容包围起来。

在您的情况下,我建议查看HTML AutoCloseTag。该插件在您键入>时关闭html标签。它肯定比surround更合适,并且使用的击键次数更少。

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

显然,每个标签都会有这种行为。但是如果你喜欢的话,这可能会很方便。

据我所知,我描述的行为是标准的 Vim Surround - 这意味着我没有自己创建任何映射。我不想将现有内容包装成标签,而只是创建一个空对来进行编写。 - user627542
@Thomas:很抱歉,我不知道你所描述的“CTRL-st”这个Vim命令,所以我认为那是你自己创建的映射。无论如何,现在我正确理解了你的问题并更新了答案。 - sidyll
sparkup [1] 使用 "Ctrl-e" 来关闭标签,安静地完成其他任务。另外,1 - http://va.mu/Dmh。 - SergioAraujo

0

您可以通过选择相关的文本对象来完成此操作::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<div> 就可以实现这个目的。

0

该问题标题在技术上有误,与作者实际寻找的内容不符。但由于我实际上正在寻找标题中提出的问题的答案,因此我认为应该也提供一个答案。

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

^ys$

这个命令将把光标移动到行中第一个非空白字符,发出您想要利用 You Surround 的命令,并移动到行尾。然后,只需开始输入您的标记。

结果如下:

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

可能会变成这样:

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

该命令也可以使用.以及所有其他常规的Vim功能进行重复。


0

0

从正常模式开始,输入vstp>进入可视模式,并在当前光标位置的同一行输出一个开放和关闭的<p>标签。使用大写字母S来保持当前缩进级别。

这并不会像您描述的那样将光标放置在标签之间,但Textmate的CtrlW快捷键也不会(我认为您指的是CTRL+Shift+w,而不是CTRL+ALT+w,因为后者只会输出一个菱形符号。)


还有一点需要知道,谢谢你,但我认为Sidyll的建议更接近我想要的。 - user627542

0

我的回答可能有点晚了,但我会尽力帮忙。 我使用Vimsurround插件时遇到了类似的问题。每次我使用ctrl+V选择一行句子并尝试用某些东西包围它时,我都会得到这个:

{
var myVar
}

而不是这样:

{ var myVar } // what I wanted

我找到了一个简单的解决方案:在正常模式下,我使用vis命令选择一行,然后输入大写字母C(我的vim环绕映射),并选择括号进行环绕。然后我就得到了一个漂亮的环绕行。

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