====== vim ======
''vim'' is not an editor with killerfeatures included, \\
but a killerfeature with an included editor.
===== modelines =====
Using ''modelines'', you can define per file settings inside the file itself. \\
Cause ''modelines'' are disabled per default, they have to be activated first:
set modeline
The variable ''modelines'' defines how many lines from top (or bottom, respectively) of the file are expected to contain a modeline:
set modelines=5
You can define ''modelines'' via two ways, although the old scool method is a little more compatible:
1. new school:
[text]{white}{vi:|vim:|ex:}[white]{options}
[text] any text or empty
{white} at least one blank character ( or )
{vi:|vim:|ex:} the string "vi:", "vim:" or "ex:"
[white] optional white space
{options} a list of option settings, separated with white space or ':',
where each part between ':' is the argument for a ":set"
command
Example: >
vi:noai:sw=3 ts=6
2. old school:
[text]{white}{vi:|vim:|ex:}[white]se[t] {options}:[text]
[text] any text or empty
{white} at least one blank character ( or )
{vi:|vim:|ex:} the string "vi:", "vim:" or "ex:"
[white] optional white space
se[t] the string "set " or "se " (note the space)
{options} a list of options, separated with white space, which is the
argument for a ":set" command
: a colon
[text] any text or empty
Example: >
/* vim: set ai tw=75: */
===== Helpful Settings =====
^ Variable ^ Abbrev ^ Type ^ Effect ^
| filetype | ft | String | defines the filetype, used for syntax highlighting |
| modeline | ? | Boolean | activates the interpretation of ''modelines'' |
| modelines | ? | Integer | holds the count of lines from top or bottom of the file to be searched for ''modelines'' |
| shiftwidth | sw | Integer | number of columns for auto indenting |
| tabstop | ts | Integer | number of columns for a tab **ATTENTION: this should match ''shiftwidth''** |
| textwidth | tw | Integer | specifies the maximum line length, longer lines will be broken after white space using |
| linebreak | lbr | Boolean | wrap long lines, for displaying only (no changes are done to the file itself) |
| fileformat | ff | String | Set the format used when writing, e.g. ''set ff=unix\n:wq'' to convert a dos file to unix |
Using this line in the ''.vimrc'' file, the cursor is placed at the last known position in the file when opening:
:au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal g'\"" | endif
===== Commands To Know By Heart =====
^ Command ^ Effect ^
| ^g | show file status information |
| ZZ | like '':wq'', but vim-specific |
^ copy'n'paste ^|
| yy | copy actual line to clipboard |
| p | paste **after** the cursor |
| P | paste **before** the cursor |
| "*p | Paste from "selection" clipboard (i.e., the regular clipboard) |
| "+p | Paste from "desktop" clipboard (i.e., what applications use to copy into or paste from) |
^ Changing Modes^|
| I | insert at beginning of line |
| A | insert at end of line |
| ^v | visual block mode (selection of fields) |
^ Movement Commands ^|
| : | goto line |
| gg | goto first line |
| G | goto last line |
| z. | scroll actual line to the middle of the screen |
| z- | scroll actual line to the bottom of the screen |
| zRETURN | scroll actual line to the top of the screen |
| f | place cursor to the next occurence of in the line |
| F | place cursor to the last occurence of in the line |
| { | place cursor to the beginning of the actual/last paragraph |
| } | place cursor to the end of the actual/next paragraph |
^ Searching ^|
| / | search forward for |
| ? | search backward for |
| * | search forward for the word under the cursor |
| # | search backward for the word under the cursor |
^ Windows ^|
| :sp [fname] | horizontally split window, open or actually opened file |
| :vsp [fname] | vertically split window, open or actually opened file |
| :to vsp [fname] | vertically split window, but occupy the full height |
| ^ww | switch window focus |
| ^w= | equal sizes of all windows |
| ^wr | rotate windows |
| ^wR | rotate windows (other direction) |
| ^w_ | maximize focused window |
^ Folding ^|
| zr | increase foldlevel by one |
| zR | set foldlevel to max (remove all foldings) |
| zm | decrease foldlevel by one |
| zM | set foldlevel to 0 (close all foldings) |
| zX | update folds, apply foldlevel |
| zx | update folds, apply foldlevel and do ''zv'' |
| zo | open fold under Cursor |
| zO | open all folds under Cursor recursively |
| zc | close fold under Cursor |
| zC | close all folds under Cursor recursively |
| zv | unfold just enough to show line in which Cursor is located |
^ Vim Help Context ^|
| :h ^d | show help topics matching |
| ^5 | follow hyperlink |
| ^] | follow hyperlink |
| ^t | go back |
| ^o | go back |
===== Ranges =====
^ Example ^ Effect ^
| . | current line |
| 2,3 | all from line 2 till line 3 inclusively |
| ^,$ | all from beginning till end of file |
| +2,+3 | all from two lines after cursor till three lines after cursor |
===== Mappings =====
Mappings are a useful utility to define command aliases and little macros inside ''vim''.
==== Mapping Commands ====
commands: modes: ~
Normal Visual Operator-pending ~
:map :noremap :unmap :mapclear yes yes yes
:nmap :nnoremap :nunmap :nmapclear yes - -
:vmap :vnoremap :vunmap :vmapclear - yes -
:omap :onoremap :ounmap :omapclear - - yes
Insert Command-line Lang-Arg ~
:map! :noremap! :unmap! :mapclear! yes yes -
:imap :inoremap :iunmap :imapclear yes - -
:cmap :cnoremap :cunmap :cmapclear - yes -
:lmap :lnoremap :lunmap :lmapclear yes* yes* yes*
Excerpt from ''vim'' help context *map-modes*
==== Mapping Keycodes ====
The ''vim'' help context contains a list of codes for special keys:
:help keycodes
==== Samples ====
Defining a mapping is as simple as:
:imap try try {} catch(Exception e) {}3ko
The effect can be tested in ''insert'' mode, typing ''try''.
Removal of the mapping defined above is done via:
:iunmap try
===== cTags =====
Especially when debugging code, cTags are a wonderful tool when it comes to
manually tracing through the code flow. Creation of the tags-file is often as
simply as issuing a
make tags
or
ctags -R .
after that, one can jump to the definition of a code element by hitting ''^5''
or ''^[''. When the destination is not the expected one, it's helpful to check
alternative targets using '':ts'', then selecting an entry by entering the
corresponding number. Jump back using ''^t''.
==== ctags.vim ====
The script //ctags.vim// helps combining the power of cTags and vim. After
downloading it has to be placed inside one's plugin dir (e.g.
//~/.vim/plugin//).
For a quick start, the following two ex-commands have to be given to enable
the script's functionality:
:let g:ctags_statusline=1
:CTAGS
when everything was done right, the name of the function the cursor is
currently positioned at is printed in the status bar.
=== Seamless Integration in Vim ===
On my notebook, I've setup ''ctags.vim'' like so:
* save the script as //~/.vim/plugin/ctags.vim//
* create or edit the file //~/.vim/ftplugin/c.vim//:
let g:ctags_statusline=1
CTAGS
Now upon opening a file with suffix ''.c'', the plugin is automatically being
loaded and activated (leads to an error if no tags file was found, but nothing
fatal or disturbing).
===== Displaying Non-Printable Chars =====
Especially tabs and spaces are characters that can't be distinguished without
further help from vim. As this is often necessary (e.g. for a clean C Coding
Style), help is near:
Insert the following into your //.vimrc// to make the ''set list'' command
output more useful stuff:
" Show tabs, trailing spaces, long lines
"set list listchars=tab:>_,trail:_,extends:+ " ,eol:$
" disable it by default
set listchars=tab:>_,trail:_,extends:+ " ,eol:$
The code below adds some more invasive displaying. Not only because it's
enabled by default, but also because of the nice red colour. :-)
" show trailing spaces and spaces before tabs (this is better)
hi link localWhitespaceError Error
" match trailing spaces (being displayed right from the start)
"au Syntax * syn match localWhitespaceError /\s\+$/ display
" match trailing spaces, but not as soon as they are being typed
" au Syntax * syn match localWhitespaceError /\(\zs\%#\|\s\)\+$/ display
" same as above, but allow highlighting inside other syntax groups (comments for instance)
au Syntax * syn match localWhitespaceError /\(\zs\%#\|\s\)\+$/ display containedin=ALL
" show space before tab
au Syntax * syn match localWhitespaceError / \+\ze\t/ display containedin=ALL
===== Skeletons =====
Having skeletons (templates) when creating certain types of files is quite
easy thanks to vim's powerful scripting language:
au BufNewFile 0r
For instance, having a skeleton for tex letters at //~/.vim/skel/letter.tex//:
au BufNewFile *.letter.tex 0r ~/.vim/skel/letter.tex
will insert the skeleton's content into every new file with name matching
"*.letter.tex".
===== Links =====
* [[http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html|Graphical Cheat Sheet and tutorial]]
* [[http://www.vim.org/scripts/script.php?script_id=610|ctags.vim script]]
* [[http://vim.wikia.com/wiki/Accessing_the_system_clipboard|Accessing the System Clipboard]]
* [[http://vim.wikia.com/wiki/VimTip188|Search Patterns]]
* [[https://www.vim.org/scripts/script.php?script_id=1697|surround.vim script]]