Emacs? Help! (2.část) -=-=-=-=-=-=-=-=-=-=-=- Some people claim that the UNIX learning curve is steep, but at least you only have to climb it once. Milan Zamazal, 9.března 1998 Posledně jsme se seznámili se základními dokumenty popisujícími Emacs a poskytujícími uživateli podrobnou nápovědu. Tentokrát se zaměříme na programy, které kvalitní info dokumentací nedisponují. Povíme si také něco o klávesových příkazech a zastavíme se u příkazů pro rychlé získání nápovědy. Dokumentace k programům Mnohdy se stává, že narazíte na zajímavý balík, který však nemá vlastní info dokumentaci. Co potom? Řada emacsovských programů definuje nějaké módy, ať už hlavní nebo vedlejší. V případě takových programů můžete využít příkazu C-h m, který zobrazí dokumentaci pro všechny momentálně aktivní módy. Přitom popis aktivního hlavního módu obvykle naleznete až na konci výpisu dokumentace, musíte tedy zobrazenou nápovědou trochu zalistovat, hledáte-li informaci právě o hlavním módu. Naprostá většina programů obsahuje stručnější či obsáhlejší popis v úvodních komentářích ve svém zdrojovém textu. Obvykle tam naleznete informaci o instalaci, základní návod k použití a popis nejdůležitějších konfiguračních proměnných. Pokud se zdrojový kód nachází někde ve stromu emacsovských adresářů, naleznete jej nejsnáze pomocí příkazu M-x locate-library (tento příkaz může být též užitečný v případě, kdy si nejste jisti, zda se vám náhodou místo instalované nejnovější verze nezavádí nějaký zapomenutý exemplář daného programu). Pokud neznáte ani jméno programového souboru a znáte například pouze jméno jeho hlavní funkce, zkuste C-h f. Tento příkaz kromě popisu funkce vypíše i jméno souboru, ze kterého byla načtena. To může být spojeno s určitými obtížemi: Můžete se dozvědět, že funkce je built-in. Pak není definována v žádném elispovském souboru, nýbrž je definována ve zdrojových textech v jazyce C. Můžete se dozvědět, že se jedná o compiled Lisp function, ale už ne to, kde se její definice nachází. To znamená, že funkce je sice elispovská, ale zakompilovaná v binárce Emacsu kvůli sdílení paměti nebo byla definována dynamicky v těle jiné funkce a tudíž není znám soubor s její definicí. V druhém případě lze stále ještě použít tags. Máte-li Emacs instalován v adresáři directory, vygenerujete příkazem rm -f TAGS find directory -name '*.el' -print | xargs etags -a index všech elispovských proměnných a funkcí definovaných v distribuci Emacsu (musíte mít ovšem samozřejmě instalovány zdrojové *.el soubory). Kdykoliv pak hledáte nějakou funkci nebo proměnnou ze standardní distribuce Emacsu, naleznete ji velmi rychle příkazem M-.. Pozor, někdy musíte pro nalezení správného výskytu aplikovat hledání opakovaně prostřednictvím C-u M-.. Zdrojové texty jsou zajímavé nejen z hlediska úvodních komentářů. Pokročilejší uživatel si v nich najde zajímavé defvary. Pro uživatele vládnoucí (na první pohled magickou) schopností programovat v Elispu jsou pak zdrojové texty pravým pokladem. Lze v nich nalézt nesčetné množství tipů a zajímavostí a nezřídka do nich člověk nahlédne právě proto, aby zjistil "jak se něco dělá". Programujete-li v Elispu a nemůžete najít návod pro nějakou věc po manuálech, zkuste si vzpomenout, kde jste odpovídající chování již viděli. Návod pak najdete ve zdrojových textech příslušného programu. (Pro neznalce Elispu to celé může znít jako pokus o vtip, ale skutečnost je jiná. Elisp je velmi čitelný jazyk a nalézt něco v jeho zdrojových textech je obvykle daleko snazší, než si možná myslíte.) Vraťme se zpátky k běžnému uživateli. Může se stát, že narazíte na rozsáhlý balík se špatnou dokumentací (jako je například w3) a potřebujete jej zkonfigurovat. Pokud autor disponuje alespoň elementární mírou úcty k uživateli, tak dokumentuje přinejmenším konfigurační proměnné pomocí customize. (Pokud nevíte, co to customize je, nahlédněte do menu "Help" a zvolte odpovídající položku; pozor, standardně je přítomna až v Emacsu 20.) Na první pohled se může zdát, že customize je zde pouze pro uživatele, kteří si neumí zkonfigurovat Emacs editací souboru /.emacs. Ve skutečnosti však má tento mechanismus i významnou vedlejší funkci -- naleznete zde totiž hierarchicky uspořádané konfigurační proměnné s popisem a možností je ihned nastavit a případně i uložit. A pak už vlastně žádnou další dokumentaci ke konfiguraci balíku podporujícího customize nepotřebujete! Poučení pro tvůrce elispovských programů: - Své programy v úvodních komentářích stručně dokumentujte. - Uživatelské proměnné deklarujte pomocí defcustom, nikoliv pomocí defvar. - Pokud není již z názvu funkce či proměnné zcela zřejmé, k jakému účelu slouží, nezapomeňte ji vybavit dokumentačním řetězcem. To platí i pro triviální funkce -- ušetří to hledání definice funkce při četbě zdrojových textů. - Zejména bezpodmínečně dokumentujte všechny interaktivní funkce a uživatelské proměnné. - Podrobně dokumentujte módy, které váš program definuje. Klávesy Častým problémem je vyznat se v poměrně početných klávesových kombinacích. Nejčastější otázkou bývá: "Co tato klávesová zkratka vlastně dělá?" Nechcete-li být obtěžováni dlouhými výklady, použijte C-h c. To se hodí zejména v případě, kdy si chcete připojit funkci třeba na nějakou funkční klávesu a potřebujete znát její jméno pro zapsání odpovídající definice do /.emacs. Pokud chcete získat kompletní nápovědu k funkci dané klávesy, použijte C-h k. Pokud naopak nevíte, pomocí kterých kláves lze nějakou funkci vyvolat, můžete zkusit: - Podívat se do menu. Lze-li funkci vyvolat klávesovou zkratkou, má tuto zkratku příslušná položka menu u sebe uvedenu. - Funkci provést prostřednictvím zadání jejího plného jména po M-x. Je-li dosažitelná i klávesovou zkratkou, Emacs vás na to po jejím provedení (v Emacsu 19 před jejím provedením) upozorní. - Použít příkaz C-h w. Výhodou tohoto příkazu je to, že vám zobrazí *všechny* klávesové kombinace, pomocí kterých lze zadaný příkaz vyvolat. Často se též stává, že něco nechtěně zmáčknete a ono to provede zajímavý příkaz, který dosud neznáte. Rádi byste věděli, který příkaz to byl, protože je vám ihned jasné, že jej teď budete naprosto nezbytně a opakovaně potřebovat. Pomůže vám příkaz C-h l, který zobrazí posledních 100 stisknutých kláves. Mimochodem, víte, proč není dobré odcházet od neuzamčeného Emacsu, ve kterém jste se právě přihlásili na vzdálený počítač se zadáním hesla? Někteří lidé mají vyvinutější smysl pro systematičnost. Ti se pak s náhodným boucháním do klávesnice nespokojí a chtějí vidět všechno najednou. Pro ty je ideální příkaz C-h b. Ano, je to trochu přehnané, ani tento příkaz nemůže zobrazit spočetně mnoho příkazů Emacsu, takže zobrazí pouze aktuálně dostupné klávesové kombinace. Ty jsou samozřejmě závislé na momentálně aktivních hlavních a vedlejších módech. Pokud vás zajímají pouze příkazy začínající určitým prefixem, můžete si je nechat vypsat zadáním prefixu následovaného stiskem C-h. Například příkazy pro práci s registry, záložkami a obdélníkovými bloky si vypíšete pomocí C-x r C-h. Typické příkazy aktuálního hlavního módu pak pomocí C-c C-h. Proměnné a funkce Zejména při editaci souboru /.emacs či programování v Elispu využijete příkazy C-h f a C-h v zobrazující dokumentaci zadané funkce (případně makra) nebo proměnné. Neocenitelnou výhodou těchto příkazů je to, že poskytují přístup k nejaktuálnější a obvykle i nejúplnější dokumentaci k běžným objektům. Pokud máte při programování v Elispu notorické problémy zapamatovat si argumenty funkcí, použijte "eldoc-mode". Tip: Příkaz C-h f většinou nabízí identifikátor z posledního volání funkce před kurzorem, nikoliv slovo pod kurzorem, můžete si tedy mnohdy ušetřit pohyb kurzoru. Jedním z nejmocnějších příkazů nápovědy Emacsu je apropos. Apropos příkazy vám umožní vyhledat funkci nebo proměnnou podle regulárního výrazu. Zadáte regulární výraz a Emacs vám vypíše všechny funkce a proměnné, které zná a které tomuto výrazu odpovídají. Kliknutím nebo stiskem RET na dané položce z vyhledaného seznamu se vám zobrazí dokumentace k odpovídající funkci nebo proměnné. Apropos existuje ve třech základních variantách: - C-h a vyhledává mezi uživatelskými příkazy (interaktivní funkce). - C-u C-h a vyhledává mezi uživatelskými příkazy a uživatelskými proměnnými. - M-x apropos prohledává celý jmenný prostor. Vše, co najdete pomocí C-h a, naleznete i pomocí M-x apropos. Avšak C-h a výrazně omezuje množství nalezených objektů, takže se můžete vyhnout efektům známým z odpovědí vyhledávacích strojů na Webu po zadání příliš obecného dotazu. Na první pohled nemusí být zřejmé, o jak mocný nástroj se jedná. Kdo se ale naučí apropos efektivně používat, ušetří si spoustu hledání v manuálech a ve zdrojových textech. Například potřebujete obrátit pořadí řádků v souboru. Stačí si uvědomit, že s obráceným pořadím by mohlo mít něco společného anglické slovo "reverse". Zjevně by se mělo jednat o uživatelský příkaz, takže zadáte C-h a reverse RET a ve zobrazeném výsledku již odpovídající funkci snadno naleznete. Nebo provádíte sofistikovanou konfiguraci Gnus a potřebujete pro své účely najít nějaký vhodný hook. Použijete M-x apropos \char'136\char'202(gnus\char'202\char'206 message\char'202\char'206nn\char'202).*hook RET stoprocentní jistotu, že před sebou vidíte kompletní seznam všech hooků, které můžete použít. Nebo vás zajímají možnosti BibTeX módu. Aplikujete tedy C-u C-h a \char'136bibtex RET. (Tento příklad je poněkud umělý, spíše byste na tomto místě použili customize.) Pozor na malou záludnost: Některé programy jsou zaváděny prostřednictvím autoload mechanismu až při vyžádání jejich funkcí. Do doby jejich zavedení žádný z příkazů pro popis funkce nebo proměnné a tím pádem ani apropos neví o existenci většiny funkcí a proměnných definovaných v tomto balíku. Chcete-li proto hledat například něco týkající se Gnus, je dobré nejprve Gnus spustit a chvíli s nimi pracovat, protože teprve potom je načtena většina programových souborů Gnus a nebudete se marně snažit najít dosud nezavedenou proměnnou. Totéž platí pro příklad s BibTeXem -- před aplikací apropos nejprve otevřete libovolný (třeba prázdný) .bib soubor. - Dbejte na vhodnou volbu jmen proměnných a funkcí, mějte na paměti situaci uživatele používajícího apropos. - Rozlišujte interní a uživatelské proměnné pomocí hvězdičky v dokumentačním řetězci funkce defvar či makra defcustom. - Přečtěte si sekci "Documentation Tips" v manuálu Elispu. Budete pak schopni lépe dodržovat dokumentační konvence, které usnadní situaci uživateli, tj. tomu, pro koho dokumentaci píšete. Příště V závěrečné části tohoto miniseriálu si řekneme, jak hledat programy sloužící k žádanému účelu, kde hledat další pomoc a také malinko poradíme víajistům. výheň