Vimscript

Z Wikipedie, otevřené encyklopedie
Vimscript
Paradigmaimperativní
AutorBram Moolenaar
Typová kontroladynamická
Hlavní implementaceVim
Ovlivněn jazykyC
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 bufferu
  • col('.') – 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. 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>

Externí odkazy