Vim is an improved version of the good old UNIX editor, vi. Many new features have been added: multi-level undo, syntax highlighting, command line history, on-line help, spell checking, filename completion, block operations, script language, etc. There is also a Graphical User Interface (GUI) available. Still, vi compatibility is maintained, those who have vi “in the fingers” will feel at home. 0
Vim configuration is stored in a local user’s ~/.vimrc file. The contents of this file are based on the user’s preferences.
The following configuration is an example based on Sven Gucke’s 1 published vim setup and modified to satisfy the KISS #/kiss/style-guide.
Note: There are no “fancy” text decorations or highlighting. Just a core set of features selected to assist in code and article writing.
# Sven Gucke's Modified VIMRC
set ai nocp digraph ek hid ru sc vb wmnu noeb noet nosol
syntax on
set bs=2 fo=cqrt ls=2 shm=at tw=80 sw=4 ts=4 sts=4 ww=<,>,h,l
set comments=b:#,:%,n:>
set list listchars=tab:»·,trail:·
autocmd FileType markdown,text setlocal spell
The following is an explanation of each parameter. You can learn more about each by using the “:help OPTION” command in vim.
| Command | Description |
|---|---|
| nocompatible | This changes the values of many options, |
| set nocp | enabling features which are not vi compatible |
| (but really really nice). | |
| digraph | Enables input of special characters by a |
| set digraph | combination of two characters. Example: Type |
| ‘a’, erase it by typing CTRL-H - and then type | |
| ’:’ - this results in the umlaut: ä So Vim | |
| remembers the character you have erased and | |
| combines it with the character you have typed | |
| “over” the previous one. | |
| esckeys | Enables recognition of arrow key codes which |
| set ek | start off with an ESC. This would normally end |
| your current mode (insert/append/open mode) and | |
| return you command mode (aka normal mode), and | |
| the rest of the code would trigger commands. | |
| hidden | Allows hidden buffers even though they contain |
| set hid | modifications which have not yet been written |
| back to the associated file. | |
| ruler | Shows the “ruler” for the cursor (i.e, its |
| set ru | current position with line+column and the |
| percentage within the buffer). | |
| showcmd | Show the input of an incomplete command. So |
| set sc | while you are typing the command “y23dd” you |
| will see “y23dd before you type the last ‘d’ | |
| which completes the command. Makes learning Vi | |
| much simpler as you get some feedback to what | |
| you have already typed. | |
| visualbell | Chose “visual bell” effect rather than |
| set vb | “beeping”. |
| wildmenu | Make use of the “status line” to show possible |
| set wmnu | completions of command line commands, file |
| names and more. Allows one to cycle forward and | |
| backward through the list. | |
| noerrorbells | Turn off the bell. You do know the “beep” you |
| set noeb | get when you type ESC in normal mode? |
| Be nice to your co-workers - turn it off! ;-) | |
| noexpandtab | When inserting text, do not expand TABs to |
| set noet | spaces. You can always make vim expand the TABs |
| later (using the “:retab” command). | |
| nostartofline | Prevent the cursor from changing the current |
| set nosol | column when jumping to other lines within the |
| window. | |
| syntax on | Enable syntax highlighting. |
| autoindent | Automatic indentation. This automatically |
| set ai | inserts the indentation from the current line |
| when you start a new line; in insert mode you | |
| would start a new line by ending the current | |
| one by inserting CTRL-J or CTRL-M - and in | |
| command mode you’d “open” a new line with | |
| either ‘o’ or ‘O’ for below or above the | |
| current line, respectively. | |
| backspace | Backspace with this value allows to use the |
| set bs=2 | backspace character (aka CTRL-H or “<-“). |
| for moving the cursor over automatically | |
| inserted indentation and over the start/end of | |
| a line (see also the whichwrap option). | |
| formatoptions | The format options affect the built-in “text |
| set fo=cqrt | formatting” command. The default value omits |
| the “flag” ‘r’, which makes vim insert a | |
| “comment leader” when starting a new line. This | |
| allows to add text to a comment and still be | |
| within the comment after you start a new line. | |
| It also allows to break the line within a | |
| comment without breaking the comment. | |
| laststatus | This makes vim show a status line even when |
| set ls=2 | only one window is visible. |
| shortmess | This shortens about every message to a minimum |
| set shm=at | and thus avoids scrolling within the output of |
| messages and the “press a key” prompt that goes | |
| with these. | |
| tabstop | Effectively, how many columns of whitespace a |
| ts=4 | \t is worth. |
| softtabstop | How many columns of whitespace a tab keypress |
| sts=4 | or a backspace keypress is worth. |
| shiftwidth | How many columns of whitespace a “level of |
| sw=4 | indentation” is worth or a backspace keypress |
| is worth. | |
| textwidth | This explicitly sets the width of text to 80 |
| set tw=80 | characters. After each completion of a word in |
| insert mode, vim checks whether its end is past | |
| this width; if so then it will break the word | |
| onto the next line. Note that vim will remove | |
| trailing spaces when applying the word wrap - | |
| a feature which many editors are missing (and | |
| which will leave trailing spaces, of course). | |
| NOTE: The word wrap applies only when the | |
| completed word goes over the line; when you | |
| insert a word before that which moves other | |
| words over the line then vim will not break | |
| the words at the end of the line onto the next | |
| line! Programmers certainly don’t want that. | |
| It’s a feature!! | |
| whichwrap | There are several commands which move the |
| set ww=<,>,h,l | cursor within a line. When you get to the |
| start/end of a line then these commands will | |
| fail as you cannot goon. However, many users | |
| expect the cursor to be moved onto the | |
| previous/next line. Vim allows you to chose | |
| which commands will “wrap” the cursor around | |
| the line borders. In this particular example | |
| left/right, as well as the ‘h’ and ‘l’, | |
| keys to do that. | |
| comments | Vim can reformat text and preserve comments |
| set com=b:#,:%,n:> | (i.e. commented lines) even when several kinds |
| of comment indentations “nest” within. This is | |
| particularly useful for reformatting quoted | |
| text in Email and News. | |
| list listchars | This option is cool! Or let’s say that “other |
| set list | editors don’t have at all”. These characters |
| set lcs=tab:»· | are called “list characters” as they are |
| set lcs+=trail:· | related to the list option of vanilla vi. |
| This will show the end-of-lines by adding a ‘$’ | |
| sign after the last character of each line, and | |
| by replacing all TABs by ‘^I’. However, it is | |
| much nicer to have TABs shown in expanded form. | |
| Vim takes it one step further by also making | |
| trailing spaces visible. Being able to see | |
| EOLs, TABs, and trailing space has become an | |
| absolute MUST with every editor. | |
In summary, there are MANY configurations that can be applied to vim in just a few lines of text! As a best practice, test vim out without any configuration applied, then slowly add in needed features. A good starter configuration file might look something like this:
# Starter VIMRC
set ai nocp hid ru sc
filetype plugin indent on
syntax on
set bs=2 ls=2 shm=at tw=72 sw=4 ts=4 sts=4 ww=<,>,h,l