Vim Tips Wiki
Register
Advertisement
Tip 966 Printable Monobook Previous Next

created 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>
int main(void) {
  printf("Hello World\n");
  return 0;
}
  • 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 abbreviation, and ensure there's a space after cmain. It should look like this:
iab cmain 
\<CR>#include <stdio.h>
\<CR>
\<CR>int main(void) {
\<CR>
\<CR> printf("Hello World\n");
\<CR>
\<CR> return 0;
\<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>

You may need to add a blank space after the name of your abbreviation.

Advertisement