====== 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