VIM to bardzo niezwykły edytor tekstu, którego historia sięga początków UNIXa (VIimproved). Charakterystyczna klawiszologia, do której na początku trudno było mi się przyzwyczaić, ostatecznie okazała się bardzo użyteczna. Dziś nie wyobrażam sobie pracy w inny sposób niż ten, który zaproponowali twórcy VIMa. Często łapię się na wpisywaniu :w pisząc tekst w innym niż VIM edytorze (tak, dla mnie pisanie tekstu dzieli się na to z użyciem VIMa i bez niego. Na szczęście ten drugi przypadek nie występuje zbyt często ;) Praktcznie każdego dnia odkrywam jego nowe możliwości, które szalenie uproszczają i umilają pracę z tekstem.
Mój plik ~/.vimrc
"------------------------------------ " " AUTOR: Piotr Ożarowski " WWW: www.ozarowski.pl " " PLIK: .vimrc " WERSJA: 2.2 " MODYFIKACJA: śro 21-06-2006 15:59 " "------------------------------------ set nocompatible " niekompatybilny z VI => włącz bajery VIMa set nobackup " nie trzymaj kopii zapasowych, używaj wersji set backspace=indent,eol,start set viminfo='20,\"50 " read/write a .viminfo file, don't store more than 50 lines of registers set history=50 " keep 50 lines of command line history set ruler " show the cursor position all the time set showcmd " display incomplete commands set incsearch " do incremental searching set browsedir=buffer " To get the File / Open dialog box to default to the current file's directory set pastetoggle=<F11> " przełączanie w tryb wklejania (nie będzie automatycznych wcięć, ...) set nonumber " nie wyświetlaj nr linii setlocal number " pierwszy odpalony bufor ma nrki set wildmenu " wyświetlaj linie z menu podczas dopełniania set showmatch " pokaz otwierający nawias gdy wpisze zamykający set so=5 " przewijaj juz na 5 linii przed końcem set statusline=%y[%{&ff}]\ \ ASCII=\%03.3b,HEX=\%02.2B\ %=%m%r%h%w\ %1*%F%*\ %l:%v\ (%p%%) set laststatus=2 " zawsze pokazuj linię statusu set fo=tcrqn " opcje wklejania (jak maja być tworzone wcięcia itp.) set hidden " nie wymagaj zapisu gdy przechodzisz do nowego bufora set tags+=./stl_tags " tip 931 set foldtext=MojFoldText() " tekst po zwinięciu zakładki set foldminlines=3 " minimum 3 linie aby powstał fold "set wildmode=longest:full " dopełniaj jak w BASHu "set cpoptions="A" "set keymodel=startsel,stopsel " zaznaczanie z shiftem let php_sql_query = 1 " podkreślanie składni SQL w PHP let php_htmlInStrings = 1 " podkreślanie składni HTML w PHP let python_highlight_all = 1 if version >= 700 set ofu=syntaxcomplete#Complete " Default to omni completion using the syntax highlighting files set spelllang=pl,en set balloonexpr=BalloonExpr() " tip 1149 set ballooneval endif behave xterm if &t_Co > 2 || has("gui_running") syntax on " kolorowanie składni set hlsearch " zaznaczanie szukanego tekstu colorscheme POX " domyślny schemat kolorów endif if has("gui_running") set foldcolumn=2 " szerokość kolumny z zakładkami set guioptions=abegimrLtT " m.in: włącz poziomy scrollbar set nowrap set cursorline " zaznacz linię z kursorem "set cursorcolumn " zaznacz kolumnę z kursorem else "set ts=4 " jak odpalony w konsoli to znaki tabulacji o polowe mniejsze endif " automatyczne rozpoznawanie typu pliku, ladowanie specyficznego, dla danego typu, pluginu (ftplugin.vim, indent.vim): filetype plugin indent on """"""""""""""""""" AUTO COMMANDS: """"""""""""""""""""""""""""""""""{{{ if has("autocmd") autocmd BufEnter * :lcd %:p:h " cd na katalog, w którym znajduje się aktualny bufor " zaczynaj od ostatniej znanej pozycji kursora: autocmd BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | execute "normal g`\"" | endif " autouzupełnianie z plików syntax: autocmd FileType * execute "setlocal complete+="."k$VIMRUNTIME/syntax/".&ft.".vim" autocmd FileType text setlocal textwidth=78 " w plikach tekstowych zawijaj tekst po 78. znakach autocmd BufNewFile,Bufread *.php,*.php3,*.php4,*.php5 set keywordprg="help" "autocmd BufNewFile * startinsert " rozpoczyna w trybie INSERT " zapamiętuj zakładki, itp: "autocmd BufWinLeave *.* mkview "autocmd BufWinEnter *.* silent loadview "autocmd BufReadPost */stl_doc/*.html :silent execute ":!elinks ".expand("%:p") | bdelete " tip 931 autocmd BufNewFile,BufRead muttng-*-\w\+,muttng\w\{6\},ae\d setfiletype mail " MuttNG "autocmd BufRead *.py set foldmethod=indent " UWAGA: FileType pomija modeline, dlatego detekcja po rozszerzeniu else set autoindent " automatyczne wcięcia set mouse=a " myszka w konsoli endif "}}} """"""""""""""""""" KLAWISZOLOGIA: """"""""""""""""""""""""""""""""""{{{ map gb :bnext<CR> map gB :bprevious<CR> map <C-B> :!php -l %<CR> " sprawdzanie składni PHP nnoremap <silent><F8> :Tlist<CR> " Tag List map <leader><leader> [{V%zf " \\ wewnatrz bloku {} tworzy fold i go zamyka inoremap <Tab> <C-R>=InsertTabWrapper("backward")<CR> inoremap <S-Tab> <C-R>=InsertTabWrapper("forward")<CR> map <Leader>b GoZ<ESC>:g/^$/.,/./-j<CR>Gdd " Collapse multiple contiguous empty lines into a single line map <Leader>n GoZ<ESC>:g/^[ <Tab>]*$/.,/[^ <Tab>]/-j<CR>Gdd " Collapse multiple contiguous blank lines into a single line "map <Leader>c :%s/[[:cntrl:]]/\r/g " Replace control characters with a new line separator map <Leader>d :%s/[<Char-128>-<Char-255>]//g " Delete extended characters (128-255) map <Leader>e :%s/\(.*[^ ][^ ]*\) *$/\1/c " Remove trailing spaces at the end of a line map <Leader>f :%s/^ *\(.*\)/\1/c " Remove leading spaces at the beginning of a line map <Leader>g :%s/ */ /gc " Collapse multiple contiguous spaces into a single space map <Leader>h :/<code>/+1,/<\/code>/-1s/&/\&/gc " Convert & to & between CODE tags map <Leader>i :/<code>/+1,/<\/code>/-1s/</\</gc " Convert < to < between CODE tags map <Leader>j :/<code>/+1,/<\/code>/-1s/>/\>/gc " Convert > to > between CODE tags map <silent><F12> <ESC>:ZoomWin<CR> map <C-W><C-F> <ESC>:FirstExplorerWindow<CR> map <C-W><C-B> <ESC>:BottomExplorerWindow<CR> map <C-W><C-T> <ESC>:WMToggle<CR> " szukanie we wszystkich plikach: nmap <F3> :while !search( @/, "W") \| bnext \| endwhile<CR> " szukaj zaznaczonego tekstu z '*' i '#' (a nie tylko wyrazu pod kursorem): vnoremap * y/<C-R>"<CR> vnoremap # y?<C-R>"<CR> " wyszukiwanie TYLKO w zaznaczonym fragmencie: vnoremap / <ESC>/\%><C-R>=line("'<")-1<CR>l\%<<C-R>=line("'>")+1<CR>l vnoremap ? <ESC>?\%><C-R>=line("'<")-1<CR>l\%<<C-R>=line("'>")+1<CR>l " Make shift-insert work like in Xterm: map <S-Insert> <MiddleMouse> map! <S-Insert> <MiddleMouse> " nie trać zaznaczenia przy < i > noremap < <gv noremap > >gv if version >= 700 map <silent><C-W>N <ESC>:tabnew<CR> imap <silent><C-W>N <ESC>:tabnew<CR> "map <silent><C-W><backspace><backspace> <ESC>:e #<CR> "imap <silent><C-W><backspace><backspace> <ESC>:e #<CR> " sprawdzanie pisowni "map <F7> :w<CR>:!ispell -x -d polish %<CR><CR>:e<CR><CR> map <silent><F7> :setlocal spell!<CR> imap <silent><F7> <ESC>:setlocal spell!<CR> " przemieszczanie zakładek (tabów) kombinacją ALT+, ALT+. nn <silent> <M-.> :if tabpagenr() == tabpagenr("$")\|tabm 0\|el\|exe "tabm ".tabpagenr()\|en<CR> nn <silent> <M-,> :if tabpagenr() == 1\|exe "tabm ".tabpagenr("$")\|el\|exe "tabm ".(tabpagenr()-2)\|en<CR> endif "}}} """"""""""""""""""" FUNKCJE: """"""""""""""""""""""""""""""""""""""""{{{ " tekst po zwinięciu zakładki: function! MojFoldText() let linia = getline(v:foldstart) let linia = substitute(linia, '/\*\|\*/\|{{{\d\=\|//\|<!--\|-->', '', 'g') "}}} return v:folddashes.' '.v:foldend.' (ZWINIĘTO: '.(v:foldend-v:foldstart+1).') '.linia endfunction " Uzupełnianie wyrazów przez <Tab> - TIP #102: function! InsertTabWrapper(direction) let col = col('.') - 1 if !col || getline('.')[col - 1] !~ '\k' return "\<tab>" elseif "backward" == a:direction return "\<c-p>" else return "\<c-n>" endif endfunction function! s:DiffWithSaved() let filetype=&ft diffthis " new | r # | normal 1Gdd - for horizontal split vnew | r # | normal 1Gdd diffthis execute "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype endfunction command! Diff call s:DiffWithSaved() " TIP #1149: Returns either the contents of a fold or spelling suggestions. if version >= 700 function! BalloonExpr() let foldStart = foldclosed(v:beval_lnum ) let foldEnd = foldclosedend(v:beval_lnum) let lines = [] " If we're not in a fold... if foldStart < 0 " If 'spell' is on and the word pointed to is incorrectly spelled, the tool tip will contain a few suggestions. let lines = spellsuggest( spellbadword( v:beval_text )[ 0 ], 5, 0 ) else let numLines = foldEnd - foldStart + 1 " Up to 31 lines get shown okay; beyond that, only 30 lines are shown with ellipsis in between to indicate too much. " The reason why 31 get shown okay is that 30 lines plus one of ellipsis is 31 anyway... if ( numLines > 31 ) let lines = getline( foldStart, foldStart + 14 ) let lines += [ '-- Snipped ' . ( numLines - 30 ) . ' lines --' ] let lines += getline( foldEnd - 14, foldEnd ) else let lines = getline( foldStart, foldEnd ) endif endif return join( lines, has( "balloon_multiline" ) ? "\n" : " " ) endfunction endif "}}} """"""""""""""""""" PLUGINY: """"""""""""""""""""""""""""""""""""""""{{{ " TOhtml: let html_use_css=1 " domyslnie uzywa CSS zamiast <font> let use_xhtml=1 " domyslnie tworzy XHTML zamiast HTML " WinManager: let g:miniBufExplMapWindowNavVim = 1 let g:miniBufExplMapWindowNavArrows = 1 let g:miniBufExplMapCTabSwitchBuffs = 1 let g:persistentBehaviour = 1 " nie zamykaj VIMa jezeli zostanie tylko okno exploratora " TimeStamp: let g:timestamp_modelines=20 " przeszukuj pierwsze 20 linii let g:timestamp_regexp = '\v\C%(\s+MODYFIKACJA:\s+)@<=.*$' let g:timestamp_rep = '%a %d-%m-%Y %R' " BuffExplorer: let g:bufExplorerSortBy='number' let g:bufExplorerSplitType='v' let g:bufexplorersplitvertsize = 100 let g:bufExplorerOpenMode=1 " Open using current window let g:bufExplorerSplitOutPathName=1 let g:bufExplorerShowDirectories=1 " Enanced Commentify: let g:EnhCommentifyTraditionalMode = "No" "}}} " wczytaj ustawienia specyficzne dla danego komputera if filereadable($HOME."/.vim/vimrc.local") source $HOME/.vim/vimrc.local endif " vim: fdm=marker
Plik schematu kolorów
"----------------------------------------------------- " Vim color file " Maintainer: Piotr Ozarowski <ozarow@gmail.com> " Last Change: 2006-05-24 20:13:00 GMT+2 " Version: 2.1 " URL: http://www.ozarowski.pl/komp/vim.php "----------------------------------------------------- " czcionka "set guifont="Monospace 8" "set guifont="Andale Mono 8" set gfn=Bitstream\ Vera\ Sans\ Mono\ 8 set background=light " kasuj poprzednie ustawienia hi clear if exists("syntax_on") syntax reset endif " ta linia musi byc nizej"}}} let g:colors_name="POX" hi Normal gui=none guibg=#1f2030 guifg=Green "hi Normal gui=none guibg=#1f3098 guifg=Green hi Constant guifg=Red guibg=bg hi Comment gui=italic guifg=DarkCyan ctermfg=Blue hi Identifier guifg=#40ffff hi Statement guifg=#ffa500 "hi Special guifg=#ff80ff hi Special guifg=Purple hi Type guifg=Green hi Visual ctermbg=Yellow guifg=Yellow guibg=RoyalBlue4 gui=none hi Cursor guibg=Yellow guifg=Black gui=bold hi String guifg=Red hi ToDo guibg=Red guifg=Yellow hi Search ctermbg=Yellow ctermfg=Red guibg=Yellow guifg=Red "hi LineNr guibg=#1f3560 guifg=Yellow "hi Folded guibg=DarkGreen guifg=Green "hi Folded guibg=#1f3560 guifg=RoyalBlue hi Folded ctermbg=Cyan ctermfg=Blue guibg=#1a2c4f guifg=RoyalBlue hi FoldColumn ctermbg=Blue ctermfg=Yellow guibg=#1a2c4f guifg=RoyalBlue hi LineNr ctermbg=NONE ctermfg=DarkYellow guibg=#1a2c4f guifg=Yellow hi StatusLine ctermfg=Green guifg=Green guibg=DarkGreen hi StatusLineNC ctermfg=DarkGreen guifg=DarkGreen guibg=Green hi CursorLine guibg=#1a2c4f hi CursorColumn guibg=#1a2c4f hi VertSplit guifg=DarkGreen guibg=Green hi ModeMsg guibg=DarkGreen guifg=Green hi link PreProc Special hi link String Constant hi MatchParen term=reverse ctermbg=Green ctermfg=Yellow guifg=Green guibg=Blue " DIFF hi DiffChange term=bold ctermbg=Blue guibg=RoyalBlue4 hi DiffAdd term=bold ctermbg=LightBlue guibg=RoyalBlue hi DiffText term=reverse cterm=bold ctermbg=Yellow gui=bold guibg=RoyalBlue hi DiffDelete term=bold ctermbg=Red ctermfg=Yellow guibg=Red guifg=yellow " taby (VIM7) hi TabLineFill ctermfg=DarkBlue guifg=DarkGreen hi TabLineSel ctermbg=Cyan ctermfg=Yellow guibg=Green guifg=DarkGreen hi TabLine ctermbg=Blue ctermfg=White guibg=DarkGreen guifg=Green " lista uzupełniania hi Pmenu ctermbg=DarkGreen ctermfg=Green guibg=DarkGreen guifg=Green hi PmenuSel ctermfg=Yellow ctermbg=Green guibg=Green guifg=DarkGreen hi PmenuSbar ctermbg=Green guibg=DarkGreen hi PmenuThumb ctermfg=Green guifg=Green
Klawiszologia - często używane polecenia i skróty klawiaturowe (poza tymi najbardziej oczywistymi)
:viusage # lista skrótów w VIMie :exusage # lista funkcji w VIMie # jak zmienić ^M ? :%s/^M$//g # (^M wpisujemu przez CTRL-V CTRL-M" # wyeksportowanie (razem z kolorkami) pliku do HTMLa :TOhtml #mozna zaznaczyc tylko fragment #zmiana języka manuali: (help usr_toc) :set helplang=en # test kolorkow vima - skladnia :so $VIMRUNTIME/syntax/hitest.vim # # udno / redo u # undo ^r # redo U # cofa wszystkie zmiany w linii :earlier 2h # przejdz do wersji sprzed 2h :later 2h # j.w., w drugą stronę :undolist # taby gt # następna zakładka, też: :tabn ^PageDown gT # poprzednia zakładka, też: :tabp ^PageUp :tabdo # uruchom polecenie dla wszystkich zakładek (np. :tabdo %s/stare/nowe/g gv # zaznacza ponownie tekst r # zamienia znak pod kursorem gf # otwiera plik, na którego nazwie znajduje się kursor ^w gf # otwiera plik, na którego nazwie znajduje się kursor w nowej zakładce ^n # szuka dopasowania (patrz tez ^X) ^p # szuka dopasowania (odwrócona kolejność) # spellchecker z= # zaproponuj poprawną pisownię dla wyrazu pod kursorem zg # dodaj wyraz do słownika zug # cofnij powyzsza operacje [s # przejdz do następnego błędnego wyrazu ]s # przejdz do poprzedniego błędnego wyrazu # tryby: o # otwiera linię PONIŻEJ kursora i umieszcza kursor w otwartej linii w trybie Insert (wprowadzanie). O # otwiera linię POWYŻEJ linii, w której znajduje się kursor. a # wstawia tekst ZA znakiem na, którym jest kursor. A # automatycznie dodaje tekst na końcu linii. R # wprowadza w tryb Replace (zamiana) dopóki nie zostanie wciśnięty <ESC>. i # zamiana & # wykonaj ostatnią operację podmiany (substitute) w aktualnej linii g& # wykonaj ostatnią operację podmiany na wszystkich liniach # pozycja: zz # ustaw ekran tak, aby kursor był na srodku zb # j.w., na dole zt # j.w., na gorze H # ustaw kursor na górze ekranu M # ustaw kursor na dole ekranu L # ustaw kursor na środku ekranu ( # przejdz do poprzedniego zdania ) # przejdź do następnego zdania # zakładki: zf # tworzenie zakładki - zaznacz obszar i zi # przełącz widok: zakładki/bez zakładek za # zwiń rozwiń aktualną zakładkę zM # zwiń wszystkie zakładki # bufory: :bd # kasuje bufor :Nunh # dzieli ekran na N części i umieszcza tam bufory :only lub ^W^o # tylko aktualne okno # rejestry: "1p # wstawia ostatni "2p # wstawia test przedostatnio skopiowany/skasowany/wycięty "ay # kopiuje do rejestru 'a' "Ay # dołącza do rejestru 'a' (do aktualnej zawartości dodaje nową) "ap # wkleja z rejestru 'a' "%p # wkleja nazwę aktualnego pliku ":p # wklej ostatnie polecenie z ':' "*p # wkleja zaznaczenie (tak jak srodkowy przycisk myszki) "+p # wkleja skopiowany tekst (tak jak CTRL+V) "~p # wkleja test 'przeciągany' (tak jak gdy znaznaczysz tekst w innym oknie i przeciągasz go gdzieś indziej) "/p # wkleja ostatni wyszukiwany tekst # markery: ma # zapamiętuje pozycję (marker) "a" `a # przechodzi do pozycji "a" 'a #przechodzi do pierwszego znaku w linii z markerem "a" `. # przechodzi do pozycji ostatniej modyfikacji # Grep :vimgrep cos * # wewn. funkcja :cl # lista błędów (tez dla vimgrep'a) :cp # poprzedni błąd (tez dla vimgrep'a) :cn # następny błąd (tez dla vimgrep'a) # roznice 2 plikow: :e pierwszy.plik :vert diffsplit drugi.plik # makra w - nazwa makra qa # rozpoczyna nagrywanie makra "a" <tu różne dzialania w trybie polecen lub w trybie wprowadzania> q # konczy nagrywanie @a # uruchamia makro "a" @@ # uruchamia ostatnio wywołane makro # zmiana kodowania pliku :e plik_w_iso8859-2 :set fileencoding=utf8 :w plik_w_utf8 # man najedz kursorem na rozkaz i wcisnij K (shift+k) # zamiana tylko w zaznaczonym obszarze :*s/foo/bar # zamiana w liniach od x do y :x,ys/foo/bar # substitute i podciagi :%s/jakis tekst\(wz[or1]*\)/zamieniono na \1/g # justowanie zaznacz tekst i wykonaj polecenie :ce, :ri lub :le (center, right, left) # formatowanie (np. do 80znaków) zaznacz tekst, wciśnij: gq # łączenie wielu linii zaznacz linie, wciśnij: J 5J - łączy 5 następnych linii # sortowanie linii zaznacz tekst i wykonaj polecenie :sort w trybie edycji mozna wcisnac CTRL+o i wpisac polecenie jak w trybie rozkazow, np. ^o d$ - kasuje do konca lini :help w # poruszanie sie :help c_<T :help insert-index :help user-manual :help Virtual-Replace-mode
19-05-2007