开发者

Vim Surround: Create new tag but don't indent/new line

开发者 https://www.devze.com 2023-03-07 15:25 出处:网络
I would like to mimic Textmates CTRL+ALT+w, which creates a new pair of opening and closing HTML tags on the same line.

I would like to mimic Textmates CTRL+ALT+w, which creates a new pair of opening and closing HTML tags on the same line.

In VIM Surround I'm using CTRL+st in Edit mode for this, but it always indents and creates a new line after setting the tag, so that it looks like this (* = cursor position):

<p>
  *
</p>

Is the开发者_JS百科re a way to achieve this? :

<p>*</p>


I guess your problem is that the selected area is "line wise". For example, if you select a few lives with V and surround it with tags, the tags will be placed one line above and one bellow the selected lines.

You probably want to create a "character wise" selection, with v before surrounding it.

Anyway, please post the map you created, so we can help debugging this.


Update

After some clarification in the comments, I would tell you that the surround plugin is not the best option. As its name describes, it was created to deal with surrounded content. So you may need content to surround.

In your case, I recommend taking a look in HTML AutoCloseTag. This plugin closes the html tag once you type the >. It is certainly more appropriated, and uses less keystrokes than surround.

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

Obviously, you will get this behavior to every tag. But that may be handy if you like it.


From normal mode, type vstp> to enter visual mode and output an opening and closing <p> tag on the same line at the current cursor position. Use a capital S to maintain the current indent level.

This doesn't place the cursor in between the tags as you describe, but neither does Textmate's CtrlW shortcut (I think you meant CTRL+Shift+w, not CTRL+ALT+w, as the latter just outputs a diamond sign.)


My answer is probably coming to late, but I'll try to help. I had similar problem with Vimsurround plugin. Every time I select sentence (one line) using ctrl+V and try to surround it with something I get this:

{
var myVar
}

instead of this:

{ var myVar } // what I wanted

I found easy solution: From a normal mode I choose a line with vis command and then I type capital C (my vim surround mapping ) and choose brackets to surround.Then I get one line nicely surrounded.


The question title is technically mislabeled based on what the author was actually looking for, but since I was actually looking for the answer to the question asked in the title, I figure I should provide an answer to it as well.

To create a new tag surrounding an element without the automatic indentation Vim Surround uses when using a block wise selection (ie: VysS), you can instead do something like:

^ys$

This command will move your cursor to the first non-blank character of the line, issue the command that you want to utilize You Surround, and move to the end of the line. Then, simply start entering your tag.

The result is this:

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

Could become something like this:

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

The command is repeatable as well with . and all the normal other Vim goodness.


Stumbled upon this question because I was wondering this as well - I believe the simplest way to do this is just:

yss<p>

(yss surrounds a line with something without indenting - see here: http://www.catonmat.net/blog/vim-plugins-surround-vim/)


You can accomplish this by selecting the relevant text object: :h text-objects

...and surrounding that instead of surrounding a Visual Line selection.

The most common example I found myself running into was when trying to surround one tag with another. In that situation, the it and at text objects are quite useful:

                        *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.

For example, if you had your cursor in a paragraph and you wanted to surround it with a div on the same line, ysat<div> would accomplish that.

0

精彩评论

暂无评论...
验证码 换一张
取 消