Commands:
  ZZ                -- write out and exit
  75 i ! <Esc>      -- insert "!" 75 times
  75 a ! <Esc>      -- append "!" 75 times
  Ctrl-]            -- move to |hyperlink|
  Ctrl-O            -- come back from hyperlink

  Help:
    :help index       -- complete index of all Vim commands
    :help Ctrl-W      -- find help with window management command
    :help usr_toc.txt -- all user manuals breef look


  Word / file navigation (3):
    fh | 3fl        -- move cursor to the "h" letter of the current line
    f<Esc>          -- aborts search
    Fh | 3Fl        -- like above, but searches to the left
    tl | 3tl        -- like fh, but cursor stops before the letter
    Tl | 3Tl        -- like above, but searches to the left
    ge              -- moves to the previous end of the word
    $ | 5$          -- to the end of the line
    ^               -- to begin of the first word in line
    0               -- to begin of the line
    25%             -- moves you to the 1/4 of the file
    H               -- move cursor to the top line of the current window
    M               -- move cursor to the middle line of the current window
    L               -- move cursor to the bottom line of the current window
    Ctrl-G          -- get where you are in the file
    zt              -- like below, but to the top
    zz              -- moves context to the middle of the current cursor pos 
    zt              -- like above, but to the bottom
    *               -- finds word under cursor in the file
    #               -- same like above, but to the other direction
    /the\>          -- finds only words that ends in "the "
    /\<the\>        -- finds only " the " matches
    ``              -- go to the prev position (mark, mark -- pos before jump)
    Ctrl-O          -- go to the previous jump (mark)
    Ctrl-I          -- go to the next jump (mark)
    m[a-z]          -- set mark with letter name
    '[a-z]          -- move to the row with the mark
    `[a-z]          -- move to the row and column with the mark
    :set hlsearch   -- will highlight all matches
    :set ignorecase -- to ignore letter case during searches
    :set number     -- show line numbers :set nonumber   -- unshow line numbers :set ruler      -- show in the bottom right corner where is your cursor
    :marks          -- see all available marks
    :marks p        -- to see where mark are specified
    :marks pF       -- to see where several marks are specified


  Making small changes (4):
    d$              -- deletes to the end of the line
    cc              -- like dd, but changes line
    c$              -- changes all to the end of the line
    X               -- delete prev symbol
    D               -- delete to the end of the line
    C               -- change to end of the line
    s               -- change one character
    S               -- change a whole line
    r | 4rx         -- replace current symbol, not enters in insert mode
    .               -- repeat the change
    O | o           -- in visual mode goes to the other corner of selected
    y               -- yank operator. yw - yank word, y2w - yank 2 words
    Y | yy          -- yank whole line
    y$              -- yank to the end of the line
    iw | aw         -- Call to word text object. iw - "Inner word",
                       aw - "A word" (Try to use in visual mode or delete).
    daw             -- delete a word. You can use it even in a mid of the word
    is | as         -- Call to sentence text object. "as" includes space after
                       is - "Inner Sentence", as - "A Sentence"
    cis             -- change whole sentence
    R               -- enter in replace mode. backspace works like undo.
    ~               -- Change case of the character under cursor
    I               -- insert to the begin of the line
    A               -- append to the end of the line


  Editing more than one file (7):
    :edit foo.txt   -- opens other file instead of current
    :write          -- save current file delta
    :edit! foo.txt  -- force to discard your changes
    vim one.c two.c three.c -- open a sequence of files
    :next           -- switch to next file
    :next!          -- like above, but not save changes
    :wnext          -- like above, but save changes
    :args           -- see the files you started Vim with
    :previous
    :wprevious
    :last
    :first
    :2next
    :set autowrite  -- always write to modified files after switch
    :set noautowrite -- turn off write to modified files
    :args one.c six.c -- redefine the list of files without the need to
                         exit Vim and start it again
    :args!          -- abandon the changes
    Ctrl-^          -- back to previous file
    `.              -- jump to position where you did the last change
    "fyas           -- use f register for yank to in sentence
    "l3Y            -- yank three whole lines to the l register
    "fp             -- put register buffer to the cursor position
    "wdaw           -- delete text to register
    :write >> myfile -- append current file to another file. To append only
                        few lines do it in visual mode.
    vim -R file     -- open file in readonly mode. Can edit it by appending
                       ! to the write command
    vim -M file     -- do it to forbid making any changes in a file
    :saveas move.c  -- to save current file to the other file and start
                       edit other file


  Splitting windows (8). Skipped 8.07 about vimdiff:
    Always starts from Ctrl-W
    Ctrl-W h        -- to the left window
    Ctrl-W j        -- to the bottom window
    Ctrl-W l        -- to the top window
    Ctrl-W l        -- to the right window
    Ctrl-H H        -- move window to left
    Ctrl-H J        -- move window to bottom
    Ctrl-H K        -- move window to top
    Ctrl-H L        -- move window to right
    :qall           -- close all winfows
    :wall           -- write all changes
    :wqall          -- write and close all files
    :qall           -- close Vim and throw all changes
    vim -o|-O       -- open several files in split mode
    :[vertical] all -- open args files in split mode
    vimdiff one.c two.c -- open in diff mode
    :leftabove {cmd} -- left or above the current window
    :aboveleft {cmd} -- idem
    :rightbelow {cmd} -- right or below the current window
    :belowright {cmd} -- idem
    :topleft {cmd}  -- at the top or left of the Vim window
    :botright {cmd} -- at the bottom or right of the Vim window
    :tabedit        -- open another file in tabe mode
    gt              -- go to the next tab
    gT              -- go to the previous tab
    :tabonly        -- to close all other tabs


  Making big changes (10):
    q[a-z]          -- start and end record commands
    @[a-z]          -- execute recorded command
    @@              -- execute previous executed recorded command
    Example:
      qa        Start recording a macro in register a.
      ^         Move to the beginning of the line.
      i#include "<Esc>	Insert the string #include " at the beginning
                of the line.
      $         Move to the end of the line.
      a"<Esc>       Append the character double quotation mark (")
                to the end of the line.
      j         Go to the next line.
      q         Stop recording the macro.

    You can paste command records and edit them, than yank them to register
        again.
    You can append to a register by using uppercase letter. "aY "AY
    :s/x/y          -- substitute first occurrence on current line
    :s/x/y/g        -- substitute every occurence on the current line
    :%s             -- substitute on all lines
    :%s/x/y/c       -- ask about any substitution
    :%s/x/y/p       -- print out last line, that this command changes
    :s+one/two+one or two+ -- use "+" delimiter in substution
    Command ranges:
      :1,5s/this/that/g -- substitute on 1-5 lines. Line 5 is included
      :54s/this/that/   -- substitute on one line
      :.write otherfile -- write only current string to file
      :.,$s/yes/no      -- substitute in the lines from the cursor to the end
      :?^Chapter?,/^Chapter/s=grey=gray=g -- substitute in range between word
                                                 "Chapter"
      There is also offsets before and after the word
      :'t,'b            -- you can also use marks as the range borders
      :5                -- change current and next 4 lines

    :[range]global/{pattern}/{command} | g:
      Find a match for a pattern and execute command there.
      g+//+s/foobar/barfoo/g -- replace word in all lines with // (C++ style)
    Ctrl-V A        -- append text after visual block
    Ctrl-V $A       -- append text in the end of every string in visual blck
    Ctrl-V C        -- change text
    Ctrl-V ~        -- swap case
    Ctrl-V U        -- make uppercase
    Ctrl-V u        -- make lowercase
    Ctrl-V r        -- fill the whole block with one character
    :read file.txt  -- the file named "file.txt" will be inserted in cursor
                         place
    gUw             -- make word all uppercase
    guw             -- make word all lowercase 
    gUU             -- make whole line uppercase
    guu             -- make all line lowercase
    g~~             -- switch case in whole line
    :read !ls       -- read the contents of the current directory to the
                       cursor
    Ctrl-L          -- redrow the screen


  Clever tricks (12):
    Doe, John => John Doe   -- :%s/\([^,]*\), \(.*\)/\2 1/
    VISUAL SELECT -> :!sort -- will sort lines
    K                       -- opens "man" program on the word
    :%s/\s\+$//             -- deletes white spaces in the end of lines
    vim `grep -l frame_counter *.c -- open files with "frame_counter" var
        use :next and :first to browse through the files
    :grep error_string *.c  -- open files with concrete variable.
        use :cn(ext), :cp(rev), :cl(ist), :copen, :cfirst, :clast, :ccNUM goto


  Typing command-line commands quickly (20):
    During switches in command with TAB you can use CTRL-P to switch in
      other direction.
    Type few letters in command mode and press CTRL-D to see overview.
    :se<Up> -- go to previous command which starts with se

  Go away and come back (21):
    CTRL-Z          -- suspends vim, after that you can use `fg` to restore vim
    :!{program}     -- execute program
    :r !{program}   -- execute program and print its output to vim
    '0 '1 ...       -- Come back to the place, where you left Vim previous time
    :oldfiles than :e #<2 to edit the second file; :split #<3
    :browse oldfiles than q than number of file -- to open previous file
    :wviminfo! ~/tmp/viminfo in 1 vim than :rviminfo ~/tmm/viminfo in 2 vim
                    -- to save and restore information while still running Vim 
    :mksession vimbook.vim -- create a session file
    :source vimbook.vim or vim -S vimbook.vim -- restore session
    Example of project switching:
      :wall
      :mksession! ~/.vim/secret.vim
      :source ~/.vim/boring.vim

  Finding the file to edit (22):
    edit .   -- browse current directory
    :cd      -- changes current directory
    :pwd     -- show current directory
    :lcd     -- to change current directory, unti :lcd usage all windows points
                to same directory
    gf       -- finds file with same name in current directory or in the PATH
    :buffers -- list active buffers
    :ls      -- -||-
    There is also information about buffer editing and switching over them,
      but I'am too lazy to conspect it.

  Editing other files (23):
    vim -x exam.txt -- create, edit and save encrypted file
    :set key=       -- to turn off encryption
    :X              -- encrypt current file
    Change binary file example:
      vim -b datafile -- open file for binary editing
      :%!xxd          -- translate to HEX view
      :%!xxd -r       -- back to raw binary view
    BTW it's possible to edit compressed formats (.Z, .gz, .bz2)

  Making corrections (24):
    CTRL-W -- delete word (in insert mode)
    CTRL-U -- delete until beginning (in insert mode)
    CTRL-P -- complete the word or repeate previous. (P)revious
    CTRL-N -- complete the word. (N)ext
    There is OMNI completion (like intelisence). Check it out later.
    CTRL-A in Insert mode to insert text, that were typed during previous
      insert mode
    CTRL-@ -- does CTRL-A and then exits Insert mode
    CTRL-Y -- inserts the character above the cursor
    CTRL-E -- inserts the character below the cursor
    CTRL-R {register} -- paste register
    CTRL-R CTRL-R {register} -- paste register with text commands (like <BS>)
    :iabbrev qwer function -- when vim will see qwer, it will be replaced
      by function. (Insert mode abbreviation added)
    :iab   -- same as above
    :cabbrev / cab   -- Command mode abbreviation
    :unabbreviate  {name} -- delete abbreviation
    :iabclear -- remove Insert abbreviations
    :abclear -- remove all abbreviations
    :noabbrev -- it does same as :abbreviate, but avoids the res string used
      as mappings
    :digraphs -- to see availabe digraphs like © ¦ § «
    :CTRL-K {digraph} -- to type digraph
    :CTRL-O {command} -- to execute command in insert mode

  Editing formatted text (25):
    :set textwidth=79 -- automatically insert line breaks
    gq      -- format text by text width
    v4jgq   -- format 4 lines
    gqap    -- format a paragraph
    gggqG   -- format the whole file
    :{range}center [width] -- center alignment. :1,5center 40
    :{range}right [margin] -- right-justifies the text
    :{range}left [margin] -- add's left margin to text
    :set autoindent -- when a new line is started it gets the same indent
      as previous line.
    :set shiftwidth -- changes amount of spaces added by >>
    :set linebreak  -- turn off word breaks in long lines
    :set virtualedit=all -- for moving the cursor to positions where there
      isn't any text
    :set virtualedit=    -- turn it off
    gr{let} -- makes sure the new character takes the right amount of screen
      space. Extra spaces or tabs are inserted to fill the gap.

  Repeating (26):
    gv     -- selects the same area again
    CTRL-A -- increase number under cursor
    CTRL-X -- subtract number under cursor
    ls | vim - -- open vim from stdin
    There is also information about scripts, but lets skip it for now

  Search commands and patterns (27):
    :set ignorecase -- turn off case sensitive during search
    :set noignorecase -- undo above
    :set ignorecase smartcase --
        pattern         matches ~
        word            word, Word, WORD, WoRd, etc.
        Word            Word
        WORD            WORD
        WoRd            WoRd
    === I SKIPED REST OF TUTOR, BACK LATER ===

  Folding (28):
    It's all about shrimping a bunch of lines to one.
    === I SKIPED REST OF TUTOR, BACK LATER ===

  Moving through programs (29):
    ctags *.c -- to generate the tags file for all C files in the current
      directory
    :tag function_name -- jump to function definition
    CTRL-] -- jump to the definition of the function under cursor
    CTRL-T -- jump back
    :tags -- show the list of tags that you traversed through
    :stag tagname -- open new window with file from tag under cursor
    CTRL-W ] -- split the current window and jump to the tag under the
      cursor. If a count is specified, the new window will be that many lines
      high.
    ctags -R . -- generate tags from the whole directory tree
    :tnext -- go to next tag match
    :tprevious -- go to previous tag match
    :tfirst -- go to first tag match
    :tlast -- go to last match
    Mini recipe:
      vim
      :vsplit functions
      :nnoremap <buffer> <CR> 0ye<C-W>w:tag <C-R>"<CR>
    CTRL-W } -- open tag preview
    % -- on #if, #endif, #endif: jump on macros processor instructions
    [# OR ]# -- if cursor inside preprocessor macroses, you will jump on
      BEGININ or END of that macros
    [[ OR ][ -- jump on begin or end of the outer code block
    [{ OR ]} -- jump on begin or end of the current code block
    [( OR ]) -- like above, but works with curle braces
    ]] -- move forward to the start of the next function
    [] -- move backward to the end of other function
    [/ OR ]/ -- move back to the start of a comment (/* */)
    [I -- find definition of the variable under cursor
    [<Tab> -- next definition
    gd -- jump on the variable declaration in the current subprogram
    gD -- jump on the variable declaration in the current file

    Editing programs (30):
    :make {arguments} -- compile a program
    :cnext -- move to the next error from program compiling
    :cc -- show whole error message
    :clist -- get overview of all error messages
    :clist! -- see all messages from compiler
    :cfirst -- to the first errorc
    :clast -- to the last error
    :cc 3 -- to error 3
    You can also change Make to other autobuild tool
    :colder / :cnewer -- jump to the previous or next error list
    :compiler msvc -- switch compiler to other
    :set cindent shiftwidth=4 -- turn on automatically indent
    == -- re-indent current line
    VISUAL BLOCK + = -- reindent selected lines
    =a{ -- reindent current block
    gg=G -- reindent the whole file
    LOOK for cinoption-values to configure reindent configuration in VIM 
    :filetype indent on -- switch on the 'cindent' option manually every
      time you edit a file


Hints:
  There is lowercase and uppercase marks. Uppercase marks are global, they
  can help you to switch between the files. Lowercase marks are local for
  one file.

