Vimscript
Paradigma | imperativní |
---|---|
Autor | Bram Moolenaar |
Typová kontrola | dynamická |
Hlavní implementace | Vim |
Ovlivněn jazyky | C |
Ovlivnil jazyky | ? |
Vimscript (nebo Vim script) je dynamicky typovaný imperativní skriptovací jazyk textového editoru Vim.
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
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
- 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('.')+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 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
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>