====== VIM ====== There's an old joke that Emacs would be a great operating system if only it had a decent text editor,\\ whereas vi would be a great text editor if only it had a decent operating system. ==== vi cheat-sheet ==== a. cursor movements (items below are sometimes called objects): h - left one character l - right one character j - down one line k - up one line w - right one word b - back one word $ - to the end of line 0 - to the beginning of the line ) - right one sentence ( - left one sentence } - right one paragraph { - left one paragraph Ctrl-F - forward one page Ctrl-B - back one page G - go to (without arguments, go to end of file) b. deleting: d - delete then add one of the cursor movement symbols to show what should be deleted, i.e.: d$ - delete to end of line d0 - delete to the beginning of the line d} - delete to the end of paragraph dd - delete delete (delete the whole line) x - delete character cursor is on c. other basic commands: r - replace one character ZZ - save and exit (hold down shift and press "z" twice) y - yank (copy into temporary buffer) then add cursor movement symbol to show what should be copied, for example: y) - copy to the end of sentence Y - yank line cursor is on p - paste below cursor line (deleted or copied text) P - paste above cursor line u - undo last editing command /sometext - search for "sometext" d. any command can take numeric argument before the name of "object", i.e.: 5dd - delete 5 lines beginning with cursor line (or) d5d - same 2dw - delete two words (or) d2w - delete two words c3w - change 3 words 3Ctrl-B - move up three pages 1G - go to the first line e. external commands can be performed on the selected text (in lines) if command is started with "!", i.e.: !}fmt - reformat paragraph to 72 columns f. command line (sometimes called "ex mode"): : g. from the command line a "set" command can be executed to customize editing environment, i.e.: :set all - will show the state of all options :set number - will show on the screen numbers of all lines :set autoindent // obvious h. from the command line operations can be performed on the range of lines, i.e.: :18,24 del - delete from line 18 to line 24 :23,48 copy 17 - block from line 23 to 48 copy to line 17 :2,17 move 92 - block from line 2 to 17 move to line 92 i. from the command line any external UNIX command can be performed on the range of lines if line range is superseded by "!": :11,16! sed -e "s/^/\/\*/" -e "s/$/\*\//" (the command above wraps the block of text with "C" style comments - /* text */. It can be done easier, but this is an example) :14,19! sort -r +3 (sort the table in reverse order by fourth column) j. file manipulation from the command line: :r somefile - read in "somefile" :x - save and exit (if file is "Read Only", this command will exit without saving) :wq - write and quit (same as above) :w - write (save) if the file permissions allow it :w! - save file even if it is read-only as long as we own it :w somefile - save this file as "somefile" :q - quit without saving :q! - quit without saving if changes were made k. text input commands (all require "Esc" to terminate): i - insert text before the character cursor is on I - insert text at the beginning of the line a - append (insert text after the character cursor is on) A - append text to the end of the line c - change (replace previous text with new one) takes arguments just like the delete command - it is a fast and powerful way of changing original text - much more so than typical "overwrite" R - start overwriting text o - start entering text at the beginning of the new line below the cursor O - start entering text at the beginning of the new line above the cursor l. if in doubt, press "Esc" [[http://www.infobound.com/vi.html | Ref.]] ==== File Cleaning ==== === Remove Blank line from the file === to remove blank lines please use following. :g/^$/d OR :g/^ *$/d === Remove Tailing space as well space at beginning using VI === To remove tailing space :%s/\s\+$// To remove space at beginning :%s/^\s\+// === Replace tab with space === To replace tab with space you need to use :%s/[CTRL-i]/ /g === Delete Line start with === To delete lines start with some word e.g. Redirect :g/^Redirect/d === Remove Dos / Windows carriage-return === To remove Carriage return in vi use following :%s/^M//g NOTE : to create "^M" use "Ctrl+v Ctrl+M" Regular ^M does not help. ==== Convert all character to lower OR upper case ==== NOTE : This will apply to whole file as we are using (%)\\ To convert upper case use following :%s/\([a-z]\)/\u\1/g To convert lower case use following :%s/\([A-Z]\)/\l\1/g ==== Match Start of line Append End of line ==== To Match Start of line and append that line use following\\ (search Append end of line) %g/^DocumentRoot/s/$/\/www/ Which append "/www" if start of line is "DocumentRoot". Also you can append after word by following. %s/word/&test/g So all word is get replaced by "wordtest". ==== Saving file as root ==== At some point you would like to save file as root. :w !sudo tee % ==== Quick tools ==== Comment line from current line. :.,$s/^/#/g ==== Marking ==== mk - record current location as mark k (redefines any previous mark k) 'k - return to line of mark k `k - return to mark k d'k - delete to line of mark k d`k - delete to mark k c'k - change text to line of mark k c`k - change text to mark k "ay'd - yank text into buffer a from cursor through line of mark d ==== Editing ==== o - open a new line above cursor(*) O - open a new line below cursor(*) i - insert text ahead of cursor(*) I - insert text at the beginning of the line(*) a - append text after the cursor(*) A - append text at the end of the line(*) c$ - change to end of the line (*) d$ - delete to end of the line C - same as c$ (*) D - same as d$ cG - change to end of the file (*) dG - delete to end of the file c0 - change to beginning of file (*) d0 - delete to beginning of file cc - change line (*) dd - delete line c'm - change from cursor through mark m (*) d'm - delete from cursor through mark m 3cc - change 3 lines (*) 3dd - delete 3 lines 8cw - change next 8 words (*) 8dw - delete next 8 words R - overwrite current line, starting at cursor(*) r - replace character at cursor s - substitute for character at cursor (*) 8s - substitute for next 8 characters (*) S - substitute for entire line (*) J - join two lines together . - repeats previous edit command xp - transpose two characters easESC - add a plural, and go back to command mode ==== Handling ==== h - move to the left CTL-f - change display forward a page j - `jump` down a line CTL-b - change display back a page k - move up a line CTL-d - change display down half a page l - move to the right CTL-u - change display up half a page - - same as k CTL-y - shift display down on screen + - same as j CTL-e - shift display up on screen e - move to the end of a word z. - recenter display around cursor w - move forward to the beginning of a word z- - recenter display so cursor is at top b - move backward to the beginning of a word z+ - recenter display aso cursor is at bottom $ - move to the end of the line zCR - recenter display so cursor is at top 0 - move to the beginning of the line 'm - move to the beginning of the line of mark m ^ - move to the beginning of the line `m - move to the location of mark m G - move to the end of the file gg - move to the beginning of the file ) - move forward 1 sentence H - move to the top of the display ( - move back 1 sentence M - move to the middle of the display } - move forward 1 paragraph L - move to the bottom of the display { - move back 1 paragraph B - move back to previous blank space 20| - go to 20th character in the line E - move ahead to next blank space CTL-L - clear and redraw B - move back to previous blank space CR - same as j CTL-G - print current location in the file :22 - move to line 22 6w - move forward 6 words 6b - move backward 6 words 8+ - move down 8 lines ==== Play with Buffers ==== yy - yank current line to unnamed buffer "j8yy - yank 8 lines into buffer j 19yy - yank next 19 lines to unnamed buffer "J8YY - append the next 8 lines into buffer j p - put unnamed buffer contents after cursor p - recover previous edit P - put unnamed buffer contents before cursor "1p - recover 2nd previous edit 19dd - delete next 19 lines, and put them in unnamed buffer "7p - recover 8th previous edit "bp - put the contents of buffer p into current file :11,14 ya w - yank lines 11 through 14 into buffer w :94 pu w - put contents of buffer w after line 94 ===== VIM Scripts ===== Introduction to vim scripts ":help vim-script-intro"\\ == Running Vim scripts == There is many way to run vim script simple way is to run calling script from `source` :source /home/yahoo/test.vim You can also call command from script directly :call MyBackupFunc(expand('%'), { 'all':1, 'save':'recent'}) You can do mapping of the keyboard using the variables. :nmap ;s :source /home/yahoo/test.vim The key sequence `;s` will execute the specified script file\\ You can call fucntion using the stored mapping same way. :nmap \b :call MyBackupFunc(expand('%'), { 'all': 1 }) To call the function you need to call enter squence `\b` === syntax highlighting === VIM support syntax highlighting. to turn it on. :syntax on to turn it off :syntax off === VIM Variable / Initialization (.vimrc) === OR === You can use .exrc === == toggle syntax highlighting == function! ToggleSyntax() if exists("g:syntax_on") syntax off else syntax enable endif endfunction nmap ;s :call ToggleSyntax() `;s` sequence to flip syntax highlighting on or off every time typed when you're in Normal mode.\\ nmap stands for "normal-mode key mapping".\\ option causes the mapping not to echo any command it's executing. == Creating centered titles == function! CapitalizeCenterAndMoveDown() s/\<./\u&/g "Built-in substitution capitalizes each word center "Built-in center command centers entire line +1 "Built-in relative motion (+1 line down) endfunction nmap \C :call CapitalizeCenterAndMoveDown() single backslash used for continuation marker call SetName( \ first_name, \ middle_initial, \ family_name \ ) Also you can use "|" to write two line on singe line. echo "Starting..." | call Phase(1) | call Phase(2) | echo "Done" You can comment using single quote, as double quote used to define a string.\\ also you can use "|" to escape the comment in some cases. echo "> " |"Print generic prompt === Defining variable === to define variable you need to use word `let` let name = "Damian" let height = 165 let interests = [ 'Cinema', 'Literature', 'World Domination', 101 ] let phone = { 'cell':5551017346, 'home':5558038728, 'work':'?' } * scalar: a single value, such as a string or a number. For example: "Damian" or 165 * list: an ordered sequence of values delimited by square brackets, with implicit integer indices starting at zero. For example: ['Cinema', 'Literature', 'World Domination', 101] * dictionary: an unordered set of values delimited by braces, with explicit string keys. For example: {'cell':5551017346, 'home':5558038728, 'work':'?'} === Sample .vimrc === set number " show line number set nocompatible " This setting prevents vim from emulating the original vi's bugs and limitations. set autoindent set smartindent " The first setting tells vim to use "autoindent" " (that is, use the current line's indent level to set the indent level of newlines). " The second makes vim attempt to intelligently guess the indent level of any new line based on the previous line, " assuming the source file is in a C-like language. Combined, they are very useful in writing well-formatted source code. set tabstop=4 set shiftwidth=4 " I prefer 4-space tabs to 8-space tabs. The first setting sets up 4-space tabs, " and the second tells vi to use 4 spaces when text is indented (auto or with the manual indent adjustmenters.) set showmatch " This setting will cause the cursor to very briefly jump to a brace/parenthese/bracket's "match" " whenever you type a closing or opening brace/parenthese/bracket. " I've had almost no mismatched-punctuation errors since I started using this setting. set guioptions-=T " I find the toolbar in the GUI version of vim (gvim) to be somewhat useless visual clutter. " This option gets rid of the toolbar. set vb t_vb= " This setting prevents vi from making its annoying beeps when a command doesn't work. " Instead, it briefly flashes the screen -- much less annoying. set ruler " This setting ensures that each window contains a statusline that displays the current cursor position. set nohls " By default, search matches are highlighted. I find this annoying most of the time. " This option turns off search highlighting. You can always turn it back on with :set hls. set incsearch " With this nifty option, vim will search for text as you enter it. " For instance, if you type /bob to search for bob, vi will go to the first "b" after you type the "b," " to the first "bo" after you type the "o," and so on. " It makes searching much faster, since if you pay attention you never have to enter " more than the minimum number of characters to find your target location. " Make sure that you press Enter to accept the match after vim finds the location you want. set virtualedit=all " By default, vim doesn't let the cursor stray beyond the defined text. " This setting allows the cursor to freely roam anywhere it likes in command mode. " It feels weird at first but is quite useful. " Type :help options within vim to get a complete list of options. highlight Comment ctermfg=green " Comments are shown in a brightgreen color which is visible clearly as against " a dark blue which is annoyingly hard to read to read, at least to me. :set nu ts=4 sw=4 shiftround ignorecase smartcase " let perl_fold=1 :colorscheme elflord " to set the title of the window where you are working :set title :auto BufEnter * let &titlestring = hostname() . ":" . expand("%:p") :auto BufEnter * let &titleold = hostname() . ":" . getcwd() :set statusline+=%f\ :set smartindent :set expandtab :set tabstop=4 :set ruler :set nowrap :set incsearch :au Syntax pl source ~/.vim/test.vim :au Syntax pm source ~/.vim/test.vim :au Syntax pod source ~/.vim/test.vim :au Syntax lib source ~/.vim/test.vim ":set foldmethod=indent ":set foldlevel=0 ==== Basic Info ==== == Variable scoping == g: varname The variable is global s: varname The variable is local to the current script file w: varname The variable is local to the current editor window t: varname The variable is local to the current editor tab b: varname The variable is local to the current editor buffer l: varname The variable is local to the current function a: varname The variable is a parameter of the current function v: varname The variable is one that Vim predefines == pseudovariables == & varname A Vim option (local option if defined, otherwise global) &l: varname A local Vim option &g: varname A global Vim option @ varname A Vim register $ varname An environment variable