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ň