Monthly Archives: August 2008

dump & restore для клонирования hdd
копия hdd

/dev/ad2 = новый винт
загружаемся в single user mode
для удобства: set -o emacs
fsck исходный hdd
sysinstall’ом новый винт разбит, загрузчик добавлен;
форматируем разделы нового диска: newfs /dev/ad2s1a
mount -uw /
mkdir -p /usr/backup/root && mount /dev/ad2s1a
все разделы из fstab в ro за исключением /tmp:
mount -ura && mount -uw /tmp

(dump -0f – /)|(cd /mnt/root; restore -rf -)

freebsd software raid

Имеем два диска /dev/ad4 и /dev/ad6, на /dev/ad4 установлена рабочая система.

Создаем RAID1 /dev/mirror/gm0 и подключаем к нему диск /dev/ad4 (текущий):
gmirror label -v -b round-robin gm0 /dev/ad4

В случае появления ошибки “Can’t store metadata on /dev/ad4: Operation not permitted” делаем:
sysctl kern.geom.debugflags=16

Включаем загрузку модуля ядра geom_mirror.ko:
echo geom_mirror_load=YES >> /boot/loader.conf

В /etc/fstab меняем /dev/ad4 на /dev/mirror/gm0

Перезагружаемся и проверяем все ли нормально.

Подключаем в RAID1 второй диск:
gmirror insert gm0 /dev/ad6

В логе /var/log/messages должно появиться:
GEOM_MIRROR: Device gm0: provider ad6 detected.
GEOM_MIRROR: Device gm0: rebuilding provider ad6.

Дожидаемся окончания перестроения RAID, периодически запуская:
gmirror status
gmirror list

После завершения перестроения, скорость чтения должна возрасти почти в два раза.

В случае выхода из строя диска /dev/ad6, вставляем новый и делаем:
gmirror forget gm0
gmirror insert gm0 /dev/ad6

Best of Vim Tips

David Rayner (zzapper) 15 Years of Vi + 7 years of Vim and still learning 23Aug08 : Last Update



” new items marked *N* , corrected items marked *C*

” 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/+3 : find joe move cursor 3 lines down

/^joe.*fred.*bill/ : find joe AND fred AND Bill (Joe at start of line)

/^[A-J]/ : search for lines beginning with one or more A-J

/begin_.*end : search over possible multiple lines

/fred_s*joe/ : any whitespace including newline *C*

/fred|joe : Search for FRED OR JOE

/.*fred&.*joe : Search for FRED AND JOE in any ORDER!

// : search for fred but not alfred or frederick *C*

/ : Search for exactly 4 digit numbers

/DddddD : Search for exactly 4 digit numbers

/ : same thing

/([^0-9]|^)%.*% : Search for absence of a digit or beginning of line

” finding empty lines

/^n{3} : find 3 empty lines

/^str.*nstr : find 2 successive lines starting with str

/(^str.*n){2} : find 2 successive lines starting with str

” using rexexp memory in a search


” Repeating the Regexp (rather than what the Regexp finds)


” visual searching

:vmap // y/” : search for visually highlighted text

:vmap // y/=escape(@”, ‘\/.*$^~[]’) : with spec chars

” zs and ze regex delimiters :h /zs

/]*ze> : search for tag contents, ignoring chevrons

” zero-width :h /@=

/<@]*>@= : search for tag contents, ignoring chevrons

/<@]*>@= : search for tags across possible multiple lines

” searching over multiple lines _ means including newline

/ : search for multiple line comments

/fred_s*joe/ : any whitespace including newline *C*

/bugs(_.)*bunny : bugs followed by bunny anywhere in file

:h _ : help

” search for declaration of subroutine/function under cursor

:nmap gx yiw/^(subfunction)s+”

” multiple file search

:bufdo /searchstr/ : use :rewind to recommence search

” multiple file search better but cheating

:bufdo %s/searchstr/&/gic : say n and then a to stop

” How to search for a URL without backslashing

? : (first) search BACKWARDS!!! clever huh!

” Specify what you are NOT searching for (vowels)

/cv([^aeiou]&a){4} : search for 4 consecutive consonants

/%>20l%<30lgoat : Search for goat between lines 20 and 30 *N*

/^.{-}home.{-}zshome/e : match only the 2nd occurence in a line of “home” *N*

:%s/home.{-}zshome/alone : Substitute only the occurrence of home in any line *N*

” find str but not on lines containing tongue







:%s/fred/joe/igc : general substitute command

:%s//joe/igc : Substitute what you last searched for *N*

:%s/~/sue/igc : Substitute your last replacement string for *N*

:%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

:%s#]+>##g : delete html tags, leave text (non-greedy)

:%s###g : delete html tags possibly multi-line (non-greedy)

” VIM Power Substitute

:’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#.*(tbl_w+).*#1# : produce a list of all strings tbl_* *N*

:s/(.*):(.*)/2 : 1/ : reverse fields separated by :

:%s/^(.*)n1$/1/ : delete duplicate lines

” non-greedy matching {-}

:%s/^.{-}pdf/new.pdf/ : delete to 1st pdf only

” use of optional atom ?

:%s##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/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/

:%s/a/but/gie|:update|:next : then use @: to repeat

” ORing

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

:%s/v(.*n){5}/&r : insert a blank line every 5 lines *N*

” Calling a VIM function

:s/__date__/=strftime(“%c”)/ : insert datestring

” Working with Columns sub any str1 in col3


” Swapping first & last column (4 columns)


” filter all form elements into paste register

:redir @*|sil exec ‘g##p’|redir END

:nmap ,z :redir @*sil exec ‘g@<(inputselecttextarea/=form)>@p’redir END

” substitute string in column 30 *N*


” decrement numbers by 3


” increment numbers by 6 on certain lines only


” better


:h /zs

” increment only numbers ggdd by 6 (another way)


:h zero-width

” rename a string with an incrementing number

:let i=10 | ‘a,’bg/Abc/s/yy/=i/ |let i=i+1 # convert yy to 10,11,12 etc

” as above but more precise

:let i=10 | ‘a,’bg/Abc/s/xxzsyyze/=i/ |let i=i+1 # convert xxyy to xx11,xx12,xx13

” find replacement text, put in memory, then use zs to simplify substitute


” Pull word under cursor into LHS of a substitute

:nmap z :%s#<=expand(“”)>#

” Pull Visually Highlighted text into LHS of a substitute

:vmap z :%s/<*>/

” substitute singular or plural

:’a,’bs/bucket(s)*/bowl1/gic *N*


” 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


” Substitute inside substitute

:%s/.*/=’cp ‘.submatch(0).’ all/’.substitute(submatch(0),’/’,’_’,’g’)/


” global command display

:g/gladiolli/# : display with line numbers (YOU WANT THIS!)

:g/fred.*joe.*dick/ : display all lines fred,joe & dick

:g// : display all lines fred but not freddy

: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/fred/,/joe/j : Join Lines *N*

:g/——-/.-10,.d : Delete string & 10 previous lines

:g/{/ ,/}/- s/n+/r/g : Delete empty lines but only between {…}

:v/S/d : Delete empty lines (both types)

:v/./,/./-j : 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)

:’a,’bg/^/m’b : Reverse a section a to b

:g/^/t. : duplicate every line

:g/fred/t$ : copy(transfer) lines matching fred to EOF

:g/stage/t’a : copy (transfer) lines matching stage to marker a (cannot use .) *C*

:g/(^I[^^I]*){80}/d : delete all lines containing at least 80 tabs

” perform a substitute on every other line

:g/^/ if line(‘.’)%2|s/^/zz /

” 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


:%norm jdd : delete every other line

” incrementing numbers (type as 5 characters)

:.,$g/^d/exe “norm! “: increment numbers

:’a,’bg/d+/norm! ^A : increment numbers

” storing glob results (note must use APPEND) you need to empty reg a first with qaq.

“save results to a register/paste buffer

:g/fred/y A : append all lines fred to register a

:g/fred/y A | :let @*=@a : put into paste buffer

:let @a=”|g/Barratt/y A |:let @*=@a

” filter lines to a file (file must already exist)

:’a,’bg/^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.txt | -d

” display prettily

:g//z#.5 : display with context

:g//z#.5|echo “==========” : display beautifully

” Combining g// with normal mode commands

:g/|/norm 2f|r* : replace 2nd | with a star

“send output of previous global command to a new window

:nmap :redir @a:g//:redir END:new:put! a


” Global combined with substitute (power editing)

:’a,’bg/fred/s/joe/susan/gic : can use memory to extend matching

:/fred/,/joe/s/fred/joe/gic : non-line based (ultra)

:/biz/,/any/g/article/s/wheel/bucket/gic: non-line based *N*


” Find fred before beginning search for joe



” create a new file for each line of file eg 1.txt,2.txt,3,txt etc

:g/^/exe “.w “.line(“.”).”.txt”


” Summary of editing repeats *N*

. last edit (magic dot)

:& last substitute

:%& last substitute every line

:%&gic last substitute every line confirm

g% normal mode repeat last substitute

g& last substitute on all lines

@@ last recording

@: last command-mode command

:!! last :! command

:~ last substitute

:help repeating


” Summary of repeated searches

; last f, t, F or T

, last f, t, F or T in opposite direction

n last / or ? search

N last / or ? search in opposite direction


” Absolutely essential


* # g* g# : find word under cursor () (forwards/backwards)

% : match brackets {}[]()

. : repeat last modification

@: : repeat last : command (then @@)

matchit.vim : % now matches tags

<?php etc

: word completion in insert mode

: Line complete SUPER USEFUL

/ : Pull onto search/command line

/ : Pull onto search/command line

:set ignorecase : you nearly always want this

:set smartcase : overrides ignorecase if uppercase used in search string (cool)

:syntax on : colour syntax in Perl,HTML,PHP etc

:h regexp : type control-D and get a list all help topics containing

regexp (plus use TAB to Step thru list)



:nmap ,s :source $VIM/_vimrc

:nmap ,v :e $VIM/_vimrc

” How to have a variant in your .vimrc for different PCs *N*


ab mypc vista


ab mypc dell25



“VISUAL MODE (easy to add other HTML Tags)

:vmap sb “zdiz : wrap around VISUALLY selected Text

:vmap st “zdi<?= z ?> : wrap around VISUALLY selected Text


“vim 7 tabs

vim -p fred.php joe.php : open files in tabs

:tabe fred.php : open fred.php in a new tab

:tab ball : tab open files

” vim 7 forcing use of tabs from .vimrc

:nnoremap gf gf

:cab e tabe

:tab sball : retab all files in buffer (repair) *N*


” Exploring

:e . : file explorer

:Exp(lore) : file explorer note capital Ex

:Sex(plore) : file explorer in split window

:browse e : windows style browser

:ls : list of buffers

:cd .. : move to parent directory

:args : list of files

:args *.php : open list of files (you need this!)

:lcd %:p:h : change to directory of current file

:autocmd BufEnter * lcd %:p:h : change to directory of current file automatically (put in _vimrc)


” 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//u1L2/g

” titlise a line

nmap ,t :s/.*/L&/:s/<./u&/g *N*

” Uppercase first letter of sentences



gf : open file name under cursor (SUPER)

:nnoremap gF :view : 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

, : increment,decrement number under cursor

win32 users must remap CNTRL-A

=5*5 : insert 25 into text (mini-calculator)


” Make all other tips superfluous

:h 42 : also

:h holy-grail



” Markers & moving about

‘. : jump to last modification line (SUPER)

`. : jump to exact spot in last modification line

g; : cycle thru recent changes (oldest first)

g, : reverse direction


:h changelist : help for above

: retrace your movements in file (starting from most recent)

: 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 (puts you in full edit mode) (exit CTRL-C)

q: : commandline history Window (puts you in full edit mode) (exit CTRL-C)

: : history Window (exit CTRL-C)


” Abbreviations & Maps

” Following 4 maps enable text transfer between VIM sessions

:map :’a,’bw! c:/aaa/x : save text to file x

:map :r c:/aaa/x : retrieve text

:map :.w! c:/aaa/xr : store current line

:map :r c:/aaa/xr : retrieve current line

: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

: carriage Return for maps

: Escape

: normally

: | pipe

: backspace

: No hanging shell window

#display RGB colour under the cursor eg #445588

:nmap c :hi Normal guibg=#=expand(“”)

map /price only\|versus/ :in a map need to backslash the

# type table,,, to get

### Cool ###

imap ,,, bdwa<pa></pa>kA


” Simple PHP debugging display all variables yanked into register a

iab phpdb exit(“

Debug a “);


” Using a register as a map (preload registers in .vimrc)

:let @m=”:’a,’bs/”

:let @s=”:%!sort -u”


” Useful tricks

“ayy@a : execute “Vim command” in a text file

yy@” : same thing using unnamed register

u@. : execute command JUST typed in

“ddw : store what you delete in register d *N*

“ccaw : store what you change in register c *N*


” Get output from other commands (requires external programs)

:r!ls : reads in output of ls

:r !grep “^ebay” file.txt : grepping in content *N*

:20,25 !rot13 : rot13 lines 20 to 25 *N*

!!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!!)

:g/^$/;,/^$/-1!sort : Sort each block (note the crucial 😉

” Sorting with internal sort

:sort /.*%2v/ : sort all lines on second column *N*


” 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

:b3 : go to buffer 3 *C*

: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 (old way)

:sav! %:r.cfm : Save Current file to alternative extension

:sav %:s/fred/joe/ : do a substitute on file name

:sav %:s/fred/joe/:r.bak2 : do a substitute on file name & ext.

:!mv % %:r.bak : rename current file (DOS use Rename or DEL)

:help filename-modifiers

: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 :ls: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 j_

map k_


” 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)

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


3) hit : and the following appears


4)Complete as follows

:’norm @q


“combining a recording with a map (to end up in command mode)

:nnoremap ] @q:updatebd


” Visual is the newest and usually the most intuitive editing mode

” Visual basics

v : enter visual mode

V : visual mode whole line

: enter VISUAL BLOCK mode

gv : reselect last visual area (ultra)

o : navigate visual area

“*y or “+y : yank visual area into paste buffer *C*

V% : visualise what you match

V}J : Join Visual block (great)

V}gJ : Join Visual block w/o adding spaces

`[v`] : Highlight last insert


” Delete first 2 characters of 10 successive lines



” how to copy a set of columns using VISUAL BLOCK

” visual block (AKA columnwise selection) (NOT BY ordinary v command)

then select “column(s)” with motion commands (win32 )

then c,d,y,r etc


” how to overwrite a visual-block of text with another such block *C*

” move with hjkl etc

Pick the first block: ctrl-v move y

Pick the second block: ctrl-v move P


” text objects :h text-objects *C*

daW : delete contiguous non whitespace

di< yi< ci< : Delete/Yank/Change HTML tag contents

da< ya< ca< : Delete/Yank/Change whole HTML tag

dat dit : Delete HTML tag pair

diB daB : Empty a function {}

das : delete a sentence


” _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:silent !start c:progra~1intern~1iexplore.exe file://%:p

:nmap ,i :update: !start c:progra~1intern~1iexplore.exe


” FTPing from VIM

cmap ,r :Nread

cmap ,w :Nwrite

gvim # uses netrw.vim


” appending to registers (use CAPITAL)

” yank 5 lines into “a” then add a further 5





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


” Conventional Shifting/Indenting


” visual shifting (builtin-repeat)

:vnoremap < <gv

:vnoremap > >gv

” Block shifting (magic)



” 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

:.y* : Yank Current line to paster

” filter non-printable characters from the paste buffer

” useful when pasting from some gui application

:nmap p :let @* = substitute(@*,'[^[:print:]]’,”,’g’)”*p


” Re-Formatting text

gq} : Format a paragraph

gqap : Format a paragraph

ggVGgq : Reformat entire file

Vgq : current line

” break lines at 70 chars, if possible after a ;



” 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 exe “normal @q” | w : perform a recording on open files

:silent bufdo !zip %:p : zip all current files


” Command line tricks

gvim -h : help

ls | gvim – : edit a stream!!

cat xx | gvim – -c “v/^dd|^[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

” Using vimgrep with copen *N*

:vimgrep /keywords/ *.php



” 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

” complex diff parts of same file *N*

:1,2yank a | 7,8yank b

:tabedit | put a | vnew | put b

:windo diffthis


” 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)

: pull word under the cursor into a command line or search

: pull WORD under the cursor into a command line or search

– : pull small register (also insert mode)

[0-9a-z] : pull named registers (also insert mode)

% : pull file name (also #) (also insert mode)

=somevar : pull contents of a variable (eg :let sray=”ray[0-9]”)


” List your Registers

:reg : display contents of all registers

:reg a : display content of register a

:reg 12a : display content of registers 1,2 & a *N*

“5p : retrieve 5th “ring”

“1p…. : retrieve numeric registers one by one

:let @y=’yy@”‘ : pre-loading registers (put in .vimrc)

qqq : empty register “q”

qaq : empty register “a”

:reg .-/%:*” : the seven special registers *N*

:reg 0 : what you last yanked, not affected by a delete *N*

“_dd : Delete to blackhole, don’t affect any register *N*


” manipulating registers

:let @a=@_ : clear register a

:let @a=”” : clear register a

:let @a=@” : Save unnamed register *N*

:let @*=@a : copy register a to paste buffer

:let @*=@: : copy last command to paste buffer

:let @*=@/ : copy last search to paste buffer

:let @*=@% : copy current filename to paste buffer


” help for help (USE TAB)

:h quickref : VIM Quick Reference Sheet (ultra)

:h tips : Vim’s own Tips Help

:h visual : obtain list of all visual help topics

: Then use tab to step thru them

:h ctrl : list help of all control keys

:helpg uganda : grep HELP Files use :cn, :cp to find next

:helpgrep edit.*director: grep help using regexp

:h :r : help for :ex command

:h CTRL-R : normal mode

:h /r : what’s r in a regexp (matches a )

:h \zs : double up backslash to find zs in help

:h i_CTRL-R : help for say in insert mode

:h c_CTRL-R : help for say in command mode

:h v_CTRL-V : visual mode

:h tutor : VIM Tutor

, : Move back & Forth in HELP History

gvim -h : VIM Command Line Help

:cabbrev h tab h : open help in a tab *N*


” 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/vim64/doc : rebuild all *.txt help files in /doc

:help add-local-help


” running file thru an external program (eg php)

map :w:!c:/php/php.exe %

map :w:!perl -c %


” 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



” create a new buffer, paste a register “q” into it, then sort new buffer

:new +put q|%!sort


” Inserting DOS Carriage Returns

:%s/$/&/g : that’s what you type

:%s/$/&/g : for Win32

:%s/$/^M&/g : what you’ll see where ^M is ONE character


” automatically delete trailing Dos-returns,whitespace

autocmd BufRead * silent! %s/[r t]+$//

autocmd BufEnter *.php :%s/[ tr]+$//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


” Retrieving last Search Command for copy & pasting into text



” more completions

: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 :set number! : 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 as 5 characters)

:.,$g/^d/exe “normal! ”

” advanced incrementing


” 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


” eg create list starting from 223 incrementing by 5 between markers a,b

:let I=223


” create a map for INC

cab viminc :let I=223 | ‘a,’bs/$/=INC(5)/


” generate a list of numbers 23-64



” editing/moving within current insert (Really useful)

: delete all entered

: delete last word

: beginning/end of line

: jump one word backwards/forwards

, : 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 ggOvim:ff=unix ts=4 ss=4vim60:fdm=markergg


” A function to save word under cursor to a file

function! SaveWord()

normal yiw

exe ‘:!echo ‘.@0.’ >> word.txt’


map ,p :call SaveWord()


” function to delete duplicate lines

function! Del()

if getline(“.”) == getline(line(“.”) – 1)

norm dd



:g/^/ call Del()


” Digraphs (non alpha-numerics)

:digraphs : display table

:h dig : help

ie’ : enters й

i233 : enters й (Unix)

i233 : enters й (Win32)

ga : View hex value of any character

#Deleting non-ascii characters (some invisible)

:%s/[x00-x1fx80-xff]/ /g : type this as you see it

:%s/[128-255]//gi : where you have to type the Control-V

:%s/[Ђ-я]//gi : Should see a black square & a dotted y

:%s/[128-25501-31]//gi : All pesky non-asciis

:exec “norm /[x00-x1fx80-xff]/” : same thing

#Pull a non-ascii character onto search bar

yl/” :

/[^a-zA-Z0-9_[:space:][:punct:]] : search for all non-ascii


” All file completions grouped (for example main_c.c)

:e main_ : tab completes

gf : open file under cursor (normal)

main_ : include NAME of file in text (insert mode)


” Complex Vim

” swap two words

:%s//=strpart(“offon”, 3 * (“off” == submatch(0)), 3)/g

” swap two words

:vnoremap `.“gvP“P

” Swap word with next word

nmap gw “_yiw:s/(%#w+)(_W+)(w+)/321/ *N*


” 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:

” Force syntax automatically (for a file with non-standard extension)

au BufRead,BufNewFile */Content.IE?/* setfiletype 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)


gvim -S Session.vim : Reload all files


#tags (jumping to subroutines/functions)

taglist.vim : popular plugin

:Tlist : display Tags (list of functions)

: 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


” Highlight a particular csv column (put in .vimrc)

function! CSVH(x)

execute ‘match Keyword /^([^,]*,){‘.a:x.’}zs[^,]*/’

execute ‘normal ^’.a:x.’f,’


command! -nargs=1 Csv :call CSVH()

” 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

:help folding


” displaying “non-asciis”

: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

:!echo %:t : filename only

:reg % : display filename

% : insert filename (insert mode)

“%p : insert filename (normal mode)

/% : 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 :let @*=expand(“%:p”) :unix

nnoremap :let @*=substitute(expand(“%:p”), “/”, “\”, “g”) :win32


” Simple Shell script to rename files w/o leaving vim

$ vim

:r! ls *.c

:%s/(.*).c/mv & 1.bla

:w !sh



” count words in a text file



” example of setting your own highlighting

:syn match DoubleSpace ” ”

:hi def DoubleSpace guibg=#e0e0e0


” reproduce previous line word by word

imap ] @@@hhkyWjl?@@@P/@@@3s

nmap ] i@@@hhkyWjl?@@@P/@@@3s

” Programming keys depending on file type

:autocmd bufenter *.tex map :!latex %

:autocmd bufenter *.tex map :!xdvi -hush %<.dvi&


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


” Return to last edit position (You want this!) *N*

autocmd BufReadPost *

if line(“‘””) > 0 && line(“‘””) <= line(“$”) |

exe “normal! g`”” |



” store text that is to changed,deleted in register a

“act< : Change Till < *N*


” Just Another Vim Hacker JAVH

vim -c “:%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?”




If you liked these please return to

and vote for this tip (It does encourage me!!)

Tip 305


“Read Vimtips into a new vim buffer (needs

:tabe | :r ! w3m -dump *N*


” *NEW* Tools to use with VIM to help the editing process

VimTools *N*


updated version at


Please email any errors, tips etc to

” Information Sources


Vim Wiki *N*

Vim Use VIM newsgroup *N*

comp.editors “VIM” specific newsgroup

VIM Webring

Vim Book

Searchable VIM Doc

VimTips PDF Version (PRINTABLE!)


” : commands to neutralise < for HTML display and publish

” use yy@” to execute following commands

:w!|sav! vimtips.html|:/^__BEGIN__/,/^__END__/s#<#<#g|:w!|:!vimtipsftp


FreeBSD. Поиск нужного вам приложения

Перед тем, как устанавливать какое-либо приложение, вам нужно знать, что вы хотите и как называется нужное вам приложение.

Список имеющихся для FreeBSD приложений постоянно растёт. К счастью, есть несколько способов найти то, что вам нужно:

На сайте FreeBSD поддерживается обновляемый список имеющихся приложений для FreeBSD, в котором можно выполнять поиск, по адресу Порты разбиты на категории, и вы можете либо выполнить поиск приложения по имени (если его знаете), либо просмотреть список всех приложений, относящихся к определённой категории.

Dan Langille поддерживает сайт FreshPorts по адресу На нём отслеживаются изменения в приложениях из дерева портов, как только они происходят, он позволяет вам “отслеживать” один или несколько портов, и может высылать оповещение по электронной почте при их обновлении.

Если вы не знаете названия нужного вам приложения, попытайтесь воспользоваться сайтом типа FreshMeat ( для поиска приложения, а затем возвратитесь на сайт FreeBSD, чтобы проверить, есть ли порт для этого приложения.

Если вы знаете точное имя порта, и хотите определить, в какой категории он находится, используйте команду whereis(1). Просто наберите в приглашении “whereis file”, где file – программа, которую вы хотите установить. И если она имеется в системе, об этом будет сообщено, как показано ниже:

# whereis lsof
lsof: /usr/ports/sysutils/lsof
Это говорит о том, что lsof (системная утилита) находится в каталоге /usr/ports/sysutils/lsof.

Ещё одним способом поиска некоторого порта является использование встроенной возможности поиска в коллекции портов. Чтобы ею воспользоваться, вы должны находиться в каталоге /usr/ports. Очутившись в этом каталоге, выполните команду make search name=program-name, где program-name – это название программы, которую вы хотите найти. Например, если вы ищете lsof:

# cd /usr/ports
# make search name=lsof
Port: lsof-4.56.4
Path: /usr/ports/sysutils/lsof
Info: Lists information about open files (similar to fstat(1))
Index: sysutils
Вам следует обратить особое внимание на строчку “Path:”, так как в ней указывается, где найти порт. Остальная сообщаемая информация для установки порта не нужна, поэтому здесь она описываться не будет.

Для выполнения более глубокого поиска вы можете также использовать make search key=string, где string представляет собой некоторый текст, который ищется. При этом будет выполнен поиск в именах портов, комментариях, описаниях и зависимостях, и его можно использовать для поиска портов, связанных с некоторой темой, если вы не знаете названия программы, которую вы ищете.

В обоих этих случаях строка поиска нечувствительна к регистру. Поиск “LSOF” приводит к тому же самому результату, что и поиск “lsof”.

FreeBSD: Customize Home, Del, Insert keys for BASH shell

By default when you use FreeBSD’s BASH shell and if you hit Home, Del, Insert keys all of them just prints ~ (some garbage is printed ). To get rid of this problem, edit /etc/profile file and define key binding.

1) Open your bash global profile file:
# vi /etc/profile

2) Add following line to it:
export INPUTRC=/usr/local/etc/inputrc

3) Close and save the file

4) Open the file /usr/local/etc/inputrc and define / modify key binding:
# vi /usr/local/etc/inputrc

5) Append following config data:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

“e[1~”: beginning-of-line
“e[4~”: end-of-line
“e[5~”: beginning-of-history
“e[6~”: end-of-history
“e[3~”: delete-char
“e[2~”: quoted-insert
“e[5C”: forward-word
“e[5D”: backward-word

SED cheatsheet

Using sed to insert a line after a pattern

sed -i '/search_pattern/ainsert_line' filename

replace text with SED
The essential command: s for substitution

Replacing foo with foo_bar in a single file.

sed -i ‘s/foo/foo_bar/g’ somefile.module

find /home/bruno/old-friends -type f -exec sed -i ‘s/ugly/beautiful/g’ {} ;

A little script to find and replace multiple files at once:

for fl in *.php; do
mv $fl $fl.old
sed ‘s/FINDSTRING/REPLACESTRING/g’ $fl.old > $fl
rm -f $fl.old

Проверка правильности записи на CD и DVD диск

Для CD-дисков
// не монтировать

dd if=/dev/cdrom | md5sum

Для DVD-дисков

Т.к. при записи на DVD пишется так же и служебная информация, для проверки DVD-дисков нужно указывать размер и количество блоков.

echo $(( $(ls -l my.iso | awk ‘{ print $5 }’) / 2048 ))

dd if=/dev/cdrom bs=2048 count= | md5sum

FreeBSD Apache HTTP Accept Filter Error

When Apache web server is starting up in FreeBSD system, Apache loads succcessfully and web server functioning properly, but the following warning error occurs:

[warn] (2)No such file or directory:
Failed to enable the ‘httpready’ Accept Filter

The resolution to the above problem is to a accf_http module, which function is to buffer incoming connections until a certain complete HTTP requests arrive, into FreeBSD kernel by using kernel linker:

kldload accf_http

To permanently load enable HTTP Accept Filter FreeBSD kernel module (accf_http), add the following line into /boot/loader.conf: