Vim Tips Wiki
(Use nbsp for 3 required trailing spaces so not accidentally removed)
(Move categories to tip template)
Line 9: Line 9:
 
|version=5.7
 
|version=5.7
 
|rating=57/23
 
|rating=57/23
  +
|category1=
  +
|category2=
 
}}
 
}}
 
Vim supports multi-line abbreviations, but does not say how you can define them on multiple lines.
 
Vim supports multi-line abbreviations, but does not say how you can define them on multiple lines.

Revision as of 05:05, 25 April 2008

Tip 966 Printable Monobook Previous Next

created August 5, 2005 · complexity basic · author Bernard Barton · version 5.7


Vim supports multi-line abbreviations, but does not say how you can define them on multiple lines.

Here is a way to define a long abbreviation over multiple lines.

You need a line-continuation character (\) and a carriage return (<CR>) at the beginning of each line. Here is an example:

iab abtest 
\<CR>this is line one
\<CR>this is line two
\<CR>this is line three

There must be a space following the abbreviation name ("abtest " in the first line above), in order to avoid this error when sourcing abbreviations defined like this:

E474: Invalid argument

To simplify creating multi-line abbreviations, I've included two substitution commands which will add or remove the \<CR> to the beginning of each line. These are mapped in visual mode, and are bound to the Ctrl-C and Ctrl-Alt-C keys:

:vmap <C-c> :s/^/\\\<\C\R\>/<CR>:nohlsearch<CR>
:vmap <C-A-c> :s/\\<CR[>]//<CR>:nohlsearch<CR>

To create a multi-line abbreviation using these mappings, follow these steps. This example creates a multi-line abbreviation for the proverbial "hello world" C program:

#include <stdio.h>
void main(void) {
  printf("Hello World\n");
}
  • Place the :vmap key mappings into a file and source it.
  • Place the cursor on the first line and press Shift-V.
  • Press the 'j' key until the entire code block is highlighted.
  • Press Ctrl-C. This places the \<CR> in front of each line.
  • Add "iab cmain " (no quotes) just above the abreviation, and ensure there's a space after cmain. It should look like this:
iab cmain 
\<CR>#include <stdio.h>
\<CR>
\<CR>void main(void) {
\<CR>
\<CR> printf("Hello World\n");
\<CR>
\<CR>}

Now simply source the file, and type cmain to expand the abbreviation.

Here is an example of an abbreviation for Perl programs that you may find useful:

iab abperl 
\<CR>###############################################################################
\<CR>#
\<CR># File:
\<CR>#
\<CR># Date:
\<CR>#
\<CR># Description:
\<CR>#
\<CR># Syntax:
\<CR>#
\<CR># Author:
\<CR>#
\<CR># Copyright (c)
\<CR>#
\<CR>#
\###############################################################################

Comments

A better procedure is to keep a clean template in a file, and include that file when required:

map ,,, :r template<CR>