Vim Tips

Part I: Best of VIM Tips by David Rayner

Best of VIM Tips, VIM's Key Features
------------------------------------------------------------------------------
David Rayner (zzapper) 15 Years of Vi + 3 years of Vim and still learning
------------------------------------------------------------------------------

__BEGIN__
------------------------------------------------------------------------------

# searching
/joe/e                      : cursor set to End of match
/joe/e+1                    : cursor set to End of match plus 1
/joe/s-2                    : cursor set to Start of match minus 2
/^joe.*fred.*bill/          : normal
/^[A-J]\+/                  : search for lines beginning with one or more A-J
/begin\_.*end               : search over possible multiple lines
/fred\_s*joe/i              : any whitespace including newline
/fred\|joe                  : Search for FRED OR JOE
/\([^0-9]\|^\)%.*%          : Search for absence of a digit or beginning of line
/.*fred\&.*joe              : Search for FRED AND JOE in any ORDER!
/\<fred\>/i                 : search for fred but not alfred or frederick
/\<\d\d\d\d\>               : Search for exactly 4 digit numbers
/\D\d\d\d\d\D               : Search for exactly 4 digit numbers
/\<\d\{4}\>                 : same thing

# finding empty lines
/^\n\{3}                    : find 3 empty lines

# Specify what you are NOT searching for (vowels)
/\c\v([^aeiou]&\a){4}       : search for 4 consecutive consanants

# using rexexp memory in a search
/\(fred\).*\(joe\).*\2.*\1

# Repeating the Regexp (rather than what the Regexp finds)
/^\([^,]*,\)\{8}

# visual searching
:vmap // y/<C-R>"<CR>       : search for visually highlighted text
:vmap <silent> //    y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR> : with spec chars

# searching over multiple lines \_ means including newline
/<!--\_p\{-}-->                   : search for multiple line comments
/fred\_s*joe/i                    : any whitespace including newline
/bugs\(\_.\)*bunny                : bugs followed by bunny anywhere in file
:h \_                             : help

# search for declaration of subroutine/function under cursor
:nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR>

# multiple file search
:bufdo /searchstr
:argdo /searchstr

# How to search for a URL without backslashing
?http://www.vim.org/        : search BACKWARDS!!! clever huh!

----------------------------------------

#substitution
:%s/fred/joe/igc            : general substitute command
:%s/\r//g                   : Delete DOS returns ^M

# Is your Text File jumbled onto one line? use following
:%s/\r/\r/g                 : Turn DOS returns ^M into real returns
:%s=  *$==                  : delete end of line blanks
:%s= \+$==                  : Same thing
:%s#\s*\r\?$##              : Clean both trailing spaces AND DOS returns
:%s#\s*\r*$##               : same thing

# deleting empty lines
:%s/^\n\{3}//               : delete blocks of 3 empty lines
:%s/^\n\+/\r/               : compressing empty lines

# IF YOU ONLY WANT TO KNOW ONE THING
:'a,'bg/fred/s/dick/joe/igc : VERY USEFUL

# duplicating columns
:%s= [^ ]\+$=&&=            : duplicate end column
:%s= \f\+$=&&=              : same thing
:%s= \S\+$=&&               : usually the same

# memory
:s/\(.*\):\(.*\)/\2 : \1/   : reverse fields separated by :
:%s/^\(.*\)\n\1/\1$/        : delete duplicate lines

# non-greedy matching \{-}
:%s/^.\{-}pdf/new.pdf/      : delete to 1st pdf only

# use of optional atom \?
:%s#\<[zy]\?tbl_[a-z_]\+\>#\L&#gc : lowercase with optional leading characters

# over possibly many lines
:%s/<!--\_.\{-}-->//        : delete possibly multi-line comments
:help /\{-}                 : help non-greedy

# substitute using a register
:s/fred/<c-r>a/g            : sub "fred" with contents of register "a"
:s/fred/\=@a/g              : better alternative as register not displayed

# multiple commands on one line
:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/

# ORing
:%s/suck\|buck/loopy/gc     : ORing (must break pipe)

# Calling a VIM function
:s/__date__/\=strftime("%c")/ : insert datestring

# Working with Columns sub any str1 in col3
:%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:

# Swapping first & last column (4 columns)
:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:

# filter all form elements into paste register
:redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END
:nmap ,z :redir @*<Bar>sil exec 'g@<\(input\<Bar>select\<Bar>textarea\<Bar>/\=form\)\>@p'<Bar>redir END<CR>

# increment numbers by 6 on certain lines only
:g/loc\|function/s/\d/\=submatch(0)+6/

# better
:%s#txtdev\zs\d#\=submatch(0)+1#g
:h /\zs

# increment only numbers gg\d\d  by 6 (another way)
:%s/\(gg\)\@<=\d\+/\=submatch(0)+6/
:h zero-width

# find replacement text, put in memory, then use \zs to simplify substitute
:%s/"\([^.]\+\).*\zsxx/\1/

# Pull word under cursor into LHS of a substitute
:nmap <leader>z :%s#\<<c-r>=expand("<cword>")<cr>\>#

# Pull Visually Highlighted text into LHS of a substitute
:vmap <leader>z :<C-U>%s/\<<c-r>*\>/

----------------------------------------

# all following performing similar task, substitute within substitution

# Multiple single character substitution in a portion of line only
:%s,\(all/.*\)\@<=/,_,g     : replace all / with _ AFTER "all/"

# Same thing
:s#all/\zs.*#\=substitute(submatch(0), '/', '_', 'g')#

# Substitute by splitting line, then re-joining
:s#all/#&^M#|s#/#_#g|-j!

# Substitute inside substitute
:%s/.*/\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/

----------------------------------------

# global command display (see tip 227)
:g/fred.*joe.*dick/         : display all lines fred,joe & dick
:g/\<fred\>/                : display all lines fred but not freddy
:g/<pattern>/z#.5           : display with context
:g/<pattern>/z#.5|echo "=========="  : display beautifully
:g/^\s*$/d                  : delete all blank lines
:g!/^dd/d                   : delete lines not containing string
:v/^dd/d                    : delete lines not containing string
:g/fred/,/joe/d             : not line based (very powerfull)
:g/{/ ,/}/- s/\n\+/\r/g     : Delete empty lines but only between {...}
:v/./.,/./-1join            : compress empty lines
:g/^$/,/./-j                : compress empty lines
:g/<input\|<form/p          : ORing
:g/^/put_                   : double space file (pu = put)
:g/^/m0                     : Reverse file (m = move)
:g/^/t.                     : duplicate every line
:g/fred/t$                  : copy lines matching fred to EOF
:g/stage/t'a                : copy lines matching stage to marker a

# match all lines containing "somestr" between markers a & b

# copy after line containing "otherstr"
:'a,'bg/somestr/co/otherstr/ : co(py) or mo(ve)

# as above but also do a substitution
:'a,'bg/str1/s/str1/&&&/|mo/str2/
:%norm jdd                  : delete every other line

# incrementing numbers (type <c-a> as 5 characters)
:.,$g/^\d/exe "norm! \<c-a>": increment numbers
:'a,'bg/\d\+/norm! ^A       : increment numbers

# storing glob results (note must use APPEND)
:g/fred/y A                 : append all lines fred to register a
:'a,'b g/^Error/ . w >> errors.txt

# duplicate every line in a file wrap a print '' around each duplicate
:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/

# replace string with contents of a file, -d deletes the "mark"
:g/^MARK$/r tmp.ex | -d

----------------------------------------

# Global combined with substitute (power editing)
:'a,'bg/fred/s/joe/susan/gic :  can use memory to extend matching
:g/fred/,/joe/s/fred/joe/gic :  non-line based (ultra)

----------------------------------------

# Find fred before beginning search for joe
:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC

----------------------------------------

# Absolutely essential

----------------------------------------

* # g* g#           : find word under cursor (<cword>) (forwards/backwards)
%                   : match brackets {}[]()
.                   : repeat last modification
matchit.vim         : % now matches tags <tr><td><script> <?php etc
<C-N><C-P>          : word completion in insert mode
<C-X><C-L>          : Line complete SUPER USEFUL
/<C-R><C-W>         : Pull <cword> onto search/command line
/<C-R><C-A>         : Pull <CWORD> onto search/command line
:set ignorecase     : you nearly always want this
:syntax on          : colour syntax in Perl,HTML,PHP etc
:h regexp<C-D>      : type control-D and get a list all help topics containing
                      regexp (plus use TAB to Step thru list)
----------------------------------------

# MAKE IT EASY TO UPDATE/RELOAD _vimrc
:nmap ,s :source $VIM/_vimrc
:nmap ,v :e $VIM/_vimrc

----------------------------------------

#VISUAL MODE (easy to add other HTML Tags)
:vmap sb "zdi<b><C-R>z</b><ESC>  : wrap <b></b> around VISUALLY selected Text
:vmap st "zdi<?= <C-R>z ?><ESC>  : wrap <?=   ?> around VISUALLY selected Text

----------------------------------------

# Exploring
:Exp(lore)                      : file explorer note capital Ex
:Sex(plore)                     : file explorer in split window
:ls                             : list of buffers
:cd ..                          : move to parent directory
:args                           : list of files
:lcd %:p:h                      : change to directory of current file
:autocmd BufEnter * lcd %:p:h   : change to directory of current file automatically (put in _vimrc)

----------------------------------------

# Buffer Explorer (Top Ten Vim Script)

# needs bufexplorer.vim  http://www.vim.org/script.php?script_id=42
\be                             : buffer explorer list of buffers
\bs                             : buffer explorer (split window)

----------------------------------------

# Changing Case
guu                             : lowercase line
gUU                             : uppercase line
Vu                              : lowercase line
VU                              : uppercase line
g~~                             : flip case line
vEU                             : Upper Case Word
vE~                             : Flip Case Word
ggguG                           : lowercase entire file

# Titlise Visually Selected Text (map for .vimrc)
vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR>

# Uppercase first letter of sentences
:%s/[.!?]\_s\+\a/\U&\E/g

----------------------------------------

gf                              : open file name under cursor (SUPER)
:nnoremap gF :view <cfile><cr>  : open file under cursor, create if necessary
ga                              : display hex,ascii value of char under cursor
ggVGg?                          : rot13 whole file
ggg?G                           : rot13 whole file (quicker for large file)
:8 | normal VGg?                : rot13 from line 8
:normal 10GVGg?                 : rot13 from line 8
<C-A>,<C-X>                     : increment,decrement number under cursor
                                  win32 users must remap CNTRL-A
<C-R>=5*5                       : insert 25 into text (mini-calculator)

----------------------------------------

# Makes all other tips superfluous
:h 42            : also http://www.google.com/search?q=42
:h holy-grail
:h!

----------------------------------------

# Markers & moving about
'.               : jump to last modification line (SUPER)
`.               : jump to exact spot in last modification line
g;               : cycle thru recent changes (oldest first) (new in vim6.3)
g,               : reverse direction (new in vim6.3)
:changes
:h changelist    : help for above
<C-O>            : retrace your movements in file (starting from most recent)
<C-I>            : retrace your movements in file (reverse direction)
:ju(mps)         : list of your movements
:help jump-motions
:history         : list of all your commands
:his c           : commandline history
:his s           : search history
q/               : Search history Window
q:               : commandline history Window
:<C-F>           : history Window

----------------------------------------

# Abbreviations & maps
:map   <f7>   :'a,'bw! c:/aaa/x
:map   <f8>   :r c:/aaa/x
:map   <f11>  :.w! c:/aaa/xr<CR>
:map   <f12>  :r c:/aaa/xr<CR>
:ab php          : list of abbreviations beginning php
:map ,           : list of maps beginning ,

# allow use of F10 for mapping (win32)
set wak=no       : :h winaltkeys

# For use in Maps
<CR>             : carriage Return for maps
<ESC>            : Escape
<LEADER>         : normally \
<BAR>            : | pipe
<BACKSPACE>      : backspace

#display RGB colour under the cursor eg #445588
:nmap <leader>c :hi Normal guibg=#<c-r>=expand("<cword>")<cr><cr>

----------------------------------------

# Using a register as a map (preload registers in .vimrc)
:let @m=":'a,'bs/"
:let @s=":%!sort -u"

----------------------------------------

# List your Registers
:reg             : display contents of all registers
:reg a           : display content of individual registers
"1p....          : retrieve numeric registers one by one
:let @y='yy@"'   : pre-loading registers (put in .vimrc)

----------------------------------------

# Useful tricks
"ayy@a           : execute "Vim command" in a text file
yy@"             : same thing using unnamed register
u@.              : execute command JUST typed in

----------------------------------------

# Get output from other commands (requires external programs)
:r!ls.exe        : reads in output of ls
!!date           : same thing (but replaces/filters current line)

# Sorting with external sort
:%!sort -u       : use an external program to filter content
:'a,'b!sort -u   : use an external program to filter content
!1} sort -u      : sorts paragraph (note normal mode!!)

----------------------------------------

# Multiple Files Management (Essential)
:bn              : goto next buffer
:bp              : goto previous buffer
:wn              : save file and move to next (super)
:wp              : save file and move to previous
:bd              : remove file from buffer list (super)
:bun             : Buffer unload (remove window but not from list)
:badd file.c     : file from buffer list
:b 3             : go to buffer 3
:b main          : go to buffer with main in name eg main.c (ultra)
:sav php.html    : Save current file as php.html and "move" to php.html
:sav! %<.bak     : Save Current file to alternative extension
:sav! %:r.cfm    : Save Current file to alternative extension
:e!              : return to unmodified file
:w c:/aaa/%      : save file elsewhere
:e #             : edit alternative file (also cntrl-^)
:rew             : return to beginning of edited files list (:args)
:brew            : buffer rewind
:sp fred.txt     : open fred.txt into a split
:sball,:sb       : Split all buffers (super)
:scrollbind      : in each split window
:map   <F5> :ls<CR>:e # : Pressing F5 lists all buffer, just type number
:set hidden      : Allows to change buffer w/o saving current buffer

----------------------------------------

# Quick jumping between splits
map <C-J> <C-W>j<C-W>_
map <C-K> <C-W>k<C-W>_

----------------------------------------

# Recording (BEST TIP of ALL)
qq  # record to q
your complex series of commands
q   # end recording
@q to execute
@@ to Repeat
5@@ to Repeat 5 times

# editing a register/recording
"qp                               :display contents of register q (normal mode)
<ctrl-R>q                         :display contents of register q (insert mode)

# you can now see recording contents, edit as required
"qdd                              :put changed contacts back into q
@q                                :execute recording/register q

# Operating a Recording on a Visual BLOCK
1) define recording/register
qq:s/ to/ from/g^Mq
2) Define Visual BLOCK
V}
3) hit : and the following appears
:'<,'>
4)Complete as follows
:'<,'>norm @q

----------------------------------------

# Visual is the newest and usually the BEST editing mode

# Visual basics
v                               : enter visual mode
V                               : visual mode whole line
<C-V>                           : enter VISUAL BLOCK mode
gv                              : reselect last visual area
o                               : navigate visual area
"*y                             : yank visual area into paste buffer
V%                              : visualise what you match
V}J                             : Join Visual block (great)

----------------------------------------

# Delete first 2 characters of 10 successive lines
0<c-v>10j2ld

----------------------------------------

# how to copy a set of columns using VISUAL BLOCK

# visual block (AKA columnwise selection) (NOT BY ordinary v command)
<C-V> then select "column(s)" with motion commands (win32 <C-Q>)
then c,d,y,r etc

----------------------------------------

# how to overwrite a visual-block of text with another such block
Pick the first block: ctrl-v move "ay
Pick the second block: ctrl-v move c ctrl-o "aP <esc>

----------------------------------------

# _vimrc essentials
:set incsearch : jumps to search word as you type (annoying but excellent)
:set wildignore=*.o,*.obj,*.bak,*.exe : tab complete now ignores these
:set shiftwidth=3                     : for shift/tabbing
:set vb t_vb=".                       : set silent (no beep)
:set browsedir=buffer                 : Maki GUI File Open use current directory

----------------------------------------

# launching Win IE
:nmap ,f :update<CR>:silent !start c:\progra~1\intern~1\iexplore.exe file://%:p<CR>
:nmap ,i :update<CR>: !start c:\progra~1\intern~1\iexplore.exe <cWORD><CR>

----------------------------------------

# FTPing from VIM
cmap ,r  :Nread ftp://209.51.134.122/public_html/index.html
cmap ,w  :Nwrite ftp://209.51.134.122/public_html/index.html
gvim ftp://209.51.134.122/public_html/index.html

----------------------------------------

# appending to registers (use CAPITAL)

# yank 5 lines into "a" then add a further 5
"a5yy
10j
"A5yy

----------------------------------------

[I     : show lines matching word under cursor <cword> (super)

----------------------------------------

# Conventional Shifting/Indenting
:'a,'b>>

# visual shifting (builtin-repeat)
:vnoremap < <gv
:vnoremap > >gv

# Block shifting (magic)
>i{
>a{

# also
>% and <%

----------------------------------------

# Redirection & Paste register *
:redir @*                    : redirect commands to paste buffer
:redir END                   : end redirect
:redir >> out.txt            : redirect to a file

# Working with Paste buffer
"*yy                         : yank to paste
"*p                          : insert from paste buffer

# yank to paste buffer (ex mode)
:'a,'by*                     : Yank range into paste
:%y*                         : Yank whole buffer into paste

# filter non-printable characters from the paste buffer

# useful when pasting from some gui application
:nmap <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p

----------------------------------------

# Re-Formatting text
gq}                          : Format a paragraph
ggVGgq                       : Reformat entire file
Vgq                          : current line

# break lines at 70 chars, if possible after a ;
:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g

----------------------------------------

# Operate command over multiple files
:argdo %s/foo/bar/e          : operate on all files in :args
:bufdo %s/foo/bar/e
:windo %s/foo/bar/e
:argdo exe '%!sort'|w!       : include an external command
:bufdo /foo/

----------------------------------------

# Command line tricks
gvim -h                    : help
ls | gvim -                : edit a stream!!
cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " : filter a stream
gvim -o file1 file2        : open into a split

# execute one command after opening file
gvim.exe -c "/main" joe.c  : Open joe.c & jump to "main"

# execute multiple command on a single file
vim -c "%s/ABC/DEF/ge | update" file1.c

# execute multiple command on a group of files
vim -c "argdo %s/ABC/DEF/ge | update" *.c

# remove blocks of text from a series of files
vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c

# Automate editing of a file (Ex commands in convert.vim)
vim -s "convert.vim" file.c

#load VIM without .vimrc and plugins (clean VIM)
gvim -u NONE -U NONE -N

# Access paste buffer contents (put in a script/batch file)
gvim -c 'normal ggdG"*p' c:/aaa/xp

# print paste contents to default printer
gvim -c 's/^/\=@*/|hardcopy!|q!'

# gvim's use of external grep (win32 or *nix)
:grep somestring *.php     : creates a list of all matching files

# use :cn(ext) :cp(rev) to navigate list
:h grep

----------------------------------------

# GVIM Difference Function (Brilliant)
gvim -d file1 file2        : vimdiff (compare differences)
dp                         : "put" difference under cursor to other file
do                         : "get" difference under cursor from other file

----------------------------------------

# Vim traps
In regular expressions you must backslash + (match 1 or more)
In regular expressions you must backslash | (or)
In regular expressions you must backslash ( (group)
In regular expressions you must backslash { (count)
/fred\+/                   : matches fred/freddy but not free
/\(fred\)\{2,3}/           : note what you have to break

----------------------------------------

# \v or very magic (usually) reduces backslashing
/codes\(\n\|\s\)*where  : normal regexp
/\vcodes(\n|\s)*where   : very magic

----------------------------------------

# pulling objects onto command/search line (SUPER)
<C-R><C-W> : pull word under the cursor into a command line or search
<C-R><C-A> : pull WORD under the cursor into a command line or search
<C-R>-                  : pull small register (also insert mode)
<C-R>[0-9a-z]           : pull named registers (also insert mode)
<C-R>%                  : pull file name (also #) (also insert mode)
<C-R>=somevar           : pull contents of a variable (eg :let sray="ray[0-9]")

----------------------------------------

# manipulating registers
:let @a=@_              : clear register a
:let @a=""              : clear register a
:let @*=@a              : copy register a to paste buffer
map   <f11> "qyy:let @q=@q."zzz"

----------------------------------------

# help for help
:h quickref             : VIM Quick Reference Sheet (ultra)
:h tips                 : Vim's own Tips Help
:h visual<C-D><tab>     : obtain  list of all visual help topics
                        : Then use tab to step thru them
:h ctrl<C-D>            : list help of all control keys
:helpg uganda           : Help grep
:h :r                   : help for :ex command
:h CTRL-R               : normal mode
:h /\r                  : what's \r in a regexp (matches a <CR>)
:h \\zs                 : double up backslash to find \zs in help
:h i_CTRL-R             : help for say <C-R> in insert mode
:h c_CTRL-R             : help for say <C-R> in command mode
:h v_CTRL-V             : visual mode
:h tutor                : VIM Tutor
<C-[>, <C-T>            : Move back & Forth in HELP History
gvim -h                 : VIM Command Line Help

----------------------------------------

# where was an option set
:scriptnames            : list all plugins, _vimrcs loaded (super)
:verbose set history?   : reveals value of history and where set
:function               : list functions
:func SearchCompl       : List particular function

----------------------------------------

# making your own VIM help
:helptags /vim/vim63/doc  : rebuild all *.txt help files in /doc
:help add-local-help

----------------------------------------

# running file thru an external program (eg php)
map   <f9>   :w<CR>:!c:/php/php.exe %<CR>
map   <f2>   :w<CR>:!perl -c %<CR>
----------------------------------------

# capturing output of current script in a separate buffer
:new | r!perl #                   : opens new buffer,read other buffer
:new! x.out | r!perl #            : same with named file

----------------------------------------

# Inserting DOS Carriage Returns
:%s/nubian/<C-V><C-M>&/g          :  that's what you type
:%s/nubian/<C-Q><C-M>&/g          :  for Win32
:%s/nubian/^M&/g                  :  what you'll see where ^M is ONE character
:%s/nubian/\r&/g                  :  better

----------------------------------------

# automatically delete trailing Dos-returns,whitespace
autocmd BufRead * silent! %s/[\r \t]\+$//
autocmd BufEnter *.php :%s/[ \t\r]\+$//e

----------------------------------------

# perform an action on a particular file or file type
autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?
autocmd FileType *.pl exec('set fileformats=unix')

----------------------------------------

# Retrieving last command line command for copy & pasting into text
i<c-r>:

# Retrieving last Search Command for copy & pasting into text
i<c-r>/

----------------------------------------

# more completions
<C-X><C-F>                        :insert name of a file in current directory

----------------------------------------

# Substituting a Visual area

# select visual area as usual (:h visual) then type :s/Emacs/Vim/ etc
:'<,'>s/Emacs/Vim/g               : REMEMBER you dont type the '<.'>
gv                                : Re-select the previous visual area (ULTRA)

----------------------------------------

# inserting line number into file
:g/^/exec "s/^/".strpart(line(".")."    ", 0, 4)
:%s/^/\=strpart(line(".")."     ", 0, 5)
:%s/^/\=line('.'). ' '

----------------------------------------

#numbering lines VIM way
:set number                       : show line numbers
:map <F12> :set number!<CR>       : Show linenumbers flip-flop
:%s/^/\=strpart(line('.')."        ",0,&ts)

#numbering lines (need Perl on PC) starting from arbitrary number
:'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++'

#Produce a list of numbers

#Type in number on line say 223 in an empty file
qqmnYP`n^Aq                       : in recording q repeat with @q

# increment existing numbers to end of file (type <c-a> as 5 characters)
:.,$g/^\d/exe "normal! \<c-a>"

# advanced incrementing
http://vim.sourceforge.net/tip_view.php?tip_id=150

----------------------------------------

# advanced incrementing (really useful)
" put following in _vimrc
let g:I=0
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction
" eg create list starting from 223 incrementing by 5 between markers a,b
:let I=223
:'a,'bs/^/\=INC(5)/
" create a map for INC
cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/

----------------------------------------

# editing/moving within current insert (Really useful)
<C-U>                             : delete all entered
<C-W>                             : delete last word
<HOME><END>                       : beginning/end of line
<C-LEFTARROW><C-RIGHTARROW>       : jump one word backwards/forwards
<C-X><C-E>,<C-X><C-Y>             : scroll while staying put in insert

----------------------------------------

#encryption (use with care: DON'T FORGET your KEY)
:X                                : you will be prompted for a key
:h :X

----------------------------------------

# modeline (make a file readonly etc) must be in first/last 5 lines
// vim:noai:ts=2:sw=4:readonly:

# vim:ft=html:                    : says use HTML Syntax highlighting
:h modeline

----------------------------------------

# Creating your own GUI Toolbar entry
amenu  Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR>vim60:fdm=marker<esc>gg

----------------------------------------

# A function to save word under cursor to a file
function! SaveWord()
   normal yiw
   exe ':!echo '.@0.' >> word.txt'
endfunction
map ,p :call SaveWord()

----------------------------------------

# function to delete duplicate lines
function! Del()
 if getline(".") == getline(line(".") - 1)
   norm dd
 endif
endfunction

:g/^/ call Del()

----------------------------------------

# Digraphs (non alpha-numerics)

:digraphs                         : display table
:h dig                            : help
i<C-K>e'                          : enters é<C-V>233                         : enters éUnix)
i<C-Q>233                         : enters éWin32)
ga                                : View hex value of any character

#Deleting non-ascii characters (some invisible)
:%s/[<C-V>128-<C-V>255]//gi       : where you have to type the Control-V
:%s/[€-ÿ]//gi                     : Should see a black square & a dotted y
:%s/[<C-V>128-<C-V>255<C-V>01-<C-V>31]//gi : All pesky non-asciis
:exec "norm /[\x00-\x1f\x80-\xff]/"        : same thing

#Pull a non-ascii character onto search bar
yl/<C-R>"                         :

----------------------------------------

# All file completions grouped (for example main_c.c)
:e main_<tab>                     : tab completes
gf                                : open file under cursor  (normal)
main_<C-X><C-F>                   : include NAME of file in text (insert mode)

----------------------------------------

# Complex Vim

# swap two words
:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g

# swap two words
:vnoremap <C-X> <Esc>`.``gvP``P

----------------------------------------

# Convert Text File to HTML
:runtime! syntax/2html.vim        : convert txt to html
:h 2html

----------------------------------------

# VIM has internal grep
:grep some_keyword *.c            : get list of all c-files containing keyword
:cn                               : go to next occurrence

----------------------------------------

# Force Syntax coloring for a file that has no extension .pl
:set syntax=perl

# Remove syntax coloring (useful for all sorts of reasons)
:set syntax off

# change coloring scheme (any file in ~vim/vim??/colors)
:colorscheme blue

# Force HTML Syntax highlighting by using a modeline

# vim:ft=html:

----------------------------------------

:set noma (non modifiable)        : Prevents modifications
:set ro (Read Only)               : Protect a file from unintentional writes

----------------------------------------

# Sessions (Open a set of files)
gvim file1.c file2.c lib/lib.h lib/lib2.h : load files for "session"
:mksession                        : Make a Session file (default Session.vim)
:q
gvim -S Session.vim               : Reload all files

----------------------------------------

#tags (jumping to subroutines/functions)
taglist.vim                       : popular plugin
:Tlist                            : display Tags (list of functions)
<C-]>                             : jump to function under cursor

----------------------------------------

# columnise a csv file for display only as may crop wide columns
:let width = 20
:let fill=' ' | while strlen(fill) < width | let fill=fill.fill | endwhile
:%s/\([^;]*\);\=/\=strpart(submatch(1).fill, 0, width)/ge
:%s/\s\+$//ge

# Highlight a particular csv column (put in .vimrc)
function! CSVH(x)
    execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/'
    execute 'normal ^'.a:x.'f,'
endfunction
command! -nargs=1 Csv :call CSVH(<args>)

# call with
:Csv 5                             : highlight fifth column

----------------------------------------

# folding : hide sections to allow easier comparisons
zf}                               : fold paragraph using motion
v}zf                              : fold paragraph using visual
zf'a                              : fold to mark
zo                                : open fold
zc                                : re-close fold

----------------------------------------

# displaying "invisible characters"
:set list
:h listchars

----------------------------------------

# How to paste "normal commands" w/o entering insert mode
:norm qqy$jq

----------------------------------------

# manipulating file names
:h filename-modifiers             : help
:w %                              : write to current file name
:w %:r.cfm                        : change file extention to .cfm
:!echo %:p                        : full path & file name
:!echo %:p:h                      : full path only
<C-R>%                            : insert filename (insert mode)
"%p                               : insert filename (normal mode)
/<C-R>%                           : Search for file name in text

----------------------------------------

# delete without destroying default buffer contents
"_d                               : what you've ALWAYS wanted
"_dw                              : eg delete word (use blackhole)

----------------------------------------

# pull full path name into paste buffer for attachment to email etc
nnoremap <F2> :let @*=expand("%:p")<cr> :unix
nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32

----------------------------------------

# Simple Shell script to rename files w/o leaving vim
$ vim
:r! ls *.c
:%s/\(.*\).c/mv & \1.bla
:w !sh
:q!

----------------------------------------

# count words in a text file
g<C-G>

----------------------------------------

# example of setting your own highlighting
:syn match DoubleSpace "  "
:hi def DoubleSpace guibg=#e0e0e0

----------------------------------------

# Programming keys depending on file type
:autocmd bufenter *.tex map <F1> :!latex %<CR>
:autocmd bufenter *.tex map <F2> :!xdvi -hush %<.dvi&<CR>

----------------------------------------

# reading Ms-Word documents, requires antiword
:autocmd BufReadPre *.doc set ro
:autocmd BufReadPre *.doc set hlsearch!
:autocmd BufReadPost *.doc %!antiword "%"

----------------------------------------

# a folding method
vim: filetype=help foldmethod=marker foldmarker=<<<,>>>
A really big section closed with a tag <<< 
--- remember folds can be nested --- 
Closing tag >>> 

----------------------------------------

# Just Another Vim Hacker JAVH
vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?"

----------------------------------------

# convert dos ascii text to unix format (line feed/CR to LF)
:set fileformat=unix
:wr

----------------------------------------
__END__
----------------------------------------
If you liked these please return to www.vim.org
and vote for this tip (It does encourage me!!)
Tip 305
----------------------------------------
Please email any errors, tips etc to
david@rayninfo.co.uk
----------------------------------------
updated version at http://www.rayninfo.co.uk/vimtips.html
----------------------------------------

# Information Sources
----------------------------------------
www.vim.org
comp.editors "VIM" newsgroup
VIM Webring
Vim Book
Searchable VIM Doc
VIM FAQ
VimTips in Chinese
----------------------------------------

# : commands to neutralise < for HTML display and publish
use yy@" to execute following commands
:w!|sav! vimtips.html|:/^__BEGIN__/,/^__END__/s#
:w!|!tipftp
----------------------------------------



----------------------------------------

Part II: Additional VIM Tips added by WiKi Users

replace tabs with 2 spaces

:1,$s/\(^I\)/  /g 

note: the ^I is the result of simply pressing the TAB key. That is the escape code for a TAB.

tell vim to insert spaces when the tab key is pressed

set expandtab
set tabstop=2
retab

note: the tabstop tells vim how many spaces to use for a tab, and the retab changes all the tabs you entered before turning on expandtab into spaces.

parameter in your text files telling vim how to render file

vim: textwidth=80

note: put this at the bottom of the text file. when you open the file in vim it will set the width to 80 columns for that file.

Disable automatic comment insertion

If wanted, auto commenting can be disabled for all files with:

:set noautoindent | set nosmartindent | set nocindent 

Create a .vimrc for your shell and put the lines in like this

set noautoindent
set nosmartindent
set nocindent 

or to Disable auto commenting just for paste operations temporarily while working in a file

:set paste

Disable annoying bracket highlighting aka bracket match aka parentheses match

Using the ":syntax off" doesn't disable bracket match, such as you would see when working with HTML tags. The problem is that the highlighting is terrible on some terminals such as Konsole. To disable type

:NoMatchParen

The matchparen plugin has become enabled on your installation. You can run the :NoMatchParen command to shut it off. ":he matchparen" has instructions for how to disable it altogether. You can also find out where 'showmatch' might be getting set by setting the 'verbose' option to non-zero or using the ":verbose" command. You can see ":he :set-verbose" for more info on that one. Colors for the matching bracket or brace can be customized by adding to the .vimrc file.

hi MatchParen cterm=none ctermbg=green ctermfg=blue

reference: turning off showmatch

Use vim as a HEX Editor

The vim editor does not have a HEX Edit mode, but can stream the buffer to an external program called xxd.

Open the file with the -b command line switch (Binary mode. A few options will be set that makes it possible to edit a binary or executable file.)

vi -b binaryfile

Now stream the buffer to xxd from within vim

:%!xxd

And when your done and want to exit the redirect

:%!xxd -r

If you are at the command prompt you can display the hex output of a binary file simply by typing

xxd binaryfile

This demonstrates how you are actually using xxd from within vim

When using vim as a HEX Editor remember to run the filter (:%!xxd to convert to hex, :%!xxd -r to convert back) and to convert back from hex before saving.

vim write with sudo trick

Oops! I opened a file in vim and made a bunch of edits not realizing that I do not have write permission to the file.

Write to file using vim when sudo privileges needed

:w !sudo tee %

The !sudo tee part calls tee with administrator privileges.

You can add this to your .vimrc to make this trick easy-to-use: just type :w!!.

" Allow saving of files as sudo when I forgot to start vim using sudo.
cmap w!! w !sudo tee > /dev/null %

ref: How does the vim “write with sudo” trick work?

Last modified on 9 August 2020, at 05:45