Hlavní navigace

Tvorba vlastního pluginu pro textový editor Vim

Pavel Tišnovský 14. 5. 2015

V předchozích částech článku o přídavných modulech určených pro textový editor Vim jsme si popsali některé užitečné pluginy, ovšem prozatím jsme si neřekli, jakým způsobem je možné vytvořit si plugin vlastní. Proto je účelem dnešního článku seznámení čtenáře se základy tvorby a publikace přídavných modulů pro Vim.

Obsah

1. Tvorba vlastního pluginu pro textový editor Vim

2. První verze pluginu pro promítání slajdů

3. Odstranění globálních proměnných

4. Odstranění globálních funkcí

5. Unikátní jména funkcí pro mapování příkazů na klávesy

6. Adresářová struktura pluginu kompatibilního s modulem Pathogen

7. Soubor README.md a soubor obsahující nápovědu

8. Finální verze pluginu

9. Repositář s demonstračním pluginem

10. Odkazy na předchozí části článku

11. Odkazy na Internetu

1. Tvorba vlastního pluginu pro textový editor Vim

Používání pluginů ve Vimu je při použití nástrojů typu Pathogen či Vundle z hlediska uživatele velmi jednoduché, protože samotná instalace přídavného modulu se v naprosté většině případů omezuje na naklonování repositáře s pluginem, popř. na rozbalení archivu, v němž je tento přídavný modul distribuován. V porovnání s dříve používanými metodami distribuce a instalace pluginů se tedy jedná o krok vpřed, na druhou stranu je však nutné, aby tvůrci pluginů dodržovali několik pravidel zajišťujících například to, že si pluginy nebudou navzájem přepisovat funkce, klávesové zkratky či proměnné. V dnešním článku si ukážeme způsob tvorby velmi jednoduchého pluginu, který byl již několikrát úspěšně použit pro promítání slajdů přímo z Vimu. To s sebou přináší – minimálně pro skalního vimaře – poměrně velké množství výhod, například možnost zobrazení zdrojových souborů se zvýrazněním syntaxe, možnost výběru velikosti znaků v závislosti na kvalitě projektoru, mnohem rychlejší tvorbu slajdů, úplný WYSIWYG :-) apod.

Obrázek 1: Promítání slajdů v praxi.

Obrázek 2: Promítání slajdů v praxi.

2. První verze pluginu pro promítání slajdů

Podívejme se nejdříve na první verzi skriptu určeného pro prohlížení slajdů. Jeho funkce je poměrně jednoduchá. Nejdříve se s využitím externích příkazů ls a grep získá seznam všech souborů umístěných v aktuálním adresáři (do něj se lze přepnout příkazem :cd), tento seznam se setřídí, inicializuje se počitadlo slajdů a nastaví se mapování některých kláves (PageUp, PageDown, Home a End) na funkce sloužící k přepínání slajdů, tj. k načtení příslušného souboru příkazem execute „edit“ jméno_souboru s případným nastavením Vimu takovým způsobem, aby správně obarvil jednotlivé syntaktické kategorie. Navíc se ještě zaregistruje funkce zavolaná ve chvíli, kdy se má překreslit stavová řádka (status line), což je důležité, neboť zde potřebujeme zobrazit stav počitadla slajdů i celkový počet slajdů. Mapování klávesových zkratek je nastaveno následujícím způsobem:

Klávesa Význam
PageUp přechod na předchozí slajd
PageDown přechod na následující slajd
Home přechod na první slajd
End přechod na poslední slajd

První – a hned v několika ohledech špatně implementovaná – verze prohlížeče slajdů vypadá takto:

" Slideshow tool v1.0
" Pavel Tisnovsky 2012, 2013, 2014, 2015
 
" Ziskani seznamu vsech souboru v aktualnim adresari
function! GetFileList()
    return split(system("ls -1 | sort"))
endfunction
 
" Prechod na prvni slajd
function! GotoFirstSlide()
    let g:index = 0
endfunction
 
" Prechod na posledni slajd
function! GotoLastSlide()
    let g:index = len(g:slides) - 1
endfunction
 
" Zjisteni, zda uzivatel nepresel pred prvni slajd
function! BeforeFirstSlide()
    return g:index < 0
endfunction
 
" Zjisteni, zda uzivatel nepresel za posledni slajd
function! AfterLastSlide()
    return g:index >= len(g:slides)
endfunction
 
" Zobrazeni predchoziho slajdu
function! ShowNextSlide()
    let g:index += 1
    if AfterLastSlide()
        call GotoFirstSlide()
    endif
    call ShowActualSlide()
endfunction
 
" Zobrazeni nasledujiciho slajdu
function! ShowPrevSlide()
    let g:index -= 1
    if BeforeFirstSlide()
        call GotoLastSlide()
    endif
    call ShowActualSlide()
endfunction
 
" Zobrazeni prvniho slajdu
function! ShowFirstSlide()
    call GotoFirstSlide()
    call ShowActualSlide()
endfunction
 
" Zobrazeni posledniho slajdu
function! ShowLastSlide()
    call GotoLastSlide()
    call ShowActualSlide()
endfunction
 
" Funkce zajistujici nacteni slajdu
function! ShowActualSlide()
    execute "edit" g:slides[g:index]
endfunction
 
" Uprava stavove radky - bude se zobrazovat cislo
" slajdu, pocet slajdu a jmeno souboru obsahujiciho slajd
function! StatusLine()
    return "Slide " . (1+g:index) . "/" . len(g:slides) . " : " . g:slides[g:index]
endfunction
 
" Nastaveni zpusobu ovladani prohlizecky
function! SetupKeys()
    map <PageUp>   :call ShowPrevSlide()<cr>
    map <PageDown> :call ShowNextSlide()<cr>
    map <Home>     :call ShowFirstSlide()<cr>
    map <End>      :call ShowLastSlide()<cr>
endfunction
 
function! WeakPoint()
    " Promenna obsahujici seznam slajdu
    let g:slides = GetFileList()
 
    " Index aktualniho slajdu
    let g:index = 0
 
    " Kontrola
    if g:slides == []
        echo "Zadne soubory v pracovnim adresari"
    else
        " Registrace funkce pouzite pro zjisteni obsahu stavove radky
        set statusline=%!StatusLine()
 
        " Nastaveni zobrazeni stavove radky i v pripade, ze je pouzito
        " jen jedno okno
        set laststatus=2
 
        call ShowFirstSlide()
        call SetupKeys()
    endif
endfunction
 
call WeakPoint()

Poslední volání call WeakPoint() samozřejmě taktéž není korektní, lepší bude deklarovat nový příkaz command WeakPoint :call s:WeakPoint().

3. Odstranění globálních proměnných

Výše uvedený skript je sice funkční, ale trpí poměrně mnoha nectnostmi, které budeme muset postupně odstranit. Mezi první nedostatek patří použití globálních proměnných, tj. proměnných, před jejichž jména je přidán prefix g:. Ve chvíli, kdy má uživatel nainstalováno větší množství pluginů, může dojít k přepisům globálních proměnných, a proto je více než vhodné se jejich použití vyhnout, minimálně ve chvíli, kdy jsou tyto proměnné použity pouze uvnitř skriptu/pluginu a nikoli například pro uložení konfiguračních voleb. Řešení tohoto problému je ve skutečnosti velmi jednoduché, protože můžeme použít proměnné lokální v rámci modulu, v němž je skript napsán. V tomto případě se před jméno proměnné přidá prefix s:, kde „s“ znamená „script variable“. Taková proměnná je sdílena mezi všemi funkcemi v jednom skriptu (což potřebujeme), ale již není viditelná z dalších skriptů ani modulů. Takto by mohla vypadat upravená verze našeho prohlížeče slajdů:

" Slideshow tool v1.0
" Pavel Tisnovsky 2012, 2013, 2014, 2015
 
" Ziskani seznamu vsech souboru v aktualnim adresari
function! GetFileList()
    return split(system("ls -1 | sort"))
endfunction
 
" Prechod na prvni slajd
function! GotoFirstSlide()
    let s:index = 0
endfunction
 
" Prechod na posledni slajd
function! GotoLastSlide()
    let s:index = len(s:slides) - 1
endfunction
 
" Zjisteni, zda uzivatel nepresel pred prvni slajd
function! BeforeFirstSlide()
    return s:index < 0
endfunction
 
" Zjisteni, zda uzivatel nepresel za posledni slajd
function! AfterLastSlide()
    return s:index >= len(s:slides)
endfunction
 
" Zobrazeni predchoziho slajdu
function! ShowNextSlide()
    let s:index += 1
    if AfterLastSlide()
        call GotoFirstSlide()
    endif
    call ShowActualSlide()
endfunction
 
" Zobrazeni nasledujiciho slajdu
function! ShowPrevSlide()
    let s:index -= 1
    if BeforeFirstSlide()
        call GotoLastSlide()
    endif
    call ShowActualSlide()
endfunction
 
" Zobrazeni prvniho slajdu
function! ShowFirstSlide()
    call GotoFirstSlide()
    call ShowActualSlide()
endfunction
 
" Zobrazeni posledniho slajdu
function! ShowLastSlide()
    call GotoLastSlide()
    call ShowActualSlide()
endfunction
 
" Funkce zajistujici nacteni slajdu
function! ShowActualSlide()
    execute "edit" s:slides[s:index]
endfunction
 
" Uprava stavove radky - bude se zobrazovat cislo
" slajdu, pocet slajdu a jmeno souboru obsahujiciho slajd
function! StatusLine()
    return "Slide " . (1+s:index) . "/" . len(s:slides) . " : " . s:slides[s:index]
endfunction
 
" Nastaveni zpusobu ovladani prohlizecky
function! SetupKeys()
    map <PageUp>   :call ShowPrevSlide()<cr>
    map <PageDown> :call ShowNextSlide()<cr>
    map <Home>     :call ShowFirstSlide()<cr>
    map <End>      :call ShowLastSlide()<cr>
endfunction
 
function! WeakPoint()
    " Promenna obsahujici seznam slajdu
    let s:slides = GetFileList()
 
    " Index aktualniho slajdu
    let s:index = 0
 
    " Kontrola
    if s:slides == []
        echo "Zadne soubory v pracovnim adresari"
    else
        " Registrace funkce pouzite pro zjisteni obsahu stavove radky
        set statusline=%!StatusLine()
 
        " Nastaveni zobrazeni stavove radky i v pripade, ze je pouzito
        " jen jedno okno
        set laststatus=2
 
        call ShowFirstSlide()
        call SetupKeys()
    endif
endfunction
 
call WeakPoint()

4. Odstranění globálních funkcí

Další nepříjemnou vlastností původního skriptu je použití globálních funkcí. Textový editor Vim totiž za běžných podmínek nedovoluje přepis deklarace funkce jinou funkcí stejného jména, což znamená, že následující skript skončí s chybou:

function g:x()
    echo "Hello world!"
endfunction
 
function g:x()
    echo "Hello again..."
endfunction

Tuto kontrolu lze obejít velmi snadno – za klíčové slovo function se přidá vykřičník. V tomto případě Vim bez jakéhokoli upozornění přepíše již deklarovanou funkci novou deklarací:

function! g:x()
    echo "Hello world!"
endfunction
 
function! g:x()
    echo "Hello again..."
endfunction

Ani toto chování nám ovšem nevyhovuje, protože náš plugin může omylem přepsat funkce deklarované a používané jiným pluginem. Proto musíme přistoupit k deklaraci lokálních funkcí:

" Ziskani seznamu vsech souboru v aktualnim adresari
function! s:GetFileList()
    ...
endfunction
 
" Prechod na prvni slajd
function! s:GotoFirstSlide()
    ...
endfunction
 
" Prechod na posledni slajd
function! s:GotoLastSlide()
    ...
endfunction
 
" Zjisteni, zda uzivatel nepresel pred prvni slajd
function! s:BeforeFirstSlide()
    ...
endfunction
 
" Zjisteni, zda uzivatel nepresel za posledni slajd
function! s:AfterLastSlide()
    ...
endfunction
 
" Zobrazeni predchoziho slajdu
function! s:ShowNextSlide()
    ...
endfunction
 
" Zobrazeni nasledujiciho slajdu
function! s:ShowPrevSlide()
    ...
endfunction
 
" Zobrazeni prvniho slajdu
function! s:ShowFirstSlide()
    ...
endfunction
 
" Zobrazeni posledniho slajdu
function! s:ShowLastSlide()
    ...
endfunction
 
" Funkce zajistujici nacteni slajdu
function! s:ShowActualSlide()
    ...
endfunction
 
" Nastaveni zpusobu ovladani prohlizecky
function! s:SetupKeys()
    ...
endfunction
 
function! s:WeakPoint()
    ...
endfunction
 
command WeakPoint :call s:WeakPoint()

5. Unikátní jména funkcí pro mapování příkazů na klávesy

U lokálních funkcí však nastává problém – jak lze tyto funkce namapovat na klávesové zkratky? Konkrétně se jedná o následující řádky skriptu:

noremap <PageUp>   :call s:ShowPrevSlide()<cr>
noremap <PageDown> :call s:ShowNextSlide()<cr>
noremap <Home>     :call s:ShowFirstSlide()<cr>
noremap <End>      :call s:ShowLastSlide()<cr>

Tyto čtyři příkazy nebudou ve skutečnosti funkční, protože nastavení klávesových zkratek je záležitostí globálního nastavení Vimu a nikoli lokálního nastavení provedeného v jednom modulu. Řešením je použití symbolu <SID>, který je při načítání skriptu nahrazen za jednoznačný a přitom unikátní celočíselný identifikátor, takže nedojde ke kolizi se jménem jiné funkce. Výše uvedené mapování by tedy mělo vypadat takto:

noremap <PageUp>   :call <SID>ShowPrevSlide()<cr>
noremap <PageDown> :call <SID>ShowNextSlide()<cr>
noremap <Home>     :call <SID>ShowFirstSlide()<cr>
noremap <End>      :call <SID>ShowLastSlide()<cr>

Po načtení pluginu (a všech dalších pluginů) je možné si všechny deklarované funkce jednoduše vypsat příkazem:

:function

Obrázek 3: Na tomto výpisu funkcí můžete mj. vidět i funkce deklarované v pluginu vim-weakpoint. Před názvy funkcí je uveden jednoznačný identifikátor, takže nedojde ke kolizi jmen.

6. Adresářová struktura pluginu kompatibilního s modulem Pathogen

V současnosti se prakticky žádný přídavný modul neskládá pouze z vlastního skriptu, ale minimálně ze dvou dalších souborů. Jedná se o soubor nazvaný README či častěji README.md, který obsahuje krátkou informaci o účelu pluginu i o způsobu jeho instalace. Většina pluginů, jejichž repositáře jsou umístěny na GitHubu, používá soubor README.md, v němž lze využít značkovací jazyk Markdown, který je přímo na stránkách GitHubu korektně renderován, o čemž se ostatně můžeme snadno přesvědčit. Druhým souborem je nápověda uložená v podadresáři doc. Vlastní skript pluginu je pak uložen v podadresáři plugin, takže celá struktura přídavného modulu by měla vypadat následovně (předpokládejme, že plugin neobsahuje žádné soubory s definicí barev, obarvení syntaxe atd.):

.
├── doc
│   └── weakpoint.txt
├── plugin
│   └── weakpoint.vim
└── README.md

7. Soubor README.md a soubor obsahující nápovědu

Struktura souboru README.md může být následující. Povšimněte si použití znaků # a ## pro vytvoření základní struktury nadpisů, dále pak způsobu zápisu odkazu a taktéž použití odsazení, které v tomto případě povede k tisku zdrojového kódu (šedé pozadí, znaky z neproporcionálního fontu atd.):

# weakpoint
 
Simple slideshow tool
 
## Installation
 
With [pathogen.vim](https://github.com/tpope/vim-pathogen):
 
    cd ~/.vim/bundle
    git clone git://github.com/tisnik
 
## Usage
 
    :cd directory_with_slides
    :WeakPoint
 
If you use pathogen, you can use :Helptags to regenerate documentation.  You
then can see ":h weakpoint" for more information.
 
## License
 
Copyright (c) 2012-2015 Pavel Tisnovsky (BSD-Like)

Soubor s nápovědou je nepatrně složitější, protože i zde se používá značkovací jazyk, konkrétně značkovací jazyk používaný všemi soubory nápovědy ve Vimu. Podle mých zkušeností je nejlepší mít tento soubor otevřený dvakrát – v jednom okně se zvýrazněním syntaxe, ve druhém okně bez zvýraznění syntaxe. Důvod je jednoduchý: při zvýraznění syntaxe Vim některé znaky schová, protože mají speciální význam. Jedná se například o hvězdičky, kterými jsou uvozeny cíle odkazů (nápověda ve Vimu je hypertextová):

*weakpoint.txt* Simple slideshow tool
 
Author: Pavel Tisnovsky
License: BSD-like (see |weakpoint-license|)
 
INTRODUCTION                                    *weakpoint* *WeakPoint*
 
Simple slideshow tool
 
REQUIREMENTS                                    *weakpoint-requirements*
 
  - On Unix, you need to have "cp" and "sort" in your path.
 
INSTALLATION                                    *weakpoint-installation*
 
    cd ~/.vim/bundle
    git clone git://github.com/tisnik
 
USAGE                                           *weakpoint-usage* *:WeakPoint*
 >
    :WeakPoint
<
LICENSE                                         *weakpoint-license*
 
Copyright (c) 2012-2015 Pavel Tisnovsky
 
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
 
  * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
  * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
  * Neither the name William Lee nor the names of its contributors may be
    used to endorse or promote products derived from this software without
    specific prior written permission.
 
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
WILLIAM LEE AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 vim:tw=78:et:ft=help:norl:

Zajímavé je označení příkladu, které se provádí značkami >[konec řádku] a ^< [na začátku samostatného řádku]:

  syn region helpExample        matchgroup=helpIgnore start=" >$" start="^>$" end="^[^ \t]"me=e-1 end="^<"

Použití nápovědy:

:help weakpoint zobrazí nápovědu od začátku
:help weakpoint-requirements zobrazí nápovědu od sekce REQUIREMENTS
:help weakpoint-installation zobrazí nápovědu od sekce INSTALLATION
:help weakpoint-usage zobrazí nápovědu od sekce USAGE
:help weakpoint-license zobrazí nápovědu od sekce LICENSE

Obrázek 4: Zobrazení nápovědy ve Vimu.

8. Finální verze pluginu

Poslední verze pluginu pro zobrazení slajdů je vypsána pod tímto odstavcem. Jedná se o stejnou verzi, jakou naleznete v GIT repositáři:

" Slideshow tool v1.3
" Pavel Tisnovsky 2012, 2013, 2014, 2015
 
" Ziskani seznamu vsech souboru v aktualnim adresari
function! s:GetFileList()
    return split(system("ls -1 | sort"))
endfunction
 
" Prechod na prvni slajd
function! s:GotoFirstSlide()
    let s:index = 0
endfunction
 
" Prechod na posledni slajd
function! s:GotoLastSlide()
    let s:index = len(s:slides) - 1
endfunction
 
" Zjisteni, zda uzivatel nepresel pred prvni slajd
function! s:BeforeFirstSlide()
    return s:index < 0
endfunction
 
" Zjisteni, zda uzivatel nepresel za posledni slajd
function! s:AfterLastSlide()
    return s:index >= len(s:slides)
endfunction
 
" Zobrazeni predchoziho slajdu
function! s:ShowNextSlide()
    let s:index += 1
    if s:AfterLastSlide()
        call s:GotoFirstSlide()
    endif
    call s:ShowActualSlide()
endfunction
 
" Zobrazeni nasledujiciho slajdu
function! s:ShowPrevSlide()
    let s:index -= 1
    if s:BeforeFirstSlide()
        call s:GotoLastSlide()
    endif
    call s:ShowActualSlide()
endfunction
 
" Zobrazeni prvniho slajdu
function! s:ShowFirstSlide()
    call s:GotoFirstSlide()
    call s:ShowActualSlide()
endfunction
 
" Zobrazeni posledniho slajdu
function! s:ShowLastSlide()
    call s:GotoLastSlide()
    call s:ShowActualSlide()
endfunction
 
" Funkce zajistujici nacteni slajdu
function! s:ShowActualSlide()
    execute "edit" s:slides[s:index]
endfunction
 
" Uprava stavove radky - bude se zobrazovat cislo
" slajdu, pocet slajdu a jmeno souboru obsahujiciho slajd
function! StatusLine()
    return "Slide " . (1+s:index) . "/" . len(s:slides) . " : " . s:slides[s:index]
endfunction
 
" Nastaveni zpusobu ovladani prohlizecky
function! s:SetupKeys()
    noremap <PageUp>   :call <SID>ShowPrevSlide()<cr>
    noremap <PageDown> :call <SID>ShowNextSlide()<cr>
    noremap <Home>     :call <SID>ShowFirstSlide()<cr>
    noremap <End>      :call <SID>ShowLastSlide()<cr>
endfunction
 
function! s:WeakPoint()
    " Promenna obsahujici seznam slajdu
    let s:slides = s:GetFileList()
 
    " Index aktualniho slajdu
    let s:index = 0
 
    " Kontrola
    if s:slides == []
        echo "Zadne soubory v pracovnim adresari"
    else
        " Registrace funkce pouzite pro zjisteni obsahu stavove radky
        set statusline=%!StatusLine()
 
        " Nastaveni zobrazeni stavove radky i v pripade, ze je pouzito
        " jen jedno okno
        set laststatus=2
 
        call s:ShowFirstSlide()
        call s:SetupKeys()
    endif
endfunction
 
command WeakPoint :call s:WeakPoint()

9. Repositář s demonstračním pluginem

Plugin, který jsme si v dnešním článku popsali, byl uložen do GIT repositáře dostupného na adrese https://github.com/tisnik/vim-weakpoint. Z tohoto repositáře lze provést snadnou instalaci nám již důvěrně známou sekvencí příkazů:

cd ~/.vim/bundle
git clone https://github.com/tisnik/vim-weakpoint
Cloning into 'vim-weakpoint'...
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 18 (delta 3), reused 17 (delta 2), pack-reused 0
Unpacking objects: 100% (18/18), done.
Checking connectivity... done.

10. Odkazy na předchozí části článku

  1. Užitečné skripty a pluginy pro textový editor Vim
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim/
  2. Užitečné skripty a pluginy pro textový editor Vim (2.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-2-cast/
  3. Užitečné skripty a pluginy pro textový editor Vim (3.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-3-cast/
  4. Užitečné skripty a pluginy pro textový editor Vim (4.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-4-cast/
  5. Užitečné skripty a pluginy pro textový editor Vim (5.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-5-cast/
  6. Užitečné skripty a pluginy pro textový editor Vim (6.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-6-cast-cestovani-v-case/
  7. Užitečné skripty a pluginy pro textový editor Vim (7.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-7-cast/

11. Odkazy na Internetu

  1. Writing Vim Plugins
    http://stevelosh.com/blog/2011/09/wri­ting-vim-plugins/
  2. how to understand this vim script?
    http://stackoverflow.com/qu­estions/12625091/how-to-understand-this-vim-script
  3. Novinky ve VIM 7: Skriptovací jazyk
    http://www.root.cz/vim-sedm-druha-cast/
  4. DirDiff.vim : A plugin to diff and merge two directories recursively.
    http://www.vim.org/scripts/scrip­t.php?script_id=102
  5. vim-dirdiff na GitHubu
    https://github.com/will133/vim-dirdiff
  6. fakeclip : pseudo clipboard register for non-GUI version of Vim
    http://www.vim.org/scripts/scrip­t.php?script_id=2098
  7. vim-fakeclip na GitHubu
    https://github.com/kana/vim-fakeclip
  8. vim-fakeclip: Dokumentace
    http://kana.github.io/con­fig/vim/fakeclip.html
  9. Vim Multiple Cursors na GitHubu
    https://github.com/terryma/vim-multiple-cursors
  10. SLIME (Wikipedia)
    http://en.wikipedia.org/wiki/SLIME
  11. vim-slime na GitHubu
    https://github.com/jpalardy/vim-slime
  12. vi Editor Commands
    http://www.cs.rit.edu/~cslab/vi­.html#A1.4
  13. vi Manual
    http://www.cs.fsu.edu/gene­ral/vimanual.html
  14. Mastering the Vi Editor
    http://www.susnet.uk/mastering-the-vi-editor
  15. Using undo branches
    http://vim.wikia.com/wiki/U­sing_undo_branches
  16. Gundo
    http://sjl.bitbucket.org/gundo.vim/
  17. Vim as a Python IDE, or Python IDE as Vim
    http://blog.jetbrains.com/pychar­m/2013/06/vim-as-a-python-ide-or-python-ide-as-vim/
  18. histwin na GitHubu
    https://github.com/chrisbra/his­twin.vim
  19. histwin.vim : Browse the undo tree
    http://www.vim.org/scripts/scrip­t.php?script_id=2932
  20. undotree.vim : Display your undo history in a graph
    http://www.vim.org/scripts/scrip­t.php?script_id=4177
  21. Surround
    http://www.bestofvim.com/plu­gin/surround/
  22. SnipMate
    http://www.bestofvim.com/plu­gin/snipmate/
  23. Getting a Clojure REPL in Vim With VimClojure, Nailgun, and Leiningen
    http://naleid.com/blog/2011/12/19/get­ting-a-clojure-repl-in-vim-with-vimclojure-nailgun-and-leiningen/
  24. The NERD Commenter : A plugin that allows for easy commenting of code for many filetypes.
    http://www.vim.org/scripts/scrip­t.php?script_id=1218
  25. NERD Commenter na GitHubu
    https://github.com/scroolo­ose/nerdcommenter
  26. luarefvim : Lua reference manual
    http://www.vim.org/scripts/scrip­t.php?script_id=1291
  27. lua.vim : Lua file type plug-in for the Vim text editor
    http://www.vim.org/scripts/scrip­t.php?script_id=3625
  28. vim-lua-ftplugin
    https://github.com/xolox/vim-lua-ftplugin
  29. Vi Improved
    https://wiki.python.org/moin/Vim
  30. javacomplete : Omni Completion for JAVA
    http://www.vim.org/scripts/scrip­t.php?script_id=1785
  31. SearchComplete
    http://www.vim.org/scripts/scrip­t.php?script_id=474
  32. ShowMarks
    http://www.vim.org/scripts/scrip­t.php?script_id=152
  33. ctrlp.vim
    https://github.com/kien/ctrlp.vim
  34. ctrlp.vim
    http://kien.github.io/ctrlp.vim/
  35. vim-signature
    https://github.com/kshenoy/vim-signature
  36. Supertab
    http://www.vim.org/scripts/scrip­t.php?script_id=1643
  37. Supertab (GitHub)
    https://github.com/ervandew/supertab
  38. Vim Essential Plugin: NERD Tree
    http://code.tutsplus.com/tutorials/vim-essential-plugin-nerdtree–net-19692
  39. The NERD tree : A tree explorer plugin for navigating the filesystem
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=1658
  40. NERD Tree Guide
    http://usevim.com/2012/07/18/ner­dtree/
  41. vcscommand.vim : CVS/SVN/SVK/git/hg/bzr integration plugin
    http://www.vim.org/scripts/scrip­t.php?script_id=90
  42. vcscommand na GitHubu
    https://github.com/vim-scripts/vcscommand.vim
  43. Popis skriptu Vim Pathogen
    http://www.vim.org/scripts/scrip­t.php?script_id=2332
  44. Poslední verze skriptu Vim Pathogen
    https://tpo.pe/pathogen.vim
  45. Nejlepší pluginy pro Vim
    http://vimawesome.com/
  46. Nejlepší pluginy pro Vim
    http://www.vim.org/scripts/scrip­t_search_results.php?order_by=ra­ting
  47. Vim-airline na GitHubu
    https://github.com/bling/vim-airline
  48. Vim-airline na www.vim.org
    http://www.vim.org/scripts/dow­nload_script.php?src_id=22726
  49. Vim-fugitive na GitHubu
    https://github.com/tpope/vim-fugitive
  50. Vim-fugitive na www.vim.org
    http://www.vim.org/scripts/scrip­t.php?script_id=2975
  51. Textový editor Vim jako IDE (seriál)
    http://www.root.cz/clanky/textovy-editor-vim-jako-ide/
  52. Building Vim
    http://vim.wikia.com/wiki/Bu­ilding_Vim
  53. Getting the Vim source with Mercurial
    http://vim.wikia.com/wiki/Get­ting_the_Vim_source_with_Mer­curial
  54. Vim Perl Interface
    http://vim.dindinx.net/vim7/html/if_per­l.txt.php
  55. Vim Perl Support
    http://www.softpanorama.or­g/Editors/Vimorama/vim_per­l_support.shtml
  56. VIM as Python IDE
    http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/
  57. Stack Overflow: VIM: Perl interface: passing a variable to Perl and reading a vim variable from Perl
    http://stackoverflow.com/qu­estions/4999902/vim-perl-interface-passing-a-variable-to-perl-and-reading-a-vim-variable-from
  58. Stack Overflow: Getting started with vim scripting with Perl
    http://stackoverflow.com/qu­estions/2208618/getting-started-with-vim-scripting-with-perl
  59. Python with a modular IDE (Vim)
    http://www.sontek.net/python-with-a-modular-ide-vim
  60. Getting to VIM's Python interface
    http://zerokspot.com/weblog/2009/02/21/get­ting-to-know-vims-python-interface/
  61. Pretty-formatting XML
    http://vim.wikia.com/wiki/Pretty-formatting_XML
  62. Delete a pair of XML/HTML tags
    http://vim.wikia.com/wiki/De­lete_a_pair_of_XML/HTML_tags
  63. Vim as XML Editor
    http://www.pinkjuice.com/how­to/vimxml/
  64. xmledit: A filetype plugin to help edit XML, HTML, and SGML documents
    http://www.vim.org/scripts/scrip­t.php?script_id=301
  65. Poslední vývojová verze makra xmledit
    http://github.com/sukima/xmledit/
  66. vim.wikia: Display date-and-time on status line
    http://vim.wikia.com/wiki/Display_date-and-time_on_status_line
  67. vim.wikia: Writing a valid statusline
    http://vim.wikia.com/wiki/Wri­ting_a_valid_statusline
  68. vim.wikia: Statusline tab level ruler
    http://vim.wikia.com/wiki/Sta­tusline_tab_level_ruler
  69. vim.wikia: Switching between different statuslines
    http://vim.wikia.com/wiki/Swit­ching_between_different_sta­tuslines
  70. X Selections, Cut Buffers, and Kill Rings
    http://www.jwz.org/doc/x-cut-and-paste.html
  71. Accessing the system clipboard
    http://vim.wikia.com/wiki/Ac­cessing_the_system_clipbo­ard
  72. xcutsel(1) – Linux man page
    http://linux.die.net/man/1/xcutsel
  73. snipMate : TextMate-style snippets for Vim
    http://www.vim.org/scripts/scrip­t.php?script_id=2540
  74. msanders / snipmate.vim
    https://github.com/msander­s/snipmate.vim
  75. snipMate.vim Introductory Screencast
    http://vimeo.com/3535418
  76. Clewn home page
    http://clewn.sourceforge.net/
  77. How to connect vim with gdb – using clewn
    http://chunhao.net/blog/how-to-connect-vim-with-gdb-using-clewn
  78. yavdb : Yet Another (Generic) Vim Debugger Integration
    http://www.vim.org/scripts/scrip­t.php?script_id=1954
  79. Vim home page
    http://www.vim.org/
  80. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  81. Tutorial: Make Vim as Your C/C++ IDE Using c.vim Plugin
    http://www.thegeekstuff.com/2009/01/tu­torial-make-vim-as-your-cc-ide-using-cvim-plugin/
  82. c.vim : C/C++ IDE
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=213
  83. c.vim : C/C++ IDE key mappings
    http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf
  84. Základní základy editoru Vim
    http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/
  85. Jak si přizpůsobit Vim
    http://www.root.cz/serialy/jak-si-prizpusobit-vim/
  86. Taglist (plugin)
    http://www.vim.org/scripts/scrip­t.php?script_id=273
  87. The NERD tree: A tree explorer plugin for navigating the filesystem
    http://www.vim.org/scripts/scrip­t.php?script_id=1658
  88. JavaBrowser : Shows java file class, package in a tree as in IDEs. Java source browser.
    http://www.vim.org/scripts/scrip­t.php?script_id=588
  89. snippetsEmu : An attempt to emulate TextMate's snippet expansion
    http://www.vim.org/scripts/scrip­t.php?script_id=1318
  90. Vim plugins for developers
    http://www.linuxtoday.com/upload/vim-plugins-for-developers-140619094010.html
Našli jste v článku chybu?

17. 5. 2015 8:56

Inkvizitor (neregistrovaný)

Asi jak pro koho. Nedávno jsem udělal další pokus o sblížení s Emacsem prostřednictvím Spacemacsu a když odmyslím ty problémy s fungováním některých režimů, je pro mě skutečnost, že editor nabíhá až 20 sekund na poměrně silném stroji, dost neakceptovatelná. Zlatý Vim.

15. 5. 2015 22:02

Tak já taky, teď se jen bojím, kdy uvidíme nějaký ten pokus o vimD :-)

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

Lupa.cz: Seznam mění vedení. Pavel Zima v čele končí

Seznam mění vedení. Pavel Zima v čele končí

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Root.cz: 250 Mbit/s po telefonní lince, když máte štěstí

250 Mbit/s po telefonní lince, když máte štěstí

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

Podnikatel.cz: Na poslední chvíli šokuje výjimkami v EET

Na poslední chvíli šokuje výjimkami v EET

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Manželka je bio, ale na sex moc není

Manželka je bio, ale na sex moc není

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?