Vim command pattern:

  1. register name (optional)
  2. repeats (optional)
  3. operation (eg y, d, etc)
  4. movement (doubling the operation takes the current line).

Tips:

  • Move by context, not position.
  • Do not search and scroll, do not use your eyes to find text.
  • If you're not searching, at least jump.
  • Never park in insert mode, immediately escape after editing.

INVOCATION

vim -o filename1, ...   Open multiple files in horizontally tiled windows.
vim -O filename1, ...   Open multiple files in vertically tiled windows.
vim -p filename1, ...   Open multiple files in separate tabs.

HELP

:help command   Split screen help
Ctrl-J          Follow link
Ctrl-T          Go back

MODES / EDITING

.               Repeat previous command.
<Esc>           Enter command mode.
i a             Enter insert mode before / after the cursor.
I A             Enter insert mode at the beginning / end of the current line.
o O             Enter insert mode in a new line under/above the current line.
r               Replace character under cursor and return to command mode.
R               Enter overtype (replace) mode.
C               Change the rest of the current line.
c               Change (retype) command. Follow with a movement command.
cc              Deletes the current line to register " and enters insert mode.
cw              Deletes the current word to register " and enters insert mode.
c              Change the rest of the current line.
s               Substitute the character under cursor and enter insert mode.
S               Delete line at cursor and substitute text (same as cc)
:               Enter ex mode.
!               Enter shell filter mode.
Ctrl-o command  Quick command in insert mode
Ctrl-R "        Paste in insert mode
J               Join line with following.

VISUAL MARKING MODES

                You can start in one visual mode and enter another,
                and continue to mark.
                The marked area becomes a context for other commands.
                Use the r command and letter X to change every
                character in the marked area to X.
                Use the marked area for the ex commands.
v               Start visual mode, mark lines, then do command (such as y-yank)
                Enter visual mode, mark character-wise.
                Use to select text.
                Press v again to cancel out the visual marking.
V               Start Linewise visual mode
                Enter visual mode, mark line-wise.
Ctrl+v          Start visual block mode
                Press V again to cancel this mode.
^v              Enter visual mode, mark column-wise.
gv              Re-mark the area last marked.
ggVG            Mark the entire document.
o               Move to other end of marked area
O               Move to Other corner of block
aw              Mark a word
ab              A () block (with braces)
aB              A {} block (with brackets)
ib              Inner () block
iB              Inner {} block
Esc             Exit visual mode

REGISTERS

:registers      List of registers
"+ "*           clipboard register / selection buffer
"               The unnamed or default register.
a-z,A-Z         The lowercase and uppercase letter registers.
+               The system default register (the normal cut/paste one).
_               The black hole, essentially /dev/null,
                use to avoid wiping out the " register.
(examples)
dd              Delete the current line into the default " register.
"add            Delete the current line into register a.
"y             Yank the current character to the end of the line into
                register y.
"byy            Yank the current line into register b.
"c24dd          Literally: into register c, 24 times delete the current line.

MOVEMENT

  k             Up one character.
h   l           Left / Right one character.
  j             Down one character.

b w             Move backward / forward to the start of the next word.
B W             Move backward / forward to the start of the next
                space-terminated word (ignore punctuation).
                or backward / forward one word if already at start.
e               Move to the end of word, or to next word if already at end.
E               Move to the end of space-terminated word, ignoring punctuation.

0              Move to the start /end of the line.

%               Move to matching brace, paren, etc.
{ }             Move to start / end (first empty line) of paragraph.
( )             Move to start of sentence / of next sentence
                (separator is both period and space).
[[ ]]           Move to next / previous function (c/c++/java/python).

H M L           Move to the first line / middle / last line of the screen.
<n>H            Move to line n from start of the screen.
<n>L            Move to line n from bottom of the screen.
^               Move to the first non-whitespace character on the line.

^f              Move forwards one page.
^b              Move backwards one page.

gg G            Go to beginning /end of file.
<n>gg           Go to line n.
<n>G            Go to line n.
:<n>            Go to line n.

<n>%            Go to nth percentage of file.
<n>|            Go to column n of current line.

*               Move to the next instance of word under cursor,
                and highlight all uses.
#               Move to the previous instance of word under cursor.
''              Move to the location of your last edit in the current file.

SCROLLING

Ctrl-E Ctrl-Y   scroll window down / up
zt zz zb        Scroll the cursor to top / middle / bottom of page.

JUMPING WITH THE CURSOR

:changes        changelist
g;              older
g,              newer position in the changelist
:jumps          jumplist
Ctrl-I Ctrl-O   forward / back in jumplist

SEARCHING

/ ?             Search forward / backward, will prompt for a regex pattern.
                Press enter to accept position.
n               Repeat last search.
N               Repeat last search but in the opposite direction.
tx              Move to letter x, stopping just before x.
                Useful for change/delete commands.
fx              Find letter x, stopping on the letter x.
                Useful for change/delete commands.
[i [I           Show first / every line containing word under cursor.
:g/pattern/     Show every line matching the regex pattern.

:<r>s/foo/bar/<a>
                Substitute foo with bar,
                <r> determines the range, can be:
                    nothing (work on the current line only),
                    number (work on the line whose number you give),
                    % (the whole file).
                <a> determines the arguments, can be:
                    g (replace all occurences in the line
                       without only replaces the first occurence in each line)
                    i (ignore case for the search pattern)
                    I (dont ignore case)
                    c (confirm each substitution, you can type
                        y to substitute the current match,
                        a to substitute this and all remaining matches, or
                        q to quit substitution).
(examples)
:452/foo/bar/   Replace the first occurence of foo with bar on line 452.
:s/foo/bar/g    Replace every occurence of foo with bar on the current line.
:%s/foo/bar/g   Replace every occurence of foo with bar in the whole file.
:%s/foo/bar/gi  Same as above, but ignore case.
:%s/foo/bar/gc  Confirm every substitution.
:%s/foo/bar/c   For each line on the file, replace the first occurence of foo
                with bar and confirm every substition.

UNDO/REDO

u               Undo last command.
U               Undo all the latest changes made to the current line.
CTRL-r          Redo.

CUT (DELETE), COPY (YANK), PASTE

x               Delete character under cursor.
xp              Transpose two letter (delete and paste, technically)
X               Delete character before the cursor (same as backspace).
d               Delete selected text.
dd              Delete line and put it into the default register.
:d              Same as above.
y               Yank selected text.
yy              Yank line.
:y              Same as above.
Y               Same as above.
p P             Paste contents of default register after / before cursor.
^r              In insert mode, reads data from a register and pastes
                it, continuing in insert mode.

COMPLETION

^n              In insert mode, complete a word (forward through choice list).
^p              In insert mode, complete a word (backward through choice list).
^x^l            In insert mode, complete a line.
^x^f            File name completion.
^x^k            Dictionary completion. Enable the dictioary by adding the line
                    set dictionary+=/usr/share/dict/words
:ab ab1 ab2     Set abbreviation. After this, while in insert mode, ab1 will be
                expanded into ab2 immediately after typing.
:ab teh the     A common error is fixed automatically.

INDENTING

<               Left-shift  (requires a movement command, works on whole lines).
>               Right-shift (requires a movement command, works on whole lines).
<}              Move a paragraph to the left.
3>>             Shift three lines right.
5>>             Indent 5 lines from line where cursor stands
^T              In insert/overwrite mode, indent.
^D              In insert/overwrite mode, dedent.

CODE REFORMATTING

%!astyle        Restyle the entire file with astyle (a reformatting program).
%!indent        Restyle the entire file with indent (a nice older program).
gqq             Re-wrap the current line (a double-jump).
gqj             Re-wrap the current line and the line following.
gq}             Re-wrap lines from the current line to the end of the paragraph.
:retab          Retabbing converts tab stops to spaces, and ensures correct
                indentation for each.
                Set the tabstop variable to the correct setting, set expandtab,
                and issue :retab command.
                Vim can wrap the text as you type, via the linebreak, textwidth,
                and autoindent settings.
~               Change the case of the character under the cursor.
                Works in visual mode.

CTAGS

!ctags -R *     Run ctags (better to do this in the makefile).
^]              Jump to the definition of the term under the cursor.
^t              Pop the browsing stack, return to the previous location.

VISUAL BLOCKS

Visual blocks are one of those features that you won't find in a GUI text
editor.
They let you mark blocks of text and do editing operations on them.
To enter visual blocks mode, press Ctrl+v, then use HJKL or arrow keys to
highlight a block of text.
Now operate on the first highlighted line as if you were in normal mode,
and operations will be reflected on other highlighted lines.
For example, to indent a block of text with > characters (to make it look
like a text being replied to), highlight the first column of characters in
visual blocks mode, then press Shift+i to switch to insert mode at the
beginning of the line.
Insert a > in the first line and press Ctrl+c.
A > will be prepended to all other highlighted lines.
This feature is also useful for commenting blocks of code, by prepending
lines with // or #.

CODE FOLDING

zf#j            creates a fold from the cursor down # lines.
zf/string       creates a fold from the cursor to string.
zj              moves the cursor to the next fold.
zk              moves the cursor to the previous fold.
zo              opens a fold at the cursor.
zc              To close it back, press zc.
zO              opens all folds at the cursor.
zm              increases the foldlevel by one.
zM              closes all open folds.
zr              decreases the foldlevel by one.
zR              decreases the foldlevel to zero -- all folds will be open.
zd              deletes the fold at the cursor.
zE              deletes all folds.
[z              move to start of open fold.
]z              move to end of open fold.

zf5j            Fold 5 lines.
kvggzf          Fold everything from the beginning up to the current line.
zfa}            To fold a code block marked by braces { },
                move the cursor into the block and press zfa}.

See :help z
    :help fdm

    set foldmethod=marker

    At the beginning of a function fragment, you can type ‘zfap’ to create a
    fold; this should add some {{{ }}} tags around your code in the comment of
    choice for the language you’re coding in.
    You can type ‘zo’ to open a fold, or I can just hit the right arrow key on
    the folded code marker.
    You can type ‘zc’ to close a fold.
    You can type ‘zr’ to open all folds.
    You can type ‘zm’ to close all folds.

MACROS (complex-repeat)

q               Enter macro recording mode by pressing the command q, followed
                by a register into
                which the macro will be stored.
                Any of the alphabetic upper or lower case keys, and any of the
                digits may be used.
                Every keystroke will be recorded into the macro until you press
                the q key again.
@               To replay a macro, use the @ key followed by a register name.
                Once a macro is replayed, the undo key will see that macro as a
                single action.
@@              Vim remembers the macro you just replayed, and can repeat it
                with the double-jump.
                The dot command will also see it as a single action.
                The recorded macros are just text in a register.
                They can be pasted into a document, edited, yanked back into
                the register, etc.
(examples)
qa              Start recording the macro to register a.

SPELL CHECKING

Turn on spellchecking with :set spell and turn off with :set nospell.

]s [s           move to the next / previous mispelled word
zg              add a word to the dictionary
zug             undo the addition of a word to the dictionary
z=              view spelling suggestions for a mispelled word
:help spell

BOOKMARKS

                Vim allows you to set a bookmark con a line, and jump from one
                bookmark to another.
                You can use any letter for a bookmark.
                Lower-case letters set a file-specific bookmark.
                'a in one file will take you to a different place than in
                another file.
                Upper-case letter set global bookmarks.
                'A will take you to the line you marked in the file you marked
                it, it loads the
                marked file in the current window.
mx              Put bookmark x at the current line.
'x              Jump to bookmark x.

FILE MANAGEMENT

:w              Save.
:w filename     Save a copy of the file you are editing as filename.
:wa             Save all windows.
:q              Quit.
:qa             Quit all windows.
:q!             Quit without saving.
:wq             Save and quit.
:x              Save and quit. If no changes were made, Vim exits without
                writing the file.
ZZ              Save changes and quit current window.
:o filename     Open file in current buffer.
:e filename     Open file in new buffer. Tab will autocomplete filenames.
:e!             Reload file from disk discarding changes.
:e#             Return to the previous window.
gf              Goto filename under cursor

BUFFER MANAGEMENT

:buffers        List buffers
:bn :bp         Next / previous buffer.
:bd             Delete a buffer (close a file).

WINDOW MANAGEMENT

:sp filename    Splits window horizontally and loads filename in the new window.
:vs filename    Splits window vertically and loads filename in the new windows.

^Wh ^Wj ^Wl ^Wk Move to window above / below / left / right.
^Wc             Close current window.
^Wo             Close all windows except current window.
^Wf             Place the cursor on a filename, and issue this command while in
                normal mode. The file will be loaded into a new window.
^W+             Increases the size of the current split by one line.
                Try combining this with counts.
^W-             Decreases the size of the current split by one line.
^W_             Maximize the current split.
:ls

TABS

:tabe           Open a file in a new tab.
Ctrl-W T        Move current split window into its own tab.

gt              Go to the next tab.
:tabn
:tabnext
CTRL-PageDown

gT              Go to the previous tab.
:tabp
:tabprev
CTRL-PageUp

Ngt             Go to tab N.
:tabr           Go to the first tab.
:tabl           Go to the last tab.

:tabc           Close tab.
:tabclose

:tabo           Close all tabs except current one.
:tabonly

:tabm <n>       Move tab to position <n>.
:tabmove <n>

VIMRC

:options
:browse options
:browse set

SHELL FILTERING

!!command  Pass current line only through filter.
!}command  Pass area from current lint through end of paragraph through filter.
!Gcommand  Pass are form current line through end of file through filter.
:%!command Pass the entire file through filter.

FILE EXPLORER

Edit a directory.

o               Open file in a horizontal split window.
v               Open file in a vertical split window.
i               Show more info.
s               Sort by column under cursor.
r               Sort in reverse order.
D               Delete file.
d               Make new directory.
<Enter>         Open file in current window.

MISCELANEOUS TRICKS

:g/^#/d                 Delete all lines that begins with #
:g/^/d                 Delete all lines that are empty and contain no tabs
:g/^\s*<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">/</span><span class="mord mathnormal">d</span><span class="mord mathnormal">De</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">e</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em;">lll</span><span class="mord mathnormal">in</span><span class="mord mathnormal">es</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ha</span><span class="mord mathnormal">t</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ree</span><span class="mord mathnormal">m</span><span class="mord mathnormal">pt</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span></span></span></span>/{ctrl-V}{CR}/g    Inserts blank line between lines
:%s/{TAB}*<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">//</span><span class="mord mathnormal">St</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">i</span><span class="mord mathnormal">pt</span><span class="mord mathnormal">ab</span><span class="mord mathnormal">s</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">in</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord">/</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8095em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">tt</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">/</span><span class="mord mathnormal">t</span></span></span></span>         Copy every line which matches pattern to the end of the
                        file

VIM MACROS

:%!column -t

:%!sort -k1

Matsumoto  Yukihiro  Ruby   1965  Japan
Moolenar   Bram      Vim    1961  Netherlands
Ritchie    Dennis    C      1941  USA
Stallman   Richard   GNU    1953  USA
Thompson   Ken       Unix   1943  USA
Tridgell   Andrew    Samba  1967  Australia
Wall       Larry     Perl   1954  USA

suppose we’ve got the task of replacing the fourth column of this table with
the approximate age of the person, which we can get naturally enough by
substracting their birth year from the current year.
This is a little awkward to do in pure ex, so we’ll record a macro for doing
it on one line.

03wdei^R=2013-^R"^M^[0j

0           — Move to the start of the line
3w          — Skip three words, in this case to the fourth column
de          — Delete to the end of the word
i           — Enter insert mode
^R=         — Insert the contents of the special = register, which accepts
              an expression to evaluate
2012-^R"^M  — Enter the expression 2012-(birth year) and press Enter
              (literal ^M), which completes the operation, and inserts the
              result
^[          — Leave insert mode
0           — Return to the start of the line
j           — Move down a line

The only thing that’s slightly voodoo (and certainly not vi-compatible) is
the arithmetic done with the special = register. You can read about that in
:help @=, if you’re curious.

REPEATING MACROS

As a first very simple hint, if you’re running a macro several times, don’t
forget that you can prepend a count to it; in our case, 6@a would have fixed
up all the remaining lines. To take advantage of this, it’s good practice to
compose your macros so that they make sense when run multiple times; in the
example above, note that the end of the macro is moving down onto the next
line, ready to run the macro again if appropriate.

Similarly, if you’ve already run a macro once, you can run the same one
again by just tapping the @ key twice, @@. This repeats the last run macro.
Again, you can prepend a count to this, @a5@@

TRUE NATURE OF MACROS

you needn’t restrict yourself to the single-keystroke vi commands for Vim
when you compose macros. You can include ex commands as well, for example
to run a substitution during a macro:

qb:s/foo/bar/g^Mq
@b

all of the operations that you can apply to registers in general work with
what we normally call macros, with the old standards, delete, yank, and
paste You can test this with the example macro demonstrated above, by typing
"ap,
which will dump the raw text straight into the buffer.
Also like other registers, it’ll show up in the output of the :registers
command.

EDITING VIM MACROS IN A BUFFER

suppose I realise partway through writing it that I made a mistake in
typing 2011 instead of 2012.
I finish recording the rest of the macro anyway, and dump the broken
keystrokes into a new scratch buffer:

:enew
"ap

This gives me the contents of the macro in plain text in the buffer:

qa03wdei^R=2011-^R"^M^[0jq

So now all I have to do is change that bad year to 2012, and then yank the
whole thing back into register a:

^"ay

Now I can test it directly with @a on the appropriate file, and if it’s
still wrong, I just jump back to my scratch buffer and keep fixing it up
until it works.

One potential snag here is that you have to enter keystrokes like Ctrl+R as
literal characters, but once you know you can enter any keystroke in Vim
literally in insert or command mode by prefixing it with Ctrl+V, that isn’t
really a problem. So to enter a literal Ctrl+R in insert mode, you type
Ctrl+V, then Ctrl+R.

RUNNING A VIM MACRO ON A SET OF LINES

It’s occasionally handy to be able to run a macro that you’ve got ready on a
specific subset of lines of the file, or perhaps just for every line.
Fortunately, there’s a way to do this, too.

Using the :normal command, you’re able to run macros from the ex command
line:

:normal @a
All it takes is prefixing this with any sort of range definition to allow
you to run a macro on any set of lines that you’re able to define.

Run the macro on each line of the whole buffer:

:% normal @a
Between lines 10 and 20:

:10,20 normal @a
On the lines in the current visual selection:

:'<,'> normal @a
On the lines containing the pattern vim:

:g/vim/ normal @a
When you get confident using this, :norm is a nice abbreviation to use.

MOVING A VIM MACRO INTO A FUNCTION

For really useful macros of your own devising, it’s occasionally handy to
put it into a function for use in scripts or keystroke mappings.
Here again the :normal command comes in handy.

Suppose I wanted to keep the age calculation macro defined above for later
use on spreadsheets of this kind.
I’d start by dumping it into a new buffer:

:enew
"ap
The macro appears as raw text:

03wdei^R=2012-^R"^M^[0j
I prefix it with a :normal call, and wrap a function definition around it:

function! CalculateAge()
    normal 03wdei^R=2012-^R"^M^[0j
endfunction
Then all I need to do is include that in a file that gets loaded during
Vim’s startup, possibly just .vimrc. I can call it directly from ex:

:call CalculateAge()
But given that I wanted it to be a quick-access macro, maybe it’s better to
bind it to \a, or whatever your chosen <leader> character is:

nnoremap <leader>a :call CalculateAge()<CR>
Saving a Vim macro

If you want to have a macro always available to you, that is, always loaded
into the appropriate register at startup, that can be done in your .vimrc
file with a call to let to fill the register with the literal characters
required:

let @a='03wdei^R=2012-^R"^M^[0j'

APPENDING EXTRA KEYSTROKES TO A VIM MACRO

If you just want to tack extra keystrokes onto an existing macro and don’t
care to edit it in a Vim buffer, you can do that by recording into it with
its capital letter equivalent. So, if you wanted to add more keystrokes
into the register b, start recording with qB, and finish with the usual q.

RECURSIVE VIM MACROS

If you’re crazy enough to need this, and I never have, there’s an excellent
Vim Tip for it. But personally, I think if you need recursion in your text
processing then it’s time to bust out a real programming language and not
Vimscript to solve your problem.

If the issue for which you think you need recursion is running a macro on
every line of a buffer with an arbitrary number of lines, then you don’t
need recursion; just record a one-line version of the macro and call it
with :% normal @a to run it on every line.

VIM MACRO GOTCHAS

Here are a few gotchas which will save you some frustration if you know
about them ahead of time:

When you have a hammer, everything starts to look like a nail. Don’t try to
solve problems with macros when there are better solutions in the ex
command set, or available in external programs. See the Vim koans page for a
couple of examples.
You need to insert keystrokes like Enter as literal Ctrl+M, so that they
look like ^M. The convenience abbreviations in mappings, like <CR>, simply
don’t work. You’re likely to find yourself chording Ctrl+V a lot.
Macros tend to stop, sometimes for apparently no reason and with no warning
messages, as soon as they hit some sort of error. One particularly annoying
instance of this is when you’re performing several substitutions in a macro,
because if it doesn’t find any instances of a pattern it will throw an error
and stop executing. You can prevent this by adding the e flag to the
substitution call:

:s/foo/bar/e

PLUGINS

ctags

With the ":tag" command the cursor will be positioned on the tag.  With the
CTRL-] command, the keyword on which the cursor is standing is used as the
tag.  If the cursor is not on a keyword, the first keyword to the right of the
cursor is used.

The ":tag" command works very well for C programs.  If you see a call to a
function and wonder what that function does, position the cursor inside of the
function name and hit CTRL-].  This will bring you to the function definition.
An easy way back is with the CTRL-T command.  Also read about the tag stack
below.

*:ta* *:tag* *E426* *E429*

:[count]ta[g][!] {ident}
            Jump to the definition of {ident}, using the
            information in the tags file(s).  Put {ident} in the
            tag stack.  See |tag-!| for [!].
            {ident} can be a regexp pattern, see |tag-regexp|.
            When there are several matching tags for {ident}, jump
            to the [count] one.  When [count] is omitted the
            first one is jumped to. See |tag-matchlist| for
            jumping to other matching tags.

<C-LeftMouse>
            *<C-LeftMouse>* *CTRL-]*

CTRL-]      Jump to the definition of the keyword under the
            cursor.  Same as ":tag {ident}", where {ident} is the
            keyword under or after cursor.
            When there are several matching tags for {ident}, jump
            to the [count] one.  When no [count] is given the
            first one is jumped to. See |tag-matchlist| for
            jumping to other matching tags.
            {Vi: identifier after the cursor}
CTRL+[      Navigate to tag under cursor.

:tag <tag name>
Navigate to named tag.
:pop
Tag jumps are saved on a stack; this command pops the top of the stack and
returns to the previous cursor position.
:tnext
For tags that resolve to multiple source locations, jumps to the next such
location.
:tprev
Idem, but jumps to previous such location.

Now you need to configure taglist.vim, this can be done like this:

let Tlist_Ctags_Cmd = "/usr/bin/ctags"
let Tlist_WinWidth = 50
map <F4> :TlistToggle<cr>

map <F8> :!/usr/bin/ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>

This builds tags libs for the current working directory (it's super fast).

Once you have build tags, you can browse them using builtin functions.
Here are some examples:

:tag getUser => Jump to getUser method
:tn (or tnext) => go to next search result
:tp (or tprev) => to to previous search result
:ts (or tselect) => List the current tags
=> Go back to last tag location
+Left click => Go to definition of a method





1. Navigate to function definition by specifying the function name using :ta
2. Navigating to the function definition from ‘function call’ using Ctrl + ]
3. Returning back again to function call from the definition using Ctrl + t
4. Navigating through a list of function names which has the similar names
:ta /^get

Following vim commands can be used to navigate through relevant functions

:ts – shows the list.
:tn – goes to the next tag in that list.
:tp - goes to the previous tag in that list.
:tf – goes to the function which is in the first of the list.
:tl – goes to the function which is in the last of the list.

1. Open the Tag List Window in Vim using :TlistOpen

# vim mycprogram.c
:TlistOpen

3. Jump to the function definition which is in another source file

When you are going through a function in a source file and would want to go to
the function definition which is in another file, you can do this in two
different methods.

Method 1:
If you had the ctags generated for that file, when the cursor is in the function
call pressing CTRL + ] will take you to the function definition.
And automatically the tag list window will show the tags for that newly opened
file.

Method 2:
Open another file also in the same vim session which will update the tag list
window with the information about that file. Search for that function name in
the tag list window, and by pressing <CR> on that function name in the tag list
window you can go to the function definition..


4. Viewing the prototype/signature of functions or variables.

Press ‘space’ in the function name or in the variable name in the tag list
window to show the prototype (function signature) of it in the VIM status bar
as shown below. In the example below, click on selectDumpableTable function from
the Tag-window and press space-bar, which displays the function signature for
selectDumptableTable function in the bottom Vim Status bar.

5. Viewing the total number of functions or variables in a source code file

press ‘space’ in the tag type in the tag list window, which shows the count of
it. In the example below, when the cursor is at ‘function’ press space, which
will display the total number of functions in the current source code.

C-] - go to definition
C-T - Jump back from the definition.
C-W C-] - Open the definition in a horizontal split

Add these lines in vimrc
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

C-\ - Open the definition in a new tab
A-] - Open the definition in a vertical split

After the tags are generated. You can use the following keys to tag into and
tag out of functions:

Ctrl-Left_MouseClick - Go to definition
Ctrl-Right_MouseClick - Jump back from definition



Another useful plugin for C development is cscope Just as Ctags lets you jump
to definitions, Cscope jumps to the calling functions.

If you have cscope in your ~/bin/ directory, add the following to your .vimrc
and use g^] to go to the calling function (see :help cscope).

if has("cscope")
    set csprg=~/bin/cscope
    set csto=0
    set cst
    set nocsverb
    " add any database in current directory
    if filereadable("cscope.out")
        cs add cscope.out
        " else add database pointed to by environment
    elseif CSCOPE_DB != ""
        cs add CSCOPE_DB
    endif
endif

Almost forgot... Just as ctags - you have to generate (and periodically update)
the database. I use the following script

select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files

Where 'select_files' is another script that extracts the list of C and header
files from the Makefile. This way I index only the files actually used by the
project.

TIPS

--------------------------------------------------------------------------------
Join all paragraphs in a file,
without deleting the blank lines separating paragraphs

    Make sure the file ends in a blank line.
    :g/^./ .,/^/-1 join

--------------------------------------------------------------------------------
Character search is near-instant for moving within a line

The f, F, t, T, ;, and , commands make up the suite of character search motions.
When you press f{char}, Vim looks forward from the cursor position for the next
occurrence of {char} on the current line. If it finds a match, the cursor moves
directly there. If no match is found, nothing happens.

If your cursor stopped on a match before the one you were aiming for, press ; to
repeat the search. Keep pressing ; until you hit your mark. If you overshoot,
press , to reverse the search.

--------------------------------------------------------------------------------
Commenting a block of Python code

Alternative 1:
    C-v
    <move around selecting text>
    I
    #
    Esc

    j is cursor down, so he's just selecting down 3 lines while in visual block
    mode.
    Shift+i means insert before the first non-whitespace character on the line,
    but it has a sort of special-case use while in visual mode, in that it will
    insert before the block selection on all lines thereof. # is just inserting
    the # character. Esc ends the visual mode, and also finalizes the insertion
    from shift+i, which also inserts the # in the right place on the remaining
    lines before it finishes.

    To uncomment:
    ctrl+v over the top #
    <move around selecting text>
    x

Alternative 2:
    Mark the block you want to comment, then type
    :s/^/#/
    That replaces the start of each line with a #.
    To uncomment, mark the block again, and do
    :s/.//
    This replaces the first character of each line with nothing.

Alternative 3:
    I put this in my .vimrc

    map ^V^_ a^V^_^V^[
    map ,4 :s/^/\/\//g<CR>
    map ,3 :s/^/##/g<CR>
    map .4 :s/^\/\///g<CR>
    map .3 :s/^##//g<CR>
    " wrapping comments
    map ,* :s/^\(.*\)/\/\* \1 \*\//<CR>
    map ,( :s/^\(.*\)/\(\* \1 \*\)/<CR>
    map ,< :s/^\(.*\)/<!-- \1 -->/<CR>
    map .< :s/^\(.*\)/<!-- \1 -->/<CR>
    map ,d :s/^\([/(]\*\\|<!--\) \(.*\) \(\*[/)]\\|-->\)/\2/<CR>

    So that if I want to comment one line, while in command mode I
    type ,3 for ## comments, then to uncomment I type .3
    If I'm on the top line of a bock of code, that is say 7 lines
    deep I type 7,3 which would comment out 7 lines of code.

Alternative 4:
    I used comment.vim. It's very nice as you can select lines and
    toggle commenting on/off.
    Very easy to use. Type "co" in command mode.
    Works on single lines, visual blocks, etc.
    You can also add custom comment tags (see end of .vim file)

--------------------------------------------------------------------------------
Remove unwanted spaces

Alternative 1: Simple commands to remove unwanted whitespace

    In a search,
    \s finds whitespace (a space or a tab),
    \+ finds one or more occurrences.

    :%s/\s\+//     Delete all trailing whitespace (at the end of each line)
    :%s/^\s\+//     Delete whitespace at the beginning of each line.
    :%le            Same thing (:le = :left = left-align given range):

    With the following mapping you can press F5 to delete all
    trailing whitespace.
    The variable _s is used to save and restore the last search
    pattern register (so next time you press n you will continue your
    last search), and :nohl is used to switch off search highlighting
    (so trailing spaces won't be highlighted while you are typing).
    The e flag is used in the substitute command so no error is shown
    if trailing whitespace is not found.

    :nnoremap <silent> <F5> :let _s=@/<Bar>:%s/\s\+<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">//</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">e</span><span class="mord mathnormal">t</span><span class="mord">@/</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel">=</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">n</span><span class="mord mathnormal">o</span><span class="mord mathnormal">h</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">CR</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal">lt</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal">na</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">e</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal">i</span><span class="mord mathnormal">s</span><span class="mord mathnormal" style="margin-right:0.01968em;">pl</span><span class="mord mathnormal">a</span><span class="mord mathnormal">yorre</span><span class="mord mathnormal">m</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">e</span><span class="mord mathnormal">u</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">an</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">hi</span><span class="mord mathnormal">t</span><span class="mord mathnormal">es</span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ce</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ha</span><span class="mord mathnormal" style="margin-right:0.02778em;">scr</span><span class="mord mathnormal">i</span><span class="mord mathnormal">pt</span><span class="mord mathnormal">Here</span><span class="mord mathnormal">i</span><span class="mord mathnormal">s</span><span class="mord mathnormal">am</span><span class="mord mathnormal">oree</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">ab</span><span class="mord mathnormal" style="margin-right:0.02778em;">or</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">p</span><span class="mord mathnormal">roce</span><span class="mord mathnormal">d</span><span class="mord mathnormal">u</span><span class="mord mathnormal">re</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ha</span><span class="mord mathnormal">t</span><span class="mord mathnormal">c</span><span class="mord mathnormal">an</span><span class="mord mathnormal">d</span><span class="mord mathnormal">i</span><span class="mord mathnormal">s</span><span class="mord mathnormal" style="margin-right:0.01968em;">pl</span><span class="mord mathnormal">a</span><span class="mord mathnormal">yorre</span><span class="mord mathnormal">m</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">e</span><span class="mord mathnormal">u</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">an</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">hi</span><span class="mord mathnormal">t</span><span class="mord mathnormal">es</span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ce</span><span class="mord">.</span><span class="mord mathnormal">Here</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">&quot;</span><span class="mord mathnormal">u</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">an</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord">&quot;</span><span class="mord mathnormal">m</span><span class="mord mathnormal">e</span><span class="mord mathnormal">an</span><span class="mord mathnormal">s</span><span class="mord mathnormal">an</span><span class="mord mathnormal">ys</span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ces</span><span class="mord mathnormal">b</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">ore</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ab</span><span class="mord mathnormal">c</span><span class="mord mathnormal">ha</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">a</span><span class="mord mathnormal">c</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">or</span><span class="mord mathnormal">an</span><span class="mord mathnormal">ys</span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em;">ceor</span><span class="mord mathnormal">t</span><span class="mord mathnormal">aba</span><span class="mord mathnormal">tt</span><span class="mord mathnormal">h</span><span class="mord mathnormal">ee</span><span class="mord mathnormal">n</span><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">in</span><span class="mord mathnormal">e</span><span class="mord">.</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">u</span><span class="mord mathnormal">n</span><span class="mord mathnormal">c</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">h</span><span class="mord mathnormal">o</span><span class="mord mathnormal">wSp</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ces</span><span class="mopen">(</span><span class="mord">...</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">e</span><span class="mord mathnormal">t</span><span class="mord">@/</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord">&quot;</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mopen">(</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">s</span><span class="mord">+</span></span></span></span>)|( +\\ze\\t)"
          let oldhlsearch=&hlsearch
          if !a:0
            let &hlsearch=!&hlsearch
          else
            let &hlsearch=a:1
          end
          return oldhlsearch
        endfunction

        function TrimSpaces() range
          let oldhlsearch=ShowSpaces(1)
          execute a:firstline.",".a:lastline."substitute ///gec"
          let &hlsearch=oldhlsearch
        endfunction

        command -bar -nargs=? ShowSpaces call ShowSpaces(<args>)
        command -bar -nargs=0 -range=% TrimSpaces <line1>,<line2>call TrimSpaces()
        nnoremap <F12>     :ShowSpaces 1<CR>
        nnoremap <S-F12>   m`:TrimSpaces<CR>``
        vnoremap <S-F12>   :TrimSpaces<CR>

Alternative 3: An alternative function simulating manual steps:

    However, this has minor side-effects, such as influencing undo
    history and sometimes changing scroll position.

        function StripTrailingWhitespace()
          if !&binary && &filetype != 'diff'
            normal mz
            normal Hmy
            %s/\s\+$//e
            normal 'yz<CR>
            normal `z
          endif
        endfunction

Alternative 4: Automatically removing all trailing whitespace

    Just put the following line in your vimrc file.
    Everytime you issue a :w command, Vim will automatically remove
    all trailing whitespace before saving.

    autocmd BufWritePre * :%s/\s\+//e

    This is a very dangerous autocmd to have! This will *always*
    strip trailing whitespace from *every* file you save.
    Sometimes, trailing whitespace is desired, or even essential!
    For example, if in your .vimrc you have the following:

        set wrap
        set linebreak
        " note trailing space at end of next line
        set showbreak=>\ \ \

    then saving your .vimrc will make it use ">  \" instead of
    ">   " to prepend to wrapped lines!

    Remember you can also specify filetype

        autocmd BufWritePre *.pl :%s/\s\+//e

    or how about having this operate when you enter the file:

        autocmd BufEnter *.php :%s/\s\+<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0913em;vertical-align:-0.25em;"></span><span class="mord">//</span><span class="mord mathnormal">e</span><span class="mord mathnormal">A</span><span class="mord mathnormal">n</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">e</span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">s</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">e</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">i</span><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">t</span><span class="mord mathnormal">h</span><span class="mord mathnormal">ose</span><span class="mord mathnormal">p</span><span class="mord mathnormal">es</span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">M</span></span></span></span></span></span></span></span><span class="mord mathnormal">a</span><span class="mord mathnormal">tt</span><span class="mord mathnormal">h</span><span class="mord mathnormal">es</span><span class="mord mathnormal">am</span><span class="mord mathnormal">e</span><span class="mord mathnormal">t</span><span class="mord mathnormal">im</span><span class="mord mathnormal">e</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal">oc</span><span class="mord mathnormal">m</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">u</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal">n</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">.</span><span class="mord mathnormal">p</span><span class="mord mathnormal">h</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span></span></span></span>//e

    With a ":call" instead of ":%s" (keep last used search/replace)
    and using FileType:

        autocmd FileType c,cpp,java,php autocmd BufWritePre <buffer> :call setline(1,map(getline(1,"<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord">&quot;</span><span class="mclose">)</span><span class="mpunct"><span class="mpunct">,</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">s</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">&quot;</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">+</span></span></span></span>","","")'))

Comments

********************************************************************************
Here's what I use in my .vimrc:

    " Removes trailing spaces
    function TrimWhiteSpace()
      %s/\s*//
      ''
    :endfunction

    set list listchars=trail:.,extends:>
    autocmd FileWritePre * :call TrimWhiteSpace()
    autocmd FileAppendPre * :call TrimWhiteSpace()
    autocmd FilterWritePre * :call TrimWhiteSpace()
    autocmd BufWritePre * :call TrimWhiteSpace()

    map <F2> :call TrimWhiteSpace()<CR>
    map! <F2> :call TrimWhiteSpace()<CR>

********************************************************************************
My preferred setting of list and listchars:

    set list listchars=tab:»·,trail:·

Or try

    set list lcs=tab:·⁖,trail:¶

********************************************************************************

There is one occasion where I want to keep my trailing space.
But even in those documents, I want to keep it in only one place, and not every
occurrence.

Here is my substitution pattern:

    s/\(^--\)\@<!\s*//

This will eliminate all trailing whitespaces except for the one in an email
signature marker (-- ).
In the function in the tip, this expands to:

    execute a:firstline.",".a:lastline."substitute /\\(^--\\)\\@<!\\s*<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord">//</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">e</span><span class="mord">&quot;</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">so</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">o</span><span class="mord mathnormal">u</span><span class="mord mathnormal">n</span><span class="mord mathnormal">d</span><span class="mord mathnormal">t</span><span class="mord mathnormal">h</span><span class="mord mathnormal">e</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal">oc</span><span class="mord mathnormal">m</span><span class="mord mathnormal">d</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal" style="margin-right:0.02778em;">or</span><span class="mord mathnormal">kb</span><span class="mord mathnormal">e</span><span class="mord mathnormal">tt</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal" style="margin-right:0.03148em;">ik</span><span class="mord mathnormal">e</span><span class="mord mathnormal">t</span><span class="mord mathnormal">hi</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal">oc</span><span class="mord mathnormal">m</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord mathnormal">re</span><span class="mord">∗</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">im</span><span class="mord mathnormal">Sp</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ces</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal">oc</span><span class="mord mathnormal">m</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">e</span><span class="mord mathnormal">A</span><span class="mord mathnormal">pp</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord mathnormal">re</span><span class="mord">∗</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">im</span><span class="mord mathnormal">Sp</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ces</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal">oc</span><span class="mord mathnormal">m</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mord mathnormal">i</span><span class="mord mathnormal">lt</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord mathnormal">re</span><span class="mord">∗</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">im</span><span class="mord mathnormal">Sp</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ces</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal">oc</span><span class="mord mathnormal">m</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">u</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord mathnormal">re</span><span class="mord">∗</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0019em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">im</span><span class="mord mathnormal">Sp</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ces</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mord mathnormal">akin</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">a</span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">an</span><span class="mord mathnormal">t</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">eo</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">t</span><span class="mord mathnormal">h</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal">lt</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">an</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">in</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal">in</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">e</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">a</span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">sco</span><span class="mord mathnormal">mman</span><span class="mord mathnormal">dd</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">ini</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal">m</span><span class="mord mathnormal">o</span><span class="mord mathnormal">d</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">i</span><span class="mord mathnormal">e</span><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span class="mord mathnormal">eo</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">t</span><span class="mord mathnormal">h</span><span class="mord mathnormal">e</span><span class="mord mathnormal">ab</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal" style="margin-right:0.02778em;">escr</span><span class="mord mathnormal">i</span><span class="mord mathnormal">pt</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">e</span><span class="mord mathnormal">tt</span><span class="mord mathnormal">h</span><span class="mord mathnormal">e</span><span class="mord mathnormal">u</span><span class="mord mathnormal" style="margin-right:0.02778em;">ser</span><span class="mord mathnormal">kn</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">hi</span><span class="mord mathnormal">t</span><span class="mord mathnormal">es</span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ce</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">a</span><span class="mord mathnormal">s</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">o</span><span class="mord mathnormal">u</span><span class="mord mathnormal">n</span><span class="mord mathnormal">d</span><span class="mord">&quot;</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord mathnormal">o</span><span class="mord mathnormal">ma</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">c</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em;">ll</span><span class="mord mathnormal">yre</span><span class="mord mathnormal">m</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord mathnormal">e</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">ai</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">in</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">hi</span><span class="mord mathnormal">t</span><span class="mord mathnormal">es</span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ce</span><span class="mord mathnormal">b</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">ore</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">u</span><span class="mord mathnormal">n</span><span class="mord mathnormal">c</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span class="mclose">!</span><span class="mord mathnormal">St</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.13889em;">pT</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">ai</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">in</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">Whi</span><span class="mord mathnormal">t</span><span class="mord mathnormal">es</span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ce</span><span class="mopen">(</span><span class="mclose">)</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.02778em;">or</span><span class="mord mathnormal">ma</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">m</span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span>//e
      if line("'Z") != line(".")
        echo "Stripped whitespace\n"
      endif
      normal `Z
    endfunction
    autocmd BufWritePre *.cpp,*.hpp,*.i :call StripTrailingWhitespace()

--------------------------------------------------------------------------------
Did you know... http://vim.wikia.com/wiki/Did_you_know

May 2010

  @: will repeat a colon (Ex) command (and @@ will repeat again).
  You can use :g/^\s*$/;//-1sort to sort each block of lines in a file.
  It's useful to map . .`[ to repeat the last command and put the cursor at
  start of change.
  You can open a web browser with the URL in the current line.
  With --remote-send you can close a Vim you left open remotely.
  If you're used to Perl regex, you can use Perl compatible regular expressions.
  In insert mode, Ctrl-Y inserts the character above. You can make it insert the
  word above.
  A user-defined command can evaluate :Calc sin(pi/2).
  It's sometimes better to not use the slash delimiter for :s/old/new/.
  You can drag & drop one or more files into gvim.

April 2010

  zz scrolls the current line to the middle of the screen; scrolloff can keep it
  there.
  Vim can do calculations using Python, Perl or bc.
  You can wrap long lines while moving the cursor by screen lines.
  A tricky search can find text that does not match.
  Pressing % jumps to a matching bracket, aof the number column.
  It's easy to change text between lowercase and UPPERCASE.
  The command history allows you to repeat several commands, possibly after
  editing them.

March 2010

  Vim tutorials has videos illustrating simple and advanced topics.
  Use % to jump to the matching bracket, and more.
  Use :lcd %:p:h to change directory to the file in the current window.
  ga shows the ascii value of the current character.
  You can list changes to the current file, even old changsy to count the words
  in a file or block.
  You can even make a frequency table counting the occurrences of each word!

February 2010

  Vim tutorials has videos illustrating simple and advanced topics.
  You can press * to search for the current word.
  Ctrl-A can increment numbers.
  After typing a couple of characters, you can complete a word with
  Ctrl-N or Ctrl-P.
  Vim's help use prefixes like v_ (visual mode) to show the context.ckspace and
  other delete keys work in insert mode.
  The 'number' and 'numberwidth' options control the display of line numbers.
  It's easy to change text between lowercase and UPPERCASE.

January 2010

  Vim tutorials has videos illustrating simple and advanced topics.
  We have an explanation for how :g/^/m0 reverses all lines.
  In a search pattern, \_s matches a space or tab or newline character.
  A script can use a test like &buftype == "quickfix" to check if it is
  operating in the quickfix winduse :nnoremap Y y.
  A plugin should set its "loaded" variable to show its version, for example
  let g:loaded_dbext = 503.
  We have a short FAQ for new users concerning common issues raised at #vim.
  You can use :cnoremap to map a key to <C-\>e(...)<CR> which will replace the
  command line with the (...) expression.</CR>

* Save a file you edited in vim without the needed permissions
  :w !sudo tee %

* Spellchecker
  ':set spell' activates vim spellchecker.
  Use ']s' and '[s' to move between mistakes,
  'zg' adds to the dictionary,
  'z=' suggests correctly spelled words

* check my .vimrc http://tiny.cc/qxzktw and here http://tiny.cc/kzzktw for more