I wonder how to automatically close jinja statements, like html tags.
For example when I type {% for foo in bar %}, {% endfor %} is automatically added two lines below and the cursor in the middle.
I checked how it's done with HTML tags, but I'm not good enough at vim script to adapt this to my problem.
vim endwise can help here, though you may need to do some work to set it up for jinja.
EDIT from reading the plugin code it should work automatically if the filetype is htmljinja or jinja.html
Related
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.
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.
I'm migrating my blog to Jekyll and using MacVim to write my posts. I notice that I'm writing tags that look like this a lot:
{% highlight bash %}
chmod -R g+w test
{% endhighlight %}
or even...
{{ content }}
Is there a shortcut to insert the {{ }} or {% %} tags?
Note: I'm fairly new to Vim so any help is appreciated. I have Tim Pope's Liquid plugin installed as well as the surround plugin.
You may want to take a look at ragtag by Tim Pope. It provides mappings like <c-x>= for {{ foo }} and <c-x>- for {% foo %}.
If you do not want ragtag and since you have surround installed you may want to create your own mappings. I suggest you create a ~/.vim/after/ftplugin/liquid.vim and put in the following:
let b:surround_45 = "{% \r %}"
let b:surround_61 = "{{ \r }}"
This will create surround mappings for <c-s>= and <c-s>- just like ragtag.
You can always use keyboard maps, like
:imap I{ {{}}<esc>hhi
With it if you type I{ in insert mode it will insert {{}} then switches back to normal mode moves the cursor back to the 1st } then goes to insert mode back.
HTH
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 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