Reputation: 2947
Customizing my .vimrc I added template (skeleton) file support. This auto-command rule from a book didn't do anything (no errors nor templates):
:autocmd BufNewFile * silent! Or $HOME/.vim/templates/%:e.tpl
This non-%e-wildcard version produced an error:
:autocmd BufNewFile *.html Or $HOME/.vim/templates/html.tpl
"test.html" [New File]
Error detected while processing BufNewFile Auto commands for "*.html":
E492: Not an editor command: Or $HOME/.vim/templates/html.tpl
In another post user orftz (+1) showed us an uncommon syntax (what I'd recognize as PHP) using concatenation and double quotes.
:autocmd BufNewFile * :silent! :exec ":0r " . $HOME . "/.vim/templates/" . &ft . ".tpl"
What's wrong with my version of the common and why does the other version work (I don't see any quoting in other vim scripts like this).
Upvotes: 1
Views: 763
Reputation: 3390
Quoting or concatenation has nothing to do with this.
The original command most likely doesn't do anything because you forgot to declare the Or
command. I obviously don't know what the book you referring to uses, but it most likely looks like :command -nargs=1 Or read
for example.
Your second command fails because you also removed silent!
. This statement will suppress all errors. Since you removed it, Vim will now warn you that Or <argument>
is not known by the editor, so the missing %:e
has nothing to with it.
If you want to know more about %:e
, read http://vimdoc.sourceforge.net/htmldoc/cmdline.html#%:e - it will be substituted by the extension of the current file.
EDIT:
I see you were also confused by the .
operator which can be used for string concatenation, and rightly so.
.
simply means "concatenate the first string with the second", e.g. let val2 = 'value ' . val1
.
The hairy thing is that Vim has a few commands which do concatenation themselves, :execute
, :echo
and :echomsg
to just name a few. Such commands will automatically add in a space character if you pass it several expressions. The following commands should all be equivalent:
:exec ":0r" $HOME . "/.vim/templates/" . &ft . ".tpl"
:exec ":0r " . $HOME . "/.vim/templates/" . &ft . ".tpl"
:exec (":0r " . $HOME . "/.vim/templates/" . &ft . ".tpl")
:exec ":0r" ($HOME . "/.vim/templates/" . &ft . ".tpl")
This just goes to say that Vim script is all but pretty.
Upvotes: 2