VIM

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.

Skrinszoty

910x730 1014x785

Pliki konfiguracyjne

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/&/\&amp;/gc           " Convert & to &amp; between CODE tags
map             <Leader>i                  :/<code>/+1,/<\/code>/-1s/</\&lt;/gc            " Convert < to &lt; between CODE tags
map             <Leader>j                  :/<code>/+1,/<\/code>/-1s/>/\&gt;/gc            " Convert > to &gt; 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

Autor: Piotr 'POX' Ożarowski. Napisano w VIM na Debian GNU/Linux
Valid HTML! Valid CSS!

19-05-2007