Integrované vývojové prostředí Eclipse, s nímž jsme se seznámili v seriálu o IDE ve Fedoře, je stále velmi populární, a to nejenom mezi vývojáři, kteří používají programovací jazyk Java. Pro některé zkušené uživatele textového editoru Vim však přechod na Eclipse může způsobovat problémy týkající se nutnosti použití interního (programátorského) editoru, kterým je Eclipse vybaveno. Jedno z řešení tohoto problému může představovat projekt Vrapper, který do Eclipse přináší poměrně pokročilou emulaci funkcí Vimu.

Obsah

1. Integrované vývojové prostředí Eclipse

2. Vrapper aneb spojení možností Vimu a Eclipse

3. Instalace Vrapperu do Eclipse

4. Režimy práce (módy) Vrapperu

5. Editační příkazy a operátory

6. Textové objekty

7. Vyhledávání

8. Značky

9. Registry

10. Obsah druhé části článku

1. Integrované vývojové prostředí Eclipse

S populárním a neustále rozvíjeným a vylepšovaným projektem Eclipse jsme se již seznámili v seriálu o IDE určených pro systém Fedora [1][2][3][4][5]. Ve stručnosti si tedy pouze připomeňme, že se jedná o propracovanou a současně i do značné míry univerzálně použitelnou aplikaci, která se velmi často používá ve funkci integrovaného vývojového prostředí, především pro vývoj programů v Javě. V Eclipse lze vyvíjet desktopové i serverové aplikace, včetně aplikací založených na technologiích JEE; nesmíme zapomenout ani na vývoj pro operační systém Android s využitím pluginu nazvaného Android Development Tools.

Obrázek 1: Ukázka použití Eclipse ve funkci integrovaného vývojového prostředí použitého pro vývoj aplikací v programovacím jazyku Java.

Ve skutečnosti jsou však možnosti Eclipse mnohem větší, Eclipse totiž může díky svému systému přídavných modulů (pluginů) velmi dobře posloužit i pro vývoj a ladění aplikací v mnoha dalších programovacích jazycích, mezi něž patří například C a C++, (zajištěno pluginem CDT, jenž je typicky dostupný jako balíček pojmenovaný eclipse-cdt), Python (PyDev), PHP (PHP Development Tools) a dokonce i pro Fortran, COBOL či nověji Clojure (plugin Counterclockwise). Kromě toho pro toto vývojové prostředí existují pluginy určené pro tvorbu XML souborů, LaTeXových dokumentů, správu webových aplikací atd. Integrované vývojové prostředí Eclipse se taktéž používá pro vývoj takzvaných RCP aplikací (Rich Client Platform) využívaných především ve vnitrofiremních projektech (i když jsou tyto projekty s příchodem HTML 5 možná poněkud na ústupu). Zapomenout nesmíme ani na další pluginy, například na moduly určené pro využití systémů pro zprávu verzí (Git, ale i Mercurial, CSV či Subversion) či pluginy používané při testování aplikací.

Obrázek 2: Standardní rozložení oken v perspektivě nazvané „Java Browsing“, kterou využívají především vývojáři pracující na rozsáhlejších projektech. V Eclipse pojem „perspektiva“ znamená rozložení oken IDE, které se pro různé účely může měnit.

2. Vrapper aneb spojení možností Vimu a Eclipse

Integrované vývojové prostředí Eclipse se ovšem, ostatně jako prakticky každá jiná aplikace, nevyhnulo některým problémům, které vyplývají jak z použité technologie, tak i z faktu, že kooperace s dalšími aplikacemi může být v některých případech složitá. Poměrně elegantně je vyřešeno propojení Eclipse s překladači, interpretry a debuggery, což je ostatně pochopitelné, neboť bez tohoto propojení ztrácí myšlenka integrovaného vývojového prostředí svůj význam. Ovšem například nahrazení programátorského textového editoru, který je v Eclipse implementován, za jiný editor, je již mnohem složitější, což trápí zejména „skalní“ uživatele programátorských editorů typu Emacs a Vim. Tito uživatelé mají mnohdy dlouholetou praxi v používání Emacsu a Vimu, takže znají mnohé klávesové zkratky a užitečné triky. K tomu navíc přidejme možnost editovat text ve Vimu velmi efektivním způsobem bez nutnosti opouštět základní alfanumerický blok klávesnice. Přechod na Eclipse je z pohledu těchto uživatelů dosti problematický, protože nelze zastírat, že schopnosti integrovaného programátorského editoru v Eclipse jsou poměrně primitivní (minimálně při porovnání právě s Vimem či Emacsem).

03

Obrázek 3: Autor článku používá tuto klávesnici (Poker II), která neobsahuje numerický blok ani blok s kurzorovými klávesami. Používání interního textového editoru Eclipse je zde tedy poměrně nešikovné. Instalací Vrapperu lze efektivitu editace zdrojových kódů rapidně zvýšit a současně zmenšit namáhání prstů při použití přeřaďovačů.

Na druhou stranu má však Eclipse, především Eclipse JDT určené pro vývoj aplikací v Javě, mnohé důležité vlastnosti spočívající v možnosti refaktoringu kódu, skvělé kooperace s interním překladačem a analyzátorem chyb, správcem projektu apod. (zjednodušeně lze říci, že Eclipse zdrojovému kódu „rozumí“ a nepovažuje ho za pouhý shluk znaků, vět, bloků či odstavců popsatelných regulárními výrazy). Jak tedy propojit svět Eclipse se světem Vimu? Existuje hned několik řešení tohoto problému. Jedno z těchto řešení používá například projekt Eclim. Používá se zde buď spuštění Eclipse bez grafického uživatelského rozhraní s tím, že se funkce Eclipse volají z Vimu přes „proxy“ server; alternativně se běžící instance Vimu vkládá do okna Eclipse. Odlišné řešení znají někteří uživatelé například z projektu Vimperator. Jedná se o emulaci některých funkcí Vimu v jiné aplikaci (konkrétně Vimperator je určen pro Firefox). Právě tento přístup je použit i v dnes popisovaném pluginu Vrapper.

04

Obrázek 4: Logo projektu Vrapper.

3. Instalace Vrapperu do Eclipse

Nejprve si popišme způsob instalace pluginu Vrapper. Ta je velmi jednoduchá, a to i z toho důvodu, že tento plugin nezávisí na žádných dalších pluginech, takže pravděpodobnost neúspěchu při instalaci je poměrně malá. Ostatně abych si toto tvrzení ověřil, nainstaloval jsem plugin Vrapper i do „starodávné“ verze Eclipse pocházející z roku 2009. Celá instalace Vrapperu spočívá v provedení několika kroků, které jsou naznačeny na následující sekvenci obrázků. Nechť si vážený čtenář přečte komentář ke každému obrázku, na němž jsou jednotlivé kroky instalace popsány podrobněji:

05

Obrázek 5: Dialog pro instalaci nových pluginů se poněkud neintuitivně skrývá v menu Help pod příkazem Install New Software.

06

Obrázek 6: Do tohoto dialogu je nutné zadat adresu (URL), na níž se nachází balíček Vrapper. Tato adresa zní http://vrapper.sourceforge.net/update-site/stable. Po potvrzení se objeví krátká zpráva „Pending“ a posléze by se měly vypsat všechny balíčky, které byly na uvedené adrese nalezeny.

07

Obrázek 7: Prozatím provedeme pouze instalaci samotného Vrapperu a popř. i jeho varianty podporující režim split-window.

08

Obrázek 8: Po stisku Next se zobrazí všechny instalované balíčky. Povšimněte si, že se nemusí doinstalovávat žádné další podpůrné balíčky, na nichž by Vrapper závisel.

09

Obrázek 9: Dále je potřeba explicitně potvrdit, že souhlasíte s licencí, pod níž je plugin Vrapper šířen (jedná se o GPL, takže v tomto případě by neměly nastat žádné problémy).

10

Obrázek 10: Na dalším dialogu nám nezbývá, než souhlasit 🙂

11

Obrázek 11: Předposlední krok: rychlý restart celého integrovaného vývojového prostředí Eclipse.

4. Režimy práce (módy) Vrapperu

Po (doufejme že úspěšné) instalaci si již můžeme práci s pluginem Vrapper otestovat. Na začátek je dobré si uvědomit, že Vrapper je použit v těch případech, v nichž Eclipse otevírá svůj programátorský textový editor (Vrapper rozšiřuje možnosti tohoto editoru), ale nikoli v některých formulářích, v nichž se používá běžný jednořádkový či víceřadkový editor nabízený knihovnou SWT. Stačí tedy například ve vývojovém prostředí otevřít libovolný zdrojový či konfigurační soubor. Důležité je sledovat, zda je tento plugin aktivní či nikoli, což se pozná při pohledu na jeho ikonu (viz též následující screenshot). Pokud je Vrapper aktivní, chová se interní editor integrovaného vývojového prostředí modálním způsobem, na který jsme zvyklí z Vimu či z jeho předchůdce Vi. To znamená, že implicitně se editor nachází v takzvaném normálním režimu (normal mode), po stisku dvojtečky se přepne do takzvaného příkazového režimu (command mode) a další jednopísmenné či dvoupísmenné klávesové zkratky slouží k přepnutí z režimu normálního do režimu vkládacího (insert mode) či režimu přepisovacího (replace mode).

12

Obrázek 12: Pokud se v integrovaném vývojovém prostředí objevila tato ikona, podařilo se Vrapper korektně nainstalovat a následně inicializovat.

Pro přepnutí z normálního režimu do režimu vkládacího či přepisovacího se používají především tyto jednopísmenné či dvoupísmenné příkazy:

# Příkaz Význam příkazu Začátek editace
1 a přechod do vkládacího režimu za znakem, na němž byl umístěn kurzor
2 A přechod do vkládacího režimu na konci řádku
3 i přechod do vkládacího režimu před znakem, na němž byl umístěn kurzor
4 I přechod do vkládacího režimu na prvním nebílém znaku na řádku
5 gI přechod do vkládacího režimu na prvním znaku na řádku
6 o nový řádek+přechod do vkládacího režimu na novém řádku pod původní pozicí kurzoru
7 O nový řádek+přechod do vkládacího režimu na novém řádku nad původní pozicí kurzoru
8 R přechod do přepisovacího režimu před znakem, na němž byl kurzor

13

Obrázek 13: Právě aktuální režim Vrapperu je zobrazen na stavovém řádku Eclipse. Pokud se zadávají příkazy v příkazovém režimu, zobrazují se těsně pod oknem editoru.

5. Editační příkazy a operátory

Kromě přechodu do vkládacího či přepisovacího režimu má normální režim ještě další velmi důležitý význam – slouží totiž k pohybu po textu, zadávání editačních příkazů, označení vizuálních bloků a taktéž pro volání příkazů pro vyhledávání v textu. Podívejme se nyní ve stručnosti na některé editační příkazy. Ty se typicky skládají ze tří částí: zadání počtu opakování (nepovinná část), specifikace vlastního příkazu (říká se mu operátor, stejně jako ve Vimu) a konečně specifikace příkazu pro posun kurzoru, čímž se vlastně určí rozsah textu, na nějž se editační příkaz bude vztahovat. Tento článek nemá být podrobnou uživatelskou příručkou k Vrapperu, proto si dostupné operátory popíšeme pouze velmi stručně. Naprostá většina operátorů pracuje stejně jako ve Vimu, takže se jeho skalní uživatelé nemusí při přechodu na Vrapper obávat velkých změn.

14

Obrázek 14: Vrapper je možné nainstalovat i do starodávného Eclipse pocházejícího z roku 2009.

Editační příkazy, u nichž se nespecifikuje pohyb kurzoru (je dán implicitně):

# Operátor Význam
1 x vymazání znaku (znaků) za kurzorem
2 X vymazání znaku (znaků) před kurzorem
3 D vymazání znaků od pozice kurzoru do konce řádku
4 J spojení řádků (vymazání EOLN na konci prvního spojovaného řádku)
5 s vymazání znaku (znaků) a přechod do vkládacího režimu
6 S vymazání řádku (řádků) a přechod do vkládacího režimu
7 C vymazání znaků od pozice kurzoru do konce řádku a přechod do vkládacího režimu
8 p paste (vložení textu z registru za kurzor)
9 P paste (vložení textu z registru před kurzor)
10 gJ podobné příkazu J (join), ovšem mezi řádky se nevkládá mezera
11 gp podobné příkazu p (paste), ovšem kurzor se přesune za vložený text (pokud se jedná o více řádků)
12 gP podobné příkazu P (paste), ovšem kurzor se přesune za vložený text (pokud se jedná o více řádků)

15

Obrázek 15: Instalace Vrapperu do starší verze integrovaného vývojového prostředí Eclipse.

Editační příkazy, u nichž se specifikuje pohyb kurzoru (je dán implicitně):

# Zkratka Operátor Význam
1 y yank kopie textu do registru
2 d delete vymazání textu (s vložením do registru)
3 c change změna textu (delete a následný přechod do vkládacího režimu)
4 r replace změna znaku pod kurzorem
5 > shift right posun textu doprava
6 < shift left posun textu doleva
7 gu lowercase změna na malá písmena (mínusky)
8 gU UPPERCASE změna na velká písmena (verzálky)
9 gq format zformátování textu
10 v visual výběr bloku

16

Obrázek 16: Instalace Vrapperu do starší verze integrovaného vývojového prostředí Eclipse.

6. Textové objekty

Plugin Vrapper, podobně jako jeho ideový předchůdce textový editor Vim, podporuje i práci s takzvanými textovými objekty, které je možné kombinovat s výše uvedenými operátory. Pod tímto pojmem je možné si představit ucelenou část textu či zdrojového kódu. V případě dokumentů se jedná například o slova, věty či odstavce, u zdrojových kódů pak například o výraz v kulatých závorkách či o programový blok. V prostředí Eclipse jsou samozřejmě důležitější ty textové objekty, které se vztahují ke zdrojovému kódu. Jedná se především o tyto objekty:

# Textový objekt Význam Popis
1 aw a word slovo včetně prázdných znaků okolo
2 iw inner word slovo (bez prázdných znaků)
3 aW a WORD slovo, ovšem včetně dalších znaků (závorky apod.)
4 iW inner WORD slovo, ovšem včetně dalších znaků (závorky apod.)
5 a] a [] block blok omezený znaky []
6 i] inner [] block vnitřní blok omezený znaky [] (tedy bez závorek)
7 a( a () block blok omezený znaky ()
8 i( inner () block vnitřní blok omezený znaky () (tedy bez závorek)
9 ab a () block blok omezený znaky ()
10 ib inner () block vnitřní blok omezený znaky () (tedy bez závorek)
11 a{ a {} block blok omezený znaky {}
12 i{ inner {} block vnitřní blok omezený znaky {} (tedy bez závorek)
13 aB a {} block blok omezený znaky {}
14 iB inner {} block vnitřní blok omezený znaky {} (tedy bez závorek)
13 a" a string řetězec včetně znaků ""
14 i" inner string řetězec kromě znaků ""

17

Obrázek 17: Způsob konfigurace starší verze Vrapperu.

Kombinace textových objektů a operátorů je snadná:

# Příkaz Význam Popis
1 dab delete a block (omezeno kulatými závorkam)
2 dib delete inner block (omezeno kulatými závorkami)
3 daB delete a Block (omezeno složenými závorkami)
4 diB delete inner Block (omezeno složenými závorkami)
5 cab change a block (kulaté závorky)
6 cib change inner block (kulaté závorky)
7 caB change a Block (složené závorky)
8 ciB change inner Block (složené závorky)
9 yab yank a block (kulaté závorky)
10 yib yank inner block (kulaté závorky)
11 yaB yank a Block (složené závorky)
12 yiB yank inner Block (složené závorky)
13 >aB right shift a Block (složené závorky)
14 >iB right shift inner Block (složené závorky)

atd. atd. atd.

18

Obrázek 18: Konfigurace barev používaných Vrapperem při vyhledávání.

7. Vyhledávání

Pro vyhledávání ve zdrojovém kódu se používají příkazy / a ?, přičemž první příkaz hledá směrem dolů (od kurzoru směrem ke konci souboru), zatímco příkaz druhý naopak směrem k začátku zdrojového textu. Po zadání / či ? editor očekává regulární výraz ukončený klávesou Enter. Po vyhledání prvního výskytu textu odpovídajícího regulárnímu výrazu lze použít příkaz n pro nalezení dalšího výskytu či N pro nalezení výskytu předchozího (povšimněte si zde logiky: klávesa Shift vždy mění směr vyhledávání, minimálně na anglické klávesnici). Alternativně lze hledat výskyt jediného znaku příkazy f (find) a t (till), pro které opět existuje i verze hledající směrem zpět: F a T. Třetí možnost představují příkazy * a # určené pro hledání dalšího/předchozího identifikátoru, přičemž identifikátor se nachází pod kurzorem (tyto příkazy jsou velmi užitečné a vyplatí se je naučit používat).

19

Obrázek 19: Vyhledávání v praxi.

Průběh vyhledávání lze ovlivnit volbou :set hlsearch, která zvýrazní všechny výskyty textů odpovídajících zadanému regulárnímu výrazu. Toto chování se opět vypne volbou :set nohlsearch. Další užitečnou volbou může být :set incseach. V případě, že je tato volba použita (nastavena), bude se v textu automaticky zvýrazňovat ta část, která odpovídá regulárnímu výrazu, a to přímo v průběhu jeho zadávání. Ostatně postačuje se podívat na screenshoty číslo 19 a 20, kde jsou obě volby nastaveny.

20

Obrázek 20: Vyhledávání v praxi.

8. Značky

Plugin Vrapper podporuje i práci s takzvanými značkami (marks). Nejedná se však o značky vytvářené externími nástroji a ukládané většinou do souboru pojmenovaného tags, ale o interní seznam pozic kurzoru (jakési „špendlíky“ zapíchnuté do důležitých míst) v souboru, na které se lze během editace vrátit, nebo na něž se lze odkazovat. Podobnou funkcionalitu nabízí i mnohé další programátorské textové editory, ovšem u nich se většinou jedná o maximálně deset značek, zatímco ve Vrapperu může být značek mnohem více, protože každé značce je přiřazeno jednopísmenné označení.V rámci jednoho souboru lze lokálně používat značky pojmenované malými písmeny az, zatímco značky pojmenované velkými písmeny AZ si „pamatují“ i jméno souboru, v němž jsou definovány, tudíž se jedná o značky globální. Speciální význam mají značky se jmény 09 a taktéž v některých případech velmi užitečná značka ^. Významy některých jmen značek jsou shrnuty v následující tabulce:

# Jméno značky Definice značky Význam
1 a-z manuálně značky lokální v rámci souboru
2 A-Z manuálně značky globální, ke značce je připojeno i jméno souboru
3 0-9 automaticky posledních deset pozic kurzoru při opuštění Vrapperu
4 < automaticky začátek vybraného bloku
5 > automaticky konec vybraného bloku
6 . automaticky pozice poslední změny provedené v editovaném souboru
7 ^ automaticky pozice kurzoru, na níž se kurzor naposledy nacházel ve vkládacím režimu

Práce se značkami je v mnoha ohledech velmi jednoduchá, ostatně všechny
důležité příkazy najdete v následující tabulce:

# Příkaz Význam
1 :marks výpis všech právě aktivních značek
2 ma - mz definice lokální značky a-z
3 mA - mZ definice globální značky A-Z
4 'a - 'z skok na řádek, kde je značka definovaná (jedná se o příkaz pohybu kurzoru!)
5 'A - 'Z skok na soubor a řádek, kde je značka definovaná
6 `a - `z skok na přesné místo, kde je značka definovaná (jedná se o příkaz pohybu kurzoru!)
7 'A - 'Z skok na přesné místo (řádek i sloupec), kde je značka definovaná

Příkazy 'a - 'z i `a
`z jsou chápané jako příkazy pro pohyb kurzoru, což znamená,
že tyto příkazy lze kombinovat například s editačními operátory
d (delete), y (yank) a
c (change). To je velmi užitečné, protože lze snadno
vytvořit (lépe řečeno pouze označit) začátek „bloku“, například
příkazem ma a posléze je možné kurzor přesunout na konec bloku
a zvolit jeden z následujících příkazů (užitečnost ještě mnohem více
stoupá při použití značek v makrech):

# Příkaz Význam
1 c`a přepis části textu, jehož začátek je označený značkou a a konec je určený aktuální pozicí textového kurzoru
2 d`a výmaz části textu, jehož začátek je označený značkou a a konec je určený aktuální pozicí textového kurzoru
3 y`a vložení části textu, jehož začátek je označený značkou a a konec je určený aktuální pozicí textového kurzoru, do implicitního registru (bližší informace o registrech budou uvedeny v navazujícím textu)
4 gu`a změna na malá písmena
5 gu`a změna na velká písmena
6 gq`a zformátování bloku (jako textu)

21

Obrázek 21: Zobrazení všech značek příkazem :marks.

9. Registry

Dalším užitečným a často používaným nástrojem nabízeným Vrapperem jsou takzvané registry. Jedná se o proměnné Vrapperu pojmenované jedním znakem, které v první řadě slouží pro kopii či přenos editovaných textů pomocí příkazů/operátorů c (change), s (substitute), d (delete), y (yank) a p (paste), což vlastně znamená, že registry lze využít ve funkci pojmenovaných schránek (clipboard). Druhou funkcí, které registry v tomto pluginu mají, je úschova maker, která se zaznamenávají příkazem q a vyvolávají se (spouští se) příkazem @ (za těmito příkazy vždy následuje jméno registru, v němž je makro uschováno). Podobně jako v případě značek, existují registry naplňované uživatelem a registry, jejichž obsah je měněn textovým editorem automaticky při provádění různých operací. Jména a význam některých důležitých registrů můžete najít v následující tabulce:

# Registr Význam
1 " implicitní registr pro operace c, d, s nebo y
2 a-z registry, které je možné přímo měnit uživatelem
3 0-9 registry naplňované automaticky příkazy d a y
4 : registr obsahující poslední příkaz, vhodné při vyvolání tohoto příkazu jako makra
5 / registr obsahující vyhledávaný řetězec
6 * registr obsahující obsah schránky
7 + registr obsahující obsah schránky
8 / registr obsahující posledně vyhledávaný řetězec (resp. text odpovídající regulárnímu výrazu)
9 - implicitní registr pro operace, které mění menší část textu, než je jeden textový řádek

Pro výpis obsahu všech registrů se používá příkaz :registers nebo taktéž pouze jeho zkrácená forma :reg. Pomocí tohoto příkazu lze samozřejmě zobrazit i obsah maker zaznamenaných s využitím příkazu q. V předchozí tabulce byl uveden i speciální registr nazvaný prostě " (jde o ASCII uvozovky, nikoli o dvojici apostrofů). Tento registr je implicitně používán při provádění základních editovacích příkazů (či spíše operátorů) c (change), d (delete), y (yank) a p (paste). Pokud se má využít jiný registr, musí se před tyto příkazy napsat " (taktéž uvozovky, ovšem v tomto případě neplést s názvem registru), za nímž následuje jméno vybraného registru. Viz též následující příklady ukazující, jak se poměrně logicky dají ve Vrapperu tvořit složité editační operace z jednodušších operátorů a příkazů:

"add
"ap
 
"b3dw
"bP
 
"cdas
"cp
 
"dyap
 
"zyy
"xS
"q10s

22

Obrázek 22: Zobrazení všech registrů.

10. Obsah druhé části článku

I přes poměrně dokonalou emulaci Vimu však plugin Vrapper neumožňuje plnohodnotnou interpretaci skriptů naprogramovaných v jazyce Vim ScriptEclipse a tím pádem v něm ani není možné spouštět pluginy připravené pro textový editor Vim. To pochopitelně může představovat problém pro ty uživatele, kteří již ve Vimu aktivně využívají nějaký svůj oblíbený přídavný modul, ať již se jedná o široce známý plugin typu NERDTree, Buffer Explorer, TagList či o nějaký specializovanější přídavný modul. Částečné řešení tohoto problému představují pluginy připravené přímo pro Vrapper. Tyto pluginy jsou naprogramovány v Javě, se všemi klady a zápory, které toto řešení přináší. Mezi výhody je možné počítat fakt, že pluginy mohou být vytvářeny, upravovány i opravovány komunitou aktivně používající právě Javu (tato komunita bude pravděpodobně větší, než je počet vývojářů aktivně znajících Vim Script). Ve druhé části tohoto seriálu se s některými již hotovými pluginy určenými pro vývojáře v Javě, Pythonu či C/C++ seznámíme.

23

Obrázek 23: V případě, že vám něco ve Vrapperu schází, není problém si pro jakýkoli právě otevřený soubor spustit Vim, a to přímo z Eclipse zadáním příkazu :vim.