Textový editor Vim jako IDE (2.část)

7. 7. 2011
Doba čtení: 16 minut

Sdílet

Ve druhé části seriálu o použití editoru Vim ve funkci vývojového prostředí si nejprve řekneme, jak lze v tomto textovém editoru lépe využít klávesu Caps Lock a posléze se seznámíme s propojením Vimu s překladači a externím nástrojem cstags. Ve druhé polovině článku si popíšeme čtveřici přídavných modulů.

Obsah

1. Použití textového editoru Vim ve funkci IDE

2. Jak lze ve Vimu lépe využít klávesu Caps Lock?

3. Překlad programů a procházení chybovými hlášeními překladače

4. Využití externího nástroje cscope

5. Přídavný modul „NERD Tree“

6. Přídavný modul „Taglist“

7. Přídavný modul „c.vim“

8. Přídavný modul „JavaBrowser“

9. Odkazy na Internetu

1. Použití textového editoru Vim ve funkci IDE

Ve druhé části seriálu o různých způsobech využití textového editoru Vim se zaměříme na způsob překladu programů s následným procházením seznamem chyb vygenerovaných překladačem a/nebo programem pro řízení překladu (make, ant). Dále si ukážeme způsob využití velmi užitečného externího nástroje cscope i některých přídavných modulů (pluginů), jež mohou práci programátorů zpříjemnit a současně i urychlit. Jedná se o modul NERD Tree (operace se soubory a adresáři, vhodné zejména při práci na větším projektu s množstvím různých souborů), dále o modul Taglist (vylepšená práce se značkami), modul c.vim (spousta užitečných maker pro céčkaře a programátory v C++) a konečně o přídavný modul JavaBrowser (nástroj vhodný naopak pro Javisty). Tyto moduly jsou psány v interním skriptovacím jazyce textového editoru Vim, který se postupně vyvíjel od jazyka umožňujícího prostý zápis sekvence příkazů až po jeho dnešní podobu, kdy se jedná o prakticky plnohodnotný programovací jazyk „Algolské“ větve, tj. o jazyk s proměnnými, funkcemi, podmínkami i programovými smyčkami.

Obrázek 1: Textový editor Vim se spuštěným přídavným modulem NERD Tree popsaným v páté kapitole.

Jako malou rozcvičku si nejprve ukážeme, jak je možné zapisovat některé ASCII znaky využívané v různých programovacích jazycích na klávesnici s českým rozložením kláves, aniž by se bylo nutné přepínat na anglické rozložení, popř. aniž by bylo nutné používat přepínač AltGr. Jak sami uvidíte, není toto řešení vhodné pro zápis celých programů (tam se již skutečně vyplatí přepnutí na anglické rozložení kláves), ovšem například při psaní dokumentace, v níž se občas vyskytuje nějaký „exotičtější“ ASCII znak se může hodit (příkladem může být například dokument psaný v TeXu či LaTeXu s vloženými příkazy pro sazbu matematických vzorců a tabulek). Řešení spočívá v několika vimovských příkazech, které mapují dvojici znaků s akcenty na ASCII znak, který se na stejné klávese nachází v případě anglického rozložení klávesnice. Vzhledem k tomu, že se v některých českých slovech používá dvojice „šš“, je pro alternativní funkci nutné tento znak napsat třikrát za sebou, což je však stále ještě rychlejší, než přepnutí rozložení klávesnice nebo použití AltGr:

noremap ěě @
noremap ššš #
noremap čč $
noremap řř %
noremap žž ^
noremap ýý &
noremap áá *
noremap íí (
noremap éé )
noremap úú {
noremap ůů ;
inoremap ěě @
inoremap ššš #
inoremap čč $
inoremap řř %
inoremap žž ^
inoremap ýý &
inoremap áá *
inoremap íí (
inoremap éé )
inoremap úú {
inoremap ůů ;
inoremap §§ '

Obrázek 2: Využití malého a užitečného triku – editace souboru obsahujícího nové klávesové zkratky (mapování) s následným použitím příkazu :so % nebo :source %, který načte a spustí obsah aktuálního souboru. Znak procenta totiž vždy obsahuje jméno aktuálně editovaného souboru, čehož lze využít i v dalších funkcích; jen pro příklad :map <F9;> :!gcc -c %<cr>

Poznámka: osobně používám v normálním režimu mapování dvojice znaků „ůů“ na znak dvojtečky a nikoli středníku, protože dvojtečkou se – jak jistě všichni uživatelé tohoto textového editoru vědí – provádí přepnutí z normálního režimu do režimu příkazového.

2. Jak lze ve Vimu lépe využít klávesu Caps Lock?

Funkce, která bude vysvětlena v této kapitole se sice týká přímo operačního systému (či přesněji řečeno jeho uživatelského rozhraní), ovšem do jisté míry souvisí s Vimem, protože dokáže přemapovat funkci klávesy Esc, aniž by bylo nutné si kupovat specializovanou hackerskou klávesnici, která tuto klávesu fyzicky umisťuje blíže k základnímu postavení prstů při psaní. Některým uživatelům nevyhovuje, že se v textovém editoru Vim pro přepínání z vkládacího režimu (insert mode) nebo přepisovacího režimu (overwrite mode) do režimu normálního používá klávesa Esc, která je umístěna ve velké vzdálenosti od základní polohy prstů při psaní. Kód klávesy Esc lze sice nahradit klávesovou kombinací Ctrl+[, ovšem to je kvůli neergonomickému umístění klávesy Control (Ctrl) na standardních klávesnicích PC/AT mnohdy ještě horší řešení (klávesnice používané u jiných typů počítačů mají či měly klávesu Esc umístěnou nalevo od klávesy A).

Obrázek 3: Zobrazení všech aktuálně nastavených mapování pomocí prostého příkazu :map zapsaného bez dalších parametrů.

Klávesu Esc je samozřejmě možné namapovat na libovolnou kombinaci kláves, ale nabízí se lepší řešení – použití v podstatě nevyužívané klávesy/přepínače Caps Lock, kterou mnozí uživatelé považují za zcela zbytečnou, podobně jako Scroll Lock :-) Jediná potíž je v tom, že kód této klávesy je zachycován systémem, takže není možné použít příkaz map ve Vimu. Nejjednodušší řešení tohoto problému – alespoň pro uživatele používajícího X Window – spočívá ve spuštění příkazu:

xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'

Obrázek 4: Funkci klávesy Caps Lock je možné v prostředí Gnome změnit v dialogovém okně konfiguračního programu gnome-keyboard-properties pod volbou Layout options.

Tento příkaz je možné spustit přímo z inicializačního skriptu pro X nebo okenního manažeru (já jsem si ho například umístil do ~/fluxbox/startup). Další způsoby přemapování klávesy Esc na klávesu Caps Lock, které jsou vhodné pro Linuxovou konzoli, popř. pro MS Windows, lze najít na stránce http://vim.wikia.com/wiki/VimTip166. Pokud vyžadujete, aby se klávesa Esc a/nebo Caps Lock chovala jako přepínač mezi vkládacím režimem a režimem normálním, je řešení velmi jednoduché – použije se příkaz pro mapování:

:map <Esc> i

Poznámka (varování): na duplicitní funkci klávesy Caps Lock si lze kupodivu zvyknout velmi rychle, horší je to však při přechodu na počítač, který toto mapování nemá nastavené :-)

Obrázek 5: Volba pro přepnutí klávesy Caps Lock na funkci klávesy Esc je v tomto dialogu zobrazena na spodním řádku výběru.

3. Překlad programů a procházení chybovými hlášeními překladače

Textový editor Vim obsahuje již od svých prvních verzí podporu pro volání externích překladačů s následnou analýzou chybových hlášení, které tyto překladače vypisují na standardní či chybový výstup. Vim tato hlášení analyzuje a následně si do své interní struktury uloží (zjednodušeně řečeno) seznam trojic: jméno souboru s chybou, číslo řádku s chybou a chybové hlášení. Uživatel-programátor může po spuštění překladu následně použít několik příkazů umožňujících přeskakovat kurzorem na jednotlivé řádky s chybou se současným zobrazeních chybové zprávy. Mezi tyto příkazy patří zejména:

Příkaz Význam
:make spuštění překladu
:clist výpis všech chybových hlášení
:cfirst přechod na první chybu
:clast přechod na poslední chybu
:cp přechod na předchozí chybu
:cn přechod na následující chybu

Obrázek 6: Příklad použití příkazu :clist pro výpis všech chybových hlášení překladače.

Pro příkaz :make je důležité nastavení parametru makeprg. Ten může obsahovat jak samotný název překladače či utility použité pro překlad (make, ant), tak i například již zmíněný znak % znamenající název aktuálně editovaného souboru (pozor na uvozování mezer či znaku roury!):

:set makeprg=javac\ %

Analýza chybových hlášení je prováděna na základě hodnoty konfiguračního parametru errorformat, který dokáže zpracovat (parsovat) jak běžná čísla řádků a sloupců s chybou, tak i například formát používaný překladačem javac, který pod znak s chybou umístí znak ^ (šipka nahoru).

Obrázek 7: Použití příkazu :cn pro skok na řádek s následující chybou a současně pro výpis chybového hlášení.

Volání překladače a procházení chybovými hlášeními generovanými překladačem je velmi častá činnost. Z tohoto důvodu je vhodné, aby všechny potřebné příkazy byly namapovány například na funkční klávesy, které Vim standardně nevyužívá. Pokud si následující sekvenci příkazů vložíte do svého konfiguračního souboru .vimrc, bude volání překladače i další činnosti prakticky stejně jednoduché, jako je tomu u většiny integrovaných vývojových prostředí. Další funkční klávesy, především ty z prostředního funkčního bloku F5, F6, F7, F8, si necháme volné například pro urychlení ladění programů. Na sekvenci příkazů zobrazených pod tímto odstavcem si povšimněte, že při stlačení klávesy F9 dojde nejprve k uložení právě editovaného souboru a posléze k překladu projektu – většinou je totiž překlad bez uložení obsahu editovaného souboru spouštěn spíše omylem (na což dokáže většina integrovaných vývojových prostředí upozornit):

" uložení aktuálně editovaného souboru
map <F2> :w<cr>

" skok na předchozí chybové hlášení
map <F3> :cp<cr>

" skok na následující chybové hlášení
map <F4> :cn<cr>

" uložení aktuálně editovaného souboru a spuštění překladu
map <F9> :w<cr>:make<cr>

" výpis všech chybových hlášení překladače
map <F10> :cl<cr><cr>

Obrázek 8: Nastavení externího příkazu zavolaného po zápisu :make.

4. Využití externího nástroje cscope

V první části tohoto seriálu jsme se zmínili i o způsobu použití takzvaných seznamů značek (tags) při orientaci v souborech, z nichž se skládá projekt. Ovšem i přes svoje nesporné kladné stránky jsou seznamy značek poměrně jednoúčelovou záležitostí, protože vlastně obsahují pouze místa výskytu různých identifikátorů v projektu bez dalších informací (zda se například jedná o funkci, kdy je tato funkce volaná atd.). Vzhledem k tomu, že orientace ve větších projektech je pro programátora poměrně důležitá, vznikla v minulosti pro programovací jazyk C velmi užitečná utilita nazvaná cscope. Jedná se o utilitu, která po svém zavolání vytvoří soubor s databází obsahující poměrně podrobné informace o celém projektu a následně uživateli nabídne různé možnosti vyhledávání různých identifikátorů v projektu. Ovšem celoobrazovkové rozhraní programu cscope není příliš vhodné pro kooperaci s Vimem, proto Vim využívá jeho řádkové rozhraní, které si v následujícím textu stručně popíšeme.

Obrázek 9: Nastavení parseru pro chybové hlášení většinou není nutné ručně provádět, protože Vim již ve své instalaci množství těchto nastavení obsahuje (popř. se jimi lze inspirovat).

Nejprve je zapotřebí v adresáři s projektem poprvé spustit utilitu cscope, která si vytvoří svou databázi, podobně jako minule popsaná utilita ctags. Vše lze samozřejmě provést přímo z Vimu:

:! cscope -Rbq

Následně je nutné svázat databázi vygenerovanou programem cscope s Vimem (ve skutečnosti se na pozadí spustí nová instance této utility, s níž Vim komunikuje):

:cscope add cscope.out

popř. též zkráceně:

:cs add cscope.out

Obrázek 10: Napojení Vimu na databázi vytvořenou utilitou cscope.

Pokud se předchozí příkaz provedl bez chyby, lze již přímo z Vimu použít například následující příkazy:

" výpis propojení mezi Vimem a utilitou cscope
:cs show

" nalezení souboru specifikovaného ve třetím parametru
:cs f f stdio.h

" nalezení textu uvnitř řetězců (nikde jinde)
:cs f t xyzzy

" nalezení definice funkce test (skok na začátek definice)
:cs f g test

" zjištění, které funkce se volají z funkce main
:cs f d main

" zjištění, odkud se volá funkce fclose
:cs f c fclose

Důležité je, že výsledek dotazu se chová jako nový seznam značek (tagů), takže s tímto seznamem lze provádět operace popsané minule.

Obrázek 11: Nalezení všech funkcí, které se volají z funkce png_write().

5. Přídavný modul „NERD Tree“

Ve druhé části článku si popíšeme některé zajímavé rozšiřující moduly (pluginy psané ve většině případů přímo ve Vimscriptu), které je možné do textového editoru Vim velmi jednoduše doinstalovat – tato instalace se v naprosté většině případů provádí prostým rozbalením archivu s pluginem do adresáře /usr/share/vim/vimcurrent, popř. do adresáře /usr/local/share/vim. Instalaci lze provést i přímo v domácím adresáři uživatele, takový rozšiřující modul však samozřejmě nebude přístupný ostatním uživatelům počítače (adresáře, kde se hledají skripty lze vypsat příkazem :set runtimepath?). Dále uvedený popis všech rozšiřujících modulů bude poměrně stručný, protože nejdůležitější je (alespoň podle skromného názoru autora) především povědomí o tom, že rozšiřující modul s těmito vlastnostmi skutečně existuje a na které stránce je možné najít archiv s jeho instalací a samozřejmě taktéž dokumentací.

Obrázek 12: Nalezení všech míst v programu, kde je volána funkce fclose().

První dnes zmíněný přídavný modul se jmenuje NERD Tree a informaci o něm lze nalézt na adrese http://www.vim.org/scripts/scrip­t.php?script_id=1658. V tomto modulu je implementován poměrně propracovaný správce souborů založený na zobrazení stromu obsahujícího adresáře a soubory, podobně jako je tomu i u většiny integrovaných vývojových prostředí. Strom se zobrazuje v samostatném podokně a pro jeho vyvolání se používá příkaz :NERDTree. Samozřejmě je možné si tento příkaz namapovat na prakticky libovolnou klávesovou kombinaci, například pomocí následujícího příkazu:

:map <F12> :NERDTree<CR>

Další funkce nabízené tímto modulem lze zobrazit po stlačení klávesy „?“. Za povšimnutí stojí zejména příkaz „go“ sloužící pro prohlížení souborů bez toho, aby kurzor přeskočil do nově vytvořeného bufferu.

Obrázek 13: Textový editor Vim společně s přídavným modulem NERD Tree.

Poznámka: podobnou funkci nabízí i modul netrw, který je přímo součástí distribuce textového editoru Vim. Vstupním modem do tohoto modulu je funkce :Explore (někdy též :HExplore lišící se způsobem zobrazení podokna: vertikální či horizontální dělení). Tuto funkci si lze samozřejmě v případě potřeby taktéž namapovat na klávesovou zkratku:

:map <F11> :Explore<CR>

6. Přídavný modul „Taglist“

Druhým přídavným modulem, se kterým se dnes seznámíme, je modul nazvaný Taglist, jenž je dostupný na adrese http://www.vim.org/scripts/scrip­t.php?script_id=273. Jedná se o poměrně známý a často používaný modul, který zpřehledňuje práci se seznamem značek (tagů), což mj. znamená, že spolupracuje s externím nástrojem ctags, o němž jsme se již zmínili v předchozí části tohoto seriálu. Práce s tímto modulem je ve skutečnosti velmi jednoduchá – po otevření zdrojového souboru stačí v příkazovém režimu napsat příkaz:

:Tlist

po jehož spuštění se otevře nové okno obsahující v případě céčkového zdrojového kódu seznam maker, proměnných a funkcí, v případě Javovského zdrojového kódu seznam tříd, atributů a metod atd. Tyto seznamy jsou samozřejmě aktivní, tj. je možné rychle přejít na definice všech prvků programu, což je většinou přehlednější, než používání klasických seznamů značek. Tento přídavný modul je samozřejmě možné kombinovat s dalšími přídavnými moduly a vytvořit si tak prostředí co nejvhodnější pro vývoj.

Obrázek 14: Zobrazení stromu s makry, proměnnými a funkcemi.

Druhým důležitým příkazem modulu Taglist je příkaz TlistAddFiles, který se používá v těch případech, kdy se má seznam značek vygenerovat a následně i zobrazit pro více souborů. Pro projekty obsahující zdrojové soubory pouze v jednom adresáři je situace velmi jednoduchá, protože lze použít například tuto sekvenci příkazů:

:TlistAddFiles *.c
:Tlist

V případě, že jsou zdrojové soubory umístěny ve složitější adresářové struktuře, přichází na řadu jiný příkaz:

:TlistAddFilesRecursive .
:Tlist

Obrázek 15: Zobrazení nápovědy k přídavnému modulu Taglist.

7. Přídavný modul „c.vim“

Třetím přídavným modulem, o němž se dnes zmíníme, je modul nazvaný c.vim, nebo též C/C+±IDE, který lze nalézt na adrese http://vim.sourceforge.net/scrip­ts/script.php?script_id=213. Jedná se o poměrně rozsáhlý modul naprogramovaný Fritzem Menherem, který obsahuje mnoho funkcí sloužících pro urychlení práce programátorů píšících aplikace v programovacích jazycích C a C++. Mezi implementované funkce patří například vkládání různých typů komentářů z připravených šablon, vkládání koster strukturovaných příkazů (podmínek i programových smyček) či často používaných idiomů, práce s dnes velmi populárními snippety (vytváření a vkládání snippetů do programového kódu), podpora pro přímý překlad programu a jeho následného spuštění atd.

Obrázek 16: Do hlavního menu Vimu se po instalaci modulu c.vim přidal další list. Zde je zobrazeno podmenu s možností definice a vkládání snippetů.

Vzhledem k velkému množství funkcí nabízených tímto modulem se při jeho načítání vytváří i samostatné menu obsahující jak všechny příkazy, tak i k nim příslušné klávesové zkratky. Tyto zkratky začínají implicitně znakem zpětného lomítka, ovšem to lze změnit příkazem:

:let maplocalleader=znak

Pokud není menu při startu editoru v grafickém režimu (příkazy gvim či vim -g) zobrazeno, lze použít následující příkaz:

:set guioption+=m

Obrázek 17: Podmenu pro spuštění přeložené aplikace, zavolání linkeru a další podobné činnosti.

Všechny dostupné funkce i jejich klávesové zkratky jsou dostupné na adrese http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf. Stejný soubor je ostatně součástí instalace tohoto přídavného modulu.

Po načtení přídavného modulu c.vim je možné si jeho funkci jednoduše vyzkoušet. Postačuje zadat příkaz:

\i0

Textový editor Vim se následně zeptá na název proměnné a na případné (nepovinné) další parametry počítané programové smyčky for. Pokud například jako odpověď na dotaz zadáme:

xx 10 20 2

Vygeneruje se správně zarovnaný zdrojový kód:

for ( xx = 10; xx < 20; xx += 2 ) {
}

Ovšem při zadání pouhého názvu proměnné:

yy

Dostane vygenerovaná smyčka tvar:

for ( yy = 0; yy < n; yy += 1 ) {
}

8. Přídavný modul „JavaBrowser“

Zatímco modul popsaný v předchozí kapitole slouží především pro urychlení práce vývojářů tvořících aplikace v programovacích jazycích C či C++, je zde popisovaný modul nazvaný příhodně JavaBrowser určen – což není těžké uhodnout – pro programátory pracující zejména s Javou. Tento modul, který lze získat na adrese http://www.vim.org/scripts/scrip­t.php?script_id=588, slouží pro zobrazení stromu obsahujícího třídy a jejich metody i atributy, samozřejmě s rozlišením přístupových práv k metodám i atributům (taktéž se rozlišuje, zda se jedná o statickou metodu=funkci či atribut). Nad tímto stromem je možné provádět podobné operace, jaké jsou dostupné i v běžných integrovaných vývojových prostředích, viz též následující tabulku:

Příkaz Operace
Enter přeskok kurzoru na definici metody/atributu
o dtto, ale otevře se nové okno
+ rozbalení podstromu
zabalení podstromu
* rozbalení celého stromu
x skrytí či zobrazení okna se zdrojovým kódem

Obrázek 18: Projekt v Javě otevřený ve Vimu se zobrazeným přídavným modulem JavaBrowser.

Funkci pro zobrazení okna se stromem si je možné namapovat na libovolnou klávesovou zkratku, například následující sekvencí příkazů zapsanou do konfiguračního souboru .vimrc:

bitcoin_skoleni

augroup __java__
au!
au BufRead,BufNewFile *.java noremap <F10> :JavaBrowser<CR>
augroup END

Přídavné moduly je (většinou) možné vzájemně kombinovat, což například znamená, že lze mít v jednom okamžiku zobrazený modul NERD Tree společně s JavaBrowserem – záleží jen na preferencích uživatele a velikosti jeho monitoru :-)

Obrázek 19: Možnosti nastavení barevného schématu JavaBrowseru (o metodách zvýraznění syntaxe si řekneme podrobnější informace v některém z dalších pokračování tohoto seriálu).

9. Odkazy na Internetu

  1. Vim home page
    http://www.vim.org/
  2. Exuberant ctags
    http://ctags.sourceforge.net/
  3. xxd (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=xxd
  4. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  5. ctags (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=ctags
  6. cscope (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=csco­pe
  7. 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/
  8. c.vim : C/C++ IDE
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=213
  9. c.vim : C/C++ IDE key mappings
    http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf
  10. Základní základy editoru Vim
    http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/
  11. Jak si přizpůsobit Vim
    http://www.root.cz/serialy/jak-si-prizpusobit-vim/
  12. Novinky ve VIM 7: Úvodní část – speller
    http://www.root.cz/vim-sedm-prvni-cast/
  13. Novinky ve VIM 7: Skriptovací jazyk
    http://www.root.cz/vim-sedm-druha-cast/
  14. vim2elvis: Přednosti a nedostaky Elvise v porovnání s Vimem
    http://www.root.cz/clanky/vim2elvis-1/
  15. vim2elvis: Shodné znaky mezi Elvisem a Vimem, nastaveníeditoru
    http://www.root.cz/clanky/vim2elvis-2/
  16. Nej… VIM pluginy (1)
    http://www.root.cz/clanky/nej-vim-pluginy/
  17. Taglist (plugin)
    http://www.vim.org/scripts/scrip­t.php?script_id=273
  18. The NERD tree: A tree explorer plugin for navigating the filesystem
    http://www.vim.org/scripts/scrip­t.php?script_id=1658
  19. 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
  20. snippetsEmu : An attempt to emulate TextMate's snippet expansion
    http://www.vim.org/scripts/scrip­t.php?script_id=1318
  21. Scroll Lock (Necyklopedie)
    http://necyklopedie.wikia­.com/wiki/Scroll_lock
  22. Caps Lock (Necyklopedie)
    http://necyklopedie.wikia­.com/wiki/Caps_Lock
  23. Avoid the escape key
    http://vim.wikia.com/wiki/A­void_the_escape_key
  24. Map caps lock to escape in XWindows
    http://vim.wikia.com/wiki/VimTip166

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.