Vimscript
Paradigma | imperativní |
---|---|
Autor | Bram Moolenaar |
Typová kontrola | dynamická |
Hlavní implementace | Vim |
Ovlivněn jazyky | C |
OS | UNIX, GNU/Linux, Windows NT, macOS, iOS, AmigaOS, MorphOS |
Licence | GPL-kompatibilní charityware |
Web | vim.org |
Vimscript (nebo Vim script) je dynamicky typovaný imperativní skriptovací jazyk textového editoru Vim. Vychází z příkazového jazyka editoru ex.
Uživatel pomocí Vimscriptu může do editoru nadefinovat nové schopnosti, zefektivnit často prováděné úlohy, pozměnit chování standardních schopností editoru či je zcela nahradit svými algoritmy. Pluginy a makra Vimu jsou psána ve Vimscriptu. Podobá se ostatním skriptovacím jazykům jako je například Perl. Vimscript může být zapisován přímo v prostředí Vimu ve formě příkazů nebo (běžnější) uložen v obyčejném textovém souboru s koncovkou .vim.
Ukázka Vimscriptu
[editovat | editovat zdroj]function Minimum ( cislo1, cislo2 ) if a:cislo1 < a:cislo2 let mensi = a:cislo1 else let mensi = a:cislo2 endif return mensi endfunction
Tento kód napsaný ve Vimscriptu definuje novou funkci se jménem "Minimum", která bere dva argumenty (cislo1 a cislo2). Funkce obsahuje jednu podmínku, dvě přiřazení a jeden návratový příkaz.
Vlastnosti Vimscriptu
[editovat | editovat zdroj]- Příkazy
- Proměnné
- Výrazy
- Regulární výrazy
- Řídící konstrukty
- Podmínka
- Cyklus
- Funkce
- Seznamy a slovníky
- Výjimky
Příkazy
[editovat | editovat zdroj]Poznámka: jedná se o příkazy použitelné v režimu ex; při interaktivním zadávání v základním režimu je nutné před příkazy napsat dvojtečku.
Přiřazovací příkaz:
let proměnná = výraz
Výpis hodnoty do stavového řádku:
echo výraz
– lze použít pro zkoušení, jak fungují funkce – například echo line('.')
vypíše do stavového řádku číslo aktuálního řádku
Volání procedury:
call jméno(parametry)
Provedení příkazu v normálním (základním, příkazovém) režimu:
normal příkaz
– například normal 4dd
smaže řádek, na kterém stojí kurzor, a další 3 řádky
Provedení dvojtečkového příkazu:
execute příkaz
– příkaz execute line('.') "," line('.')+3 "d"
také smaže řádek, na kterém stojí kurzor, a další 3 řádky (tento příkaz je pouze pro ilustraci, místo line('.')
a line('.')+3
lze použít libovolné výrazy, pro tento speciální případ by samozřejmě bylo jednodušší použít execute ".,+3d"
)
Proměnné
[editovat | editovat zdroj]Lokální proměnné jsou identifikátory bez prefixu, parametry mají prefix a:
, globální proměnné prefix g:
.
Funkce
[editovat | editovat zdroj]line('.')
– vrací číslo řádku, na kterém stojí kursor (1 = první řádek)line('$')
– vrací číslo posledního řádku řádku v aktuálním bufferucol('.')
– vrací číslo bytu na pozici kursoru od začátku řádku (1 = kursor je začátku řádku)col('$')
– vrací číslo bytu za posledním znakem řádku, na kterém stojí kursorvirtcol('.')
– vrací číslo pozice, které stojí kursorgetline('.')
– vrací obsah řádku, na kterém stojí kursorcall setline('.', řetězec)
– změní obsah řádku, na kterém stojí kursor na zadaný řetězeccall cursor(řádek, pozice)
– nastaví kursor na zadaný řádek a pozici na řádku (obojí číslované od 1)strpart(řetězec, začátek, délka)
– vrací podřetězec z řetězce zadaného prvním parametrem začínající na pozici zadané druhým parametrem (číslované od 0), o délce zadané třetím parametrem; není-li uveden třetí parametr, bere se podřetězec do konce původního řetězcesearch(regexp[, flagy[, stopline[, timeout]]])
– hledá od aktuální pozice kursoru řetězec vyhovující regulárnímu výrazu regexp, flagy ovlivňují způsob hledání (pro další informace použijte ve vimu příkaz :help search); při úspěchu přesune kursor a vrátí číslo řádku; při neúspěchu kursor ponechá na původním místě a vrátí 0input(výzva)
– vypíše výzvu do stavového řádku, čeká na zadání řetězce, který vrátí jako návratovou hodnotu
Příklad
[editovat | editovat zdroj]Následující příklad definuje příkazy cp
a cP
, které se chovají podobně jako standardní příkazy p
a P
– tj. vloží za kursor, resp. před kursor text z pomocné bufferu; na rozdíl od nich však vkládaný text oddělí od původního textu vložením mezery na začátku a/nebo na konci jako by se jednalo o jedno nebo více samostatných slov.
set nocompatible function! WholeWordPut(put_before) if a:put_before == 0 " vložení za kursor " pozice znaku, za který se vkládá let lpos = col('.')-1 " příkaz l posune kursor o pozici doprava execute "normal" "l" " pozice znaku, před který se vkládá let rpos = col('.')-1 execute "normal" "l" " pozice dalšího znaku let xpos = col('.')-1 if xpos == rpos let xpos = col('$')-1 else execute "normal" "h" endif if rpos == lpos let rpos = col('$')-1 else execute "normal" "h" endif else " vložení před kursor let rpos = col('.')-1 execute "normal" "h" let lpos = col('.')-1 if rpos != lpos execute "normal" "l" endif execute "normal" "l" let xpos = col('.')-1 if xpos == rpos let xpos = col('$')-1 else execute "normal" "h" endif endif " znak, za který se vkládá let lchar = strpart(getline('.'), lpos, rpos-lpos) " znak, před který se vkládá let rchar = strpart(getline('.'), rpos, xpos-rpos) if lchar == '' || match(lchar, '[(\[{< ]') == 0 " na začátku řádku a za otevírací závorku nevkládat před vložený text mezeru let put_string = substitute(@@, '^ *', '', '') else let put_string = substitute(@@, '^ *', ' ', '') endif if rchar == '' || match(rchar, '[)\]}> \.,?!:;]') == 0 " na konci řádku, před zavírací závorku a interpunkci nevkládat za vložený text mezeru let put_string = substitute(put_string, ' *$', '', '') else let put_string = substitute(put_string, ' *$', ' ', '') endif " Vložení textu call setline('.', strpart(getline('.'), 0, rpos) . put_string . strpart(getline('.'), rpos)) " Umístění kursoru call cursor(line('.'), rpos+strlen(put_string)) endfunction noremap cp :call WholeWordPut(0)<CR> noremap cP :call WholeWordPut(1)<CR>