Very simple I guess but I cannot get what I perceive to be the correct behavior out of zencoding in vim.
So what I am doing is.
1) selecting using visual a who line.
2) Using <C-e> (rebound) to use zencoding.
3) supply the tags to apply and enter.
What happens is saying using h2 occurs with all.
<h2>
My text
</h2>
However I want it like.
<h2>My Text</h2>
How can I get it like that?
Answer if selecting a line in vim with V (shift+v) zencoding completes a block encoding so "some text" becomes:
<h1>
some text
</h1>
where as using the singular v and then manually selecting text using h,j,k,l the result is inline:
<h1>some text</h1>
If anyone has any other neat tricks let me know.
Related
I have the following HTML:
1 <div>
2 <p>This is a paragraph</p>
3 <p>This is the second paragraph</p>
4 </div>
If I do not have my cursor anywhere near the above item and try to yank
The entire div by: :1yat
The inner content of that div :1yit
The inner content of the first paragraph :2yit
None of the above commands work. Any idea how I can yank inner/outter div elements without moving the cursor (#extremelaziness)?
Thank you
Vim is commonly called "modal" editor, because it has modes. What it truly means is that all the commands and keyhits are different between different modes. That's the main point which must be learnt by anyone who uses Vim.
In your case yat and such belong to the Normal mode, while : switches into Command-line mode. While in the Command-line mode you can only execute its commands.
Of course, there is :normal which serves as a sort of "bridge" between Normal and Command-line, however it's primarily used in scripting as typing :1norm yat looks like anything but #extremelaziness.
So you have either to write some custom command yourself or to keep typing 2ggyat<C-O> and such.
I'm new to vim-surround. I would like to achieve the folowing.
I have an html file with many images as this (* is the cursor position):
<img src="ima*ges/pages/img1.jpg" alt="">
And I would like to change it with this:
<img src="{{ media_url('images/pages/img1.jpg') }}" alt="">
I tried ys"f but it doesn't work as expected. I would like to change all jpg images with such pattern, I'm aware of vim-repeat I will dig into it once I could change the first correctly.
If you know a way to achieve this to all jpg occurrences I would be really thankful.
Thank you very much.
Personally I am a big fan of custom surroundings.
Example of a custom surrounding, by adding the following to ~/.vim/after/ftplugin/html.vim:
let b:surround_{char2nr('m')} = "{{ media_url('\r') }}"
Now in file's with the FileType of html you can use the m surrounding. It might be best to have 2 surroundings one for the curly braces and one for media_url function.
For more information see :h surround-customizing
You will need to record a macro and then execute on all images.
In normal mode position your cursor at first " start recording a macro with qq then:
cs"'va'hSbimedia_urlbvf)S{gvS}gvS"q
Now you have recorded a macro in q register. Execute it whit #q.
Position your self at next image(") and the #q. You can combine it with find (/"ima) then combine n and #q.
If you position yourself with find on next word while recording macro you can prefix macro with number ... 10#q execute it on 10 images....
:substitute seems to be a better fit for this job:
:s#\v<img src="\zs\S{-}\.jpg\ze"#{{ media_url('\1') }}#g
If you don't want to change all of them, add c after the g to ask for user consent before each surrounding.
Let's say I have the following snippet:
snippet divt
<div id="${1:div_id}">
${2:'some text'}
</div>
So when I type divt and hit tab twice "'some text'" should be selected, and when I hit tab once more I would like "some text" to be selected (witoutht single quotes). How can I do it?
Edit 1: Thanks for your answers. Probably this example makes more sense:
snippet divt
<div ${1:id="${2:div_id}"}>
</div>
Sometimes I want a div without an id, so i need to be able to delete the id="div_id" altogether. Sometimes i'd like to have an id, so that i can change div_id part only.
I am currently on a promoting trip for UltiSnips which I am maintaning. The snippet that does precisely that looks like this for UltiSnips:
snippet divt "div" b
<div ${1:id="${2:div_id}"}>
</div>
endsnippet
UltiSnips also comes with a converter script for snipMate snippets, so switching should be painless.
SnipMate unfortunately doesn't support nested placeholders but, as per #Benoit's advice, you could use another snippet while editing the second placeholder. Be sure to bring a spinning top with you, though.
I'm not sure what you want to achieve with some text vs 'some text' — both being treated exactly the same way in this context by every html parser on earth — but I would achieve that with a simple
snippet div
<div id="${1:div_id}">
${2}
</div>
and simply typing either
some text
or
'
which would be expanded to (| is the caret)
'|'
thanks to delimitMate or any other similar plugin then
'some text'
Or maybe use surround to change
some text|
into
'some text'
by typing
<Esc>v2bS'
With Surround you can also start with
some text
select it with
v2e
or something similar and type
S'
to add the quotes then select the line with
V
and type
S<div id="div_id">
to obtain
<div id="div_id">
'some text'
</div>
or do it the other way or... someone has to write a blog post with ALL the possible ways to achieve a given task in Vim.
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 there 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.
I have been trying to learn Vim and have been using it for 2 weeks now.
My question is how do I return the cursor immediately to the middle of the text I just typed:
I have a tendency to type:
<div>
</div>
and returning back to the content of the tag and writing its contents:
<div>
text
</div>
This also goes for functions:
function eat() {
}
before getting back to the middle of the and typing it's contents:
function eat(){
blah
}
An uppercase O, so Shift+o, inserts an empty line above the one you're currently on and puts you into insert mode where you can begin typing. It was kind of an epiphany for me when I first figured that out.
If you work a lot with html / xml tags, have a look at surround.vim
I agree with michaelmichael, O works in both of your examples above.
In general, in vi or vim, you can use "macro" to achieve this. This feature acts like a bookmark, despite its name.
ma will define a macro called 'a'.
`a will take you back to where the bookmark was defined. If you want the beginning of the line, use 'a
So, if you typed 'ma' at the appropriate spot, continued typing, then typed '`a', it would achieve the effect you're looking for.
Snipmate plugin - Completion codes
dynamics
see an example of plugin in action at the vimeo site