Vimscript
Author
Albert FloresVimscript (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. +more 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
function Minimum ( cislo1, cislo2 ) if a:cislo1
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
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
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('. +more')+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é
Lokální proměnné jsou identifikátory bez prefixu, parametry mají prefix a:, globální proměnné prefix g:.
Funkce
line('. ') - vrací číslo řádku, na kterém stojí kursor (1 = první řádek) * line('$') - vrací číslo posledního řádku řádku v aktuálním bufferu * col('. +more') - 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í kursor * virtcol('. ') - vrací číslo pozice, které stojí kursor * getline('. ') - vrací obsah řádku, na kterém stojí kursor * call setline('. ', řetězec) - změní obsah řádku, na kterém stojí kursor na zadaný řetězec * call 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ězce * search(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í 0 * input(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
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. +more 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('. +more')-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('. +more'), 0, rpos) . put_string . strpart(getline('. '), rpos)) " Umístění kursoru call cursor(line('. '), rpos+strlen(put_string)) endfunction.
noremap cp :call WholeWordPut(0) noremap cP :call WholeWordPut(1)
Externí odkazy
[url=http://vimdoc. sourceforge. +morenet/htmldoc/usr_41. html]Část dokumentace editoru Vim popisující Vimscript[/url] * [url=http://www. vim. org/scripts/index. php]Databáze programů ve Vimscriptu[/url] * [url=http://vim. wikia. com/wiki/Vim_scripts]Příklady ve Vimscriptu[/url].