Vim ve funkci integrovaného vývojového prostředí
================================================
■ Autor Pavel Tišnovský
■ Email
■ Datum 2014-10-05
Vim
---
▶ 1988 Vi iMitation Bram Moolenaar (Amiga)
▶ Později přenos na Unixové systémy
◆ Vi iMitation -> Vi iMproved
▶ Z Vi převzaty:
◆ modální režim práce
◆ klávesové zkratky
◆ většina voleb
◆ příkazy (příkazový režim)
▶ Podpora pluginů, tabů, oken
▶ Zvýraznění syntaxe, kontrola pravopisu
▶ Makra, skriptování
Vim při vývoji
--------------
▶ Obecné vlastnosti
◆ Konfigurační volby
◆ Zobrazení textů
◆ Zalamování textů
◆ Folding
◆ Okna, buffery, taby
▶ Vim a jazyky C/C++
▶ Vim a Java
▶ Vim a Clojure
▶ Vim a XML
▶ Vim a HTML
▶ Režim diff
▶ Editace binárních souborů
Základní konfigurační volby
---------------------------
:set nocompatible
:set ruler
:set statusline=...
:set (no)expandtab
(:retab)
:set backspace=[indent,eol,start]
:set filetype=[dos,unix]
:set selection=exclusive
bloky se chovají podobně jako v ostatních editorech
:set wildmenu
bude se nabízet seznam souborů po TAB
:set wildignore=*~,*.bak,*.log,*.aut,*.dvi,*.o
soubory (masky nazvů), které se nebudou zobrazovat
Volby způsobu zobrazení textů
-----------------------------
:set number
:set list
:set tabstop=xxx
:set showmatch
:set matchpairs=(:),[:],{:},<:>
Chování editoru při chybě
-------------------------
:set novisualbell
:set vb t_vb="
Zvýraznění aktuálního řádku/sloupce
-----------------------------------
:set cursorcolumn
:set cursorline
:hi CursorLine guibg=#2d2d2d
:hi CursorColumn guibg=#2d2d2d
Taby nebo mezery?
-----------------
:syn match Tab "\t"
:syn match Tab2 "\t\t"
:hi def Tab ctermbg=lightgreen guibg=#e0ffe0
:hi def Tab2 ctermbg=lightred guibg=#ffe0e0
Zalamování textu
----------------
:set wrap
pouze vizuální zalamování (do souborů se nevkládá CR)
:set nowrap
vypnutí vizuálního zalamování
:set linebreak
vizuální zalamování na hranicích slov (vhodné pro texty)
:set nolinebreak
vypnutí vizuálního zalamování na hranicích slov
:set tw=xxx
automatické zalamování na xxx sloupci (vkládá se CR)
Konfigurace Vimu s GUI
----------------------
▶ vim -g, gvim ...
▶ .gvimrc
▶ Konfigurační volby
:set guifont?
:set guifont=DejaVu\ Sans\ Mono\ 12
:set guifont=*
:set linespace=počet_pixelů
:set guioptions?
:set guioptions+=a " kdyz neco oznacime pres , tak se to ulozi do clipboardu
:set guioptions-=T " vypnuti toolbaru
:set guioptions-=mM " vypnuti menu
Příliš mnoho konfiguračních voleb?
----------------------------------
▶ :options
Taby, okna, buffery
-------------------
▶ Lze vzájemně kombinovat
◆ Taby
• Rozdělení plochy na okna
▶ Rozdělení plochy na okna
◆ Základ většiny pluginů, které z Vimu dělají IDE
Taby
----
:tabnew
:tabnew soubor
:tabnext
:tabfirst
Ctrl+W gf
Okna
----
▶ Vytvoření a zrušení oken
Ctrl+W n (new)
Ctrl+W s (split)
Ctrl+W v (vertical split)
Ctrl+W f (file)
:q
▶ Přepínání mezi okny, přesuny oken
Ctrl+W w (přepínání oken)
Ctrl+W Ctrl+W (dtto, ale rychlejší)
Ctrl+W h/j/k/l (přepínání oken v daném směru)
Ctrl+Wh/j/k/l (přesun oken)
Okna
----
Ctrl++ (zvětšení pro horizontálně rozdělené okno)
Ctrl+- (zmenšení pro horizontálně rozdělené okno)
Ctrl+= (stejná velikost)
Ctrl+> (zvětšení pro vertikálně rozdělené okno)
Ctrl+< (zmenšení pro vertikálně rozdělené okno)
Buffery
-------
:bn(ext)
:bp(rev)
:bf(irst)
:bl(ast)
Folding
-------
:set foldmethod
manual
indent
expr
marker
syntax
diff (diff mode)
zf (fold) - jen při foldmethod=manual
- pracuje jako operátor
zo (open) zO - rekurze
zc (close) zC - rekurze
zv (view cursor line)
zd (delete) - ne pro text
Práce s tagy
------------
▶ Vytvoření souborů taglist.txt
◆ ctags
◆ ctags -R
◆ ctags -R /usr/lib/include
• Obrovské soubory, lepší skok na manuálovou stránku
• Shift+K
▶ Skok na definici
:tag jméno funkce lze zadat i regulárním výrazem
g+Levé tlačítko myši nefunkční v terminálu
Ctrl+Levé tlačítko myši nefunkční v terminálu
Ctrl+] ve vizuálním režimu podobné :tag
▶ Návrat zpět
◆ Ctrl+T
▶ Pohyb po nápovědě Vimu je řešen právě tímto způsobem
Operátory
---------
c change změna textu (delete a následný přechod do vkládacího režimu)
d delete vymazání textu
y yank kopie textu do registru
! filter filtrace přes externí příkaz
> shift right posun textu doprava o shiftwidth
< shift left posun textu doleva o shiftwidth
g~ swap case změna malých písmen na velké a naopak
gu lowercase změna na malá písmena (mínusky)
gU Uppercase změna na velká písmena (verzálky)
gq format zformátování textu
g? ROT13
= indent změna zarovnání textu, buď interním algoritmem,
nebo pomocí externího programu definovaného v equalprg
zf fold viz další slajdy
Pohyb po zdrojovém kódu
-----------------------
% přeskok mezi znaky definovanými volbou matchpairs
:set matchpairs=(:),[:],{:},<:>
Editace zdrojového kódu (1)
---------------------------
dab delete a block (omezeno kulatými závorkam)
dib delete inner block (omezeno kulatými závorkami)
daB delete a Block (omezeno složenými závorkami)
diB delete inner Block (omezeno složenými závorkami)
dat delete a tag vymazání textu umístěného v párové značce
dit delete inner tag vymazání textu umístěného v párové značce
cab change a block (kulaté závorky)
cib change inner block (kulaté závorky)
caB change a Block (složené závorky)
ciB change inner Block (složené závorky)
Editace zdrojového kódu (2)
---------------------------
= zarovnání textu vybraného libovolnou výběrovou operací
=aB indent a Block kombinace operátoru = a výběru bloku mezi {}
> posun vybraného textu doprava o shiftwidth
< posun vybraného textu doleva o shiftwidth
- lze kombinovat s Shift+V
>> posun jediného řádku doprava
<< posun jediného řádku doleva
Obecné moduly
-------------
Modul netrw
dnes standarní součást Vimu
:Explore
:HExplore
vim scp://uživatel@jméno_vzdáleného_počítače/cesta
Modul TagList
:TlistAddFiles *.c
:Tlist
:TlistAddFilesRecursive .
:Tlist
Modul matchit.vim
Modul NERD Tree
Překlad programů z Vimu
------------------
:make spuštění překladu
:clist výpis všech chybových hlášení
:cfirst přechod na první chybu
:clast přechod na poslední chybu
:cp přechod na předchozí chybu
:cn přechod na následující chybu
:set makeprg=javac\ %
Vim a jazyky C/C++
------------------
▶ c.vim
◆ Komentáře
◆ Šablony
◆ Překlady
◆ Spouštění
◆ Ideální si zobrazit menu
Vim a jazyky C/C++
------------------
◆ ctags
◆ cscope
:cscope add cscope.out
:cs show
výpis propojení mezi Vimem a utilitou cscope
:cs f f stdio.h
nalezení souboru specifikovaného ve třetím parametru
:cs f t xyzzy
nalezení textu uvnitř řetězců (nikde jinde)
:cs f g test
nalezení definice funkce test (skok na začátek definice)
:cs f d main
zjištění, které funkce se volají z funkce main
:cs f c fclose
zjištění, odkud se volá funkce fclose
Vim a jazyky C/C++
------------------
◆ Formátování zdrojového kódu (C, C++, Java)
:set shiftwidth=???
:set cindent
:set cinoptions
fN úroveň posunutí otevírací levé závorky { pod jménem funkce
:N úroveň odsazení větví case/default v konstrukci switch-case
=N odsazení příkazu/příkazů za klíčovým slovem case/default
bN odsazení příkazu break v konstrukci switch-case
hN podobné volbě =N, ale platné pro klíčová slova public atd. (C++)
Vim a jazyky C/C++
------------------
◆ Speciální nastavení pro Makefile
augroup __makefile__
au!
au BufRead,BufNewFile Makefile set noexpandtab
augroup END
Omnicompletion
--------------
Ctrl+X Ctrl+L
nalezení a doplnění celého (shodného) řádku,
užitečné především pro konfiguračních soubory
Ctrl+X Ctrl+N
doplnění slova, které se nalézá v aktuálně
editovaném souboru
Ctrl+X Ctrl+I
podobné Ctrl+N, ovšem prohledávají se i všechny vkládané (included) soubory
Ctrl+X Ctrl+K
podobné Ctrl+N, ovšem slova se hledají v souborech
specifikovaných pomocí konfiguračního parametru dictionary
Ctrl+X Ctrl+T
podobné Ctrl+T, ovšem slova se hledají v souborech
specifikovaných pomocí konfiguračního parametru thesaurus
Omnicompletion
--------------
Ctrl+X Ctrl+]
vyhledávání v seznamu značek
Ctrl+X Ctrl+F
doplnění názvu souboru a/nebo cesty, postačuje například zadat text ~/ za
nímž následuje klávesová zkratka Ctrl+X Ctrl+F a zobrazí se výpis
souborů v domácím adresáři
Ctrl+X Ctrl+D
vyhledání definice makra a doplnění jména tohoto makra
Ctrl+X Ctrl+U
zavolání funkce zadané v konfiguračním parametru completefunc, které se předá právě editovaný text
Ctrl+X Ctrl+O
vyvolání omni completion
Vim a Java
----------
augroup __java__
au!
au BufReadPre,BufNewFile *.java set fileencodings=utf-8 fileencoding=utf-8 encoding=utf-8
au BufRead,BufNewFile *.java set tw=0 foldmethod=indent cindent
au BufRead,BufNewFile *.java set tabstop=4 expandtab
au BufRead,BufNewFile *.java set foldmethod=syntax foldclose=all foldnestmax=1
au BufRead,BufNewFile *.java set guioptions=
au BufRead,BufNewFile *.java syn region myFold start="{" end="}" transparent fold
au BufRead,BufNewFile *.java noremap >>
au BufRead,BufNewFile *.java so ~/javabrowser.vim
au BufRead,BufNewFile *.java noremap ,c O/****/
au BufRead,BufNewFile *.java inoremap ,p * @param
augroup END
Vim a Java
----------
Modul JavaBrowser
Enter přeskok kurzoru na definici metody/atributu
o dtto, ale otevře se nové okno
+ rozbalení podstromu
- zabalení podstromu
* rozbalení celého stromu
x skrytí či zobrazení okna se zdrojovým kódem
Vim a assembler
---------------
augroup __asm__
au!
au BufRead,BufNewFile *.asm set tw=0 nowrap
au BufRead,BufNewFile *.asm noremap :!nasm -f bin % -o output.com -l output.lst
au BufRead,BufNewFile *.asm noremap :!start output.com
augroup END
Vim a Lua
---------
▶ lua-support.vim a.k.a. Lua-IDE
◆ Šablony (soubory s nimi lze upravovat)
▶ Luaref
◆ Kompletní referenční příručka ve formátu Vim helpu!
Vim a Clojure
-------------
▶ Slime for Vim
◆ Využívá screen a posílání příkazů do běžícího REPLu
◆ Jednoduché a přitom velmi snadno použitelné (kompletní IDE :-)
▶ Vimclojure
Vim a XML
---------
▶ Modul xml.vim
◆ http://www.vim.org/scripts/script.php?script_id=301
◆ Uzavírání tagů, kompletace tagů, ...
:%!xmllint --format -
:'<,'>!xmllint --format -
:map =. :%!xmllint --format -
Vim a HTML
----------
▶ Taktéž lze použít xml.vim
" Settings for HTML files {{{
"*********************************************************************
augroup __html__
au!
au BufRead,BufNewFile *.html set spell spelllang=cs spellfile=~/temp/cs.iso-8859-2.add iskeyword=@,48-57,_,128-255
au BufReadPre,BufNewFile *.html set fileencodings=utf-8 fileencoding=utf-8 encoding=utf-8
au BufRead,BufNewFile *.html set tw=0 linebreak
au BufRead,BufNewFile *.html imap ,x ×
au BufRead,BufNewFile *.html imap ,pi π
au BufRead,BufNewFile *.html imap ,phi φ
au BufRead,BufNewFile *.html imap ,sp
au BufRead,BufNewFile *.html imap ,tt F<
au BufRead,BufNewFile *.html imap ,tb
au BufRead,BufNewFile *.html imap ,te
au BufRead,BufNewFile *.html imap ,ii F<
au BufRead,BufNewFile *.html imap ,ee F<
au BufRead,BufNewFile *.html imap ,ib
au BufRead,BufNewFile *.html imap ,ie
au BufRead,BufNewFile *.html imap ,bb F<
au BufRead,BufNewFile *,html imap ,be
au BufRead,BufNewFile *.html imap ,uu F<
au BufRead,BufNewFile *.html imap ,ub
au BufRead,BufNewFile *.html imap ,ue
au BufRead,BufNewFile *.html imap ,h1 F<
au BufRead,BufNewFile *.html imap ,h2 F<
au BufRead,BufNewFile *.html imap ,h3 F<
au BufRead,BufNewFile *.html imap ,h4 F<
au BufRead,BufNewFile *.html imap ,h5 F<
au BufRead,BufNewFile *.html imap ,h6 F<
au BufRead,BufNewFile *.html imap ,br
au BufRead,BufNewFile *.html vmap omaomb`bi`ai
au BufRead,BufNewFile *.html vmap omaomb`bi`ai
au BufRead,BufNewFile *.html vmap omaomb`bi`ai
au BufRead,BufNewFile *.html vmap omaomb`bi`ai
au BufRead,BufNewFile *.html vmap omaomb`bi`ai
au BufRead,BufNewFile *.html vmap omaomb`bi`ai
au BufRead,BufNewFile *.html vmap omaomb`ba
`ai
augroup END
Režim diff
----------
▶ vim -d test_old.c test_new.c
▶ vim -d test.c ../test-sources/
▶ Příkazy
[c skok na začátek předchozího bloku se změnami
]c skok na začátek následujícího bloku se změnami
dp přenos změny do druhého souboru
do opak předchozího příkazu – získání změny
:diffupdate tento příkaz provede nové vyhodnocení
rozdílů mezi oběma
Editace binárních souborů
-------------------------
▶ Editace binárních souborů velmi obtížná
▶ Mnoho programátorů preferuje hexa editory
▶ xxd
▶ Příklad použití pro soubory *.class
augroup Binary_Java_Class
au!
au BufReadPre *.class let &bin=1
au BufReadPost *.class if &bin | %!xxd -g1
au BufReadPost *.class set ft=xxd | endif
au BufWritePre *.class if &bin | %!xxd -g1 -r
au BufWritePre *.class endif
au BufWritePost *.class if &bin | %!xxd -g1
au BufWritePost *.class set nomod | endif
augroup END
Editace binárních souborů
-------------------------
0000000: ca fe ba be 00 00 00 32 00 0f 0a 00 03 00 0c 07 .......2........
0000010: 00 0d 07 00 0e 01 00 06 3c 69 6e 69 74 3e 01 00 ..........
0000020: 03 28 29 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 .()V...Code...Li
0000030: 6e 65 4e 75 6d 62 65 72 54 61 62 6c 65 01 00 04 neNumberTable...
0000040: 6d 61 69 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c main...([Ljava/l
0000050: 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a ang/String;)V...
0000060: 53 6f 75 72 63 65 46 69 6c 65 01 00 09 54 65 73 SourceFile...Tes
0000070: 74 2e 6a 61 76 61 0c 00 04 00 05 01 00 04 54 65 t.java........Te
0000080: 73 74 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f st...java/lang/O
0000090: 62 6a 65 63 74 00 21 00 02 00 03 00 00 00 00 00 bject.!.........
00000a0: 02 00 01 00 04 00 05 00 01 00 06 00 00 00 1d 00 ................
00000b0: 01 00 01 00 00 00 05 2a b7 00 01 b1 00 00 00 01 .......*........
00000c0: 00 07 00 00 00 06 00 01 00 00 00 01 00 09 00 08 ................
00000d0: 00 09 00 01 00 06 00 00 00 19 00 00 00 01 00 00 ................
00000e0: 00 01 b1 00 00 00 01 00 07 00 00 00 06 00 01 00 ................
00000f0: 00 00 03 00 01 00 0a 00 00 00 02 00 0b .............
Změna obarvení zdrojových kódů
------------------------------
▶ Jaké barvy dokáže zobrazit váš terminál?
:source $VIMRUNTIME/syntax/colortest.vim
▶ Převod zdrojového kódu na HTML
:source $VIMRUNTIME/syntax/2html.vim
Příklad obarvení - tyto slajdy :-)
----------------------------------
augroup __ascii__
au!
au BufRead,BufNewFile *.txt syn match odrazka1 "^\%d9654.*"
au BufRead,BufNewFile *.txt syn match odrazka2 "^ .*""
au BufRead,BufNewFile *.txt syn match odrazka3 "^ .*"
au BufRead,BufNewFile *.txt syn match nadpis "^[A-Z].*"
au BufRead,BufNewFile *.txt hi odrazka1 ctermfg=lightgreen guifg=#e0ffe0
au BufRead,BufNewFile *.txt hi odrazka2 ctermfg=yellow guifg=yellow
au BufRead,BufNewFile *.txt hi odrazka3 ctermfg=lightcyan guifg=#e0e0ff
au BufRead,BufNewFile *.txt hi nadpis ctermfg=white guifg=white
augroup END
Další příklad obarvení - logo Vimu
----------------------------------
augroup __logo__
au BufRead,BufNewFile vim.logo syn match zeleny_ctverec "+"
au BufRead,BufNewFile vim.logo syn match ide "[#m\"]"
au BufRead,BufNewFile vim.logo syn match okraj "[\\|/'_]"
au BufRead,BufNewFile vim.logo hi zeleny_ctverec ctermfg=lightgreen guifg=lightgreen
au BufRead,BufNewFile vim.logo hi okraj ctermfg=white guifg=white
au BufRead,BufNewFile vim.logo hi ide ctermfg=yellow guifg=yellow
au BufRead,BufNewFile vim.logo hi normal guifg=gray
augroup END
Mapování kláves
---------------
au BufRead,BufNewFile *.java noremap :JavaBrowser
au BufRead,BufNewFile *.java inoremap :JavaBrowser
iabb Amaroute Amaurote
Caps Lock namísto ESC
---------------------
xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
Vimscript
---------
▶ Opět viz způsob zobrazení těchto slajdů
.
let g:slides=readfile("list.txt")
let g:index = 0
.
function! GotoFirstSlide()
let g:index = 0
endfunction
.
function! GotoLastSlide()
let g:index = len(g:slides) - 1
endfunction
.
function! BeforeFirstSlide()
return g:index < 0
endfunction
.
function! AfterLastSlide()
return g:index >= len(g:slides)
endfunction
.
function! ShowNextSlide()
let g:index += 1
if AfterLastSlide()
call GotoFirstSlide()
endif
call ShowActualSlide()
endfunction
.
function! ShowPrevSlide()
let g:index -= 1
if BeforeFirstSlide()
call GotoLastSlide()
endif
call ShowActualSlide()
endfunction
.
function! ShowFirstSlide()
call GotoFirstSlide()
call ShowActualSlide()
endfunction
.
function! ShowLastSlide()
call GotoLastSlide()
call ShowActualSlide()
endfunction
.
function! ShowActualSlide()
execute "edit" g:slides[g:index]
endfunction
.
function! StatusLine()
return "Slide " . (1+g:index) . "/" . len(g:slides) . " : " . g:slides[g:index]
endfunction
.
" Hot keys
map :call ShowPrevSlide()
map :call ShowNextSlide()
map :call ShowFirstSlide()
map :call ShowLastSlide()
.
" Setup
set statusline=%!StatusLine()
.
" Would be better to show status line even if only one window is displayed
set laststatus=2
:call ShowFirstSlide()
Odkazy
------
www.vim.org
vim.wikia.com/wiki/Vim_Tips_Wiki
. _____________________
. < Děkuji za pozornost >
. ---------------------
. \
. \ \_\_ _/_/
. \ \__/
. (oo)\_______
. (__)\ )\/\
. ||----w |
. || ||
.