EMACS a <TAB>

Milan Zamazal pdm na fi.muni.cz
Pondělí Březen 17 11:21:11 CET 1997


>>>>> "MK" == Michal Kubecek <kubecek na karlin.mff.cuni.cz> writes:

    :: potreboval bych vedet, jak donutit Emacs, aby se klavesa <TAB>
    :: chovala jako <TAB>. Mackat C-q <tab> mne nebavi...

    MK: Pokud tim rozumite pozadavek, aby se tabulator choval
    MK: "rozumne", t.j. tak, jak je obvykle, nejjednodussi bude asi
    MK: prepnout se do normalniho modu, t.j. 'M-x fundamental-mode'.

Ne, tím by se člověk zbavil *všech* funkcí c-mode.

Jde o to, čeho tabulátorem chcete dosáhnout.  V zásadě existují dvě
možnosti:
1. Chcete se držet Linux coding style za pomoci odsazovacího stroje
   c-modu.  Pak tabulátor vkládající znak tabulátoru na nic
   nepotřebujete s výjimkou velmi speciálních situací, ve kterých
   s `C-q TAB' v pohodě vystačíte.  Pokud vám odsazování nefunguje,
   viz níže.
2. Nechcete se držet Linux coding style *a* nelíbí se vám odsazovací
   stroj c-modu a chcete si tedy odsazovat ručně, na což potřebujete
   tabulátor vkládající znak tabulátoru.  Toho dosáhnete například takto:
     (defun my-c-mode-common ()
       (local-set-key "\t" 'self-insert-command))
     (add-hook 'c-mode-common-hook 'my-c-mode-common)

    :: Nasel jsem v /usr/src/linux/Documentation/CodingStyle tohle:

    MK: On se zpusob implementace c-mode (a c++-mode) vyrazne zmenil,
    MK: takze ruzna literatura (vcetne dokumentace k Emacsu) je v
    MK: tomto smeru ponekud zastarala.

Nový c-mode je samozřejmě v dokumentaci Emacsu řádně popsán, musíte se
však podívat do `Cc-mode', který je na stejné úrovni jako `Emacs' (na
což však patrně není na patřičném místě odkaz a popisuje se tam pouze
starý c-mode, který už není defaultní).

Problém je opravdu v nekompatibilitě nového c-modu se starým.
Možnosti nápravy jsou dvě:
a) Na začátek `~/.emacs' přidat
     (load "cc-compat")
b) Nahradit řádek
     (setq c-indent-level 8)
   řádkem
     (setq c-basic-offset 8)
   Nejsem si úplně jist, ale zbytek snad funguje beze změny.

    MK: do sveho ' /.emacs' nasledujici radky:

    MK: (setq c-mode-hook
    [...]
    MK: (setq c++-mode-hook
    [...]

    MK: (FUJ).

Ano. :-)

Hook proměnné mohou obsahovat více funkcí.  Tím, co provede uvedený
kód, se zruší všechny do té doby nastavené hooky.  Pokud tam žádné
nejsou, tak to samozřejmě nevadí, ale mnohdy tomu tak není.  Takže
správný způsob přidání hooku je zhruba tento:

  (defun my-c-mode ()
     ...
     )
  (add-hook 'c-mode-hook 'my-c-mode)

V případě kraťoučkého kódu samozřejmě není nutno definovat speciální
funkci, ale lze kód vložit do hooku v lambda formě, ale opět pomocí
`add-hook'.
Pro odstranění hooku použijete `remove-hook'.

Tip: `c-mode-common-hook' se provádí pro c- i c++-mode a není tudíž
zapotřebí tytéž věci definovat dvakrát.

    MK: Blizsi vysvetleni, co jednotlive veci znamenaji, viz.  soubor
    MK: c-mode.el.

Nebo raději ve zmíněné cc-mode info dokumentaci.

Milan Zamazal

-- 
Milan Zamazal
Student of computer science, Masaryk University, Brno, Moravia, Czech Republic
mailto:pdm na fi.muni.cz (MIME is ok)                  http://www.fi.muni.cz/~pdm
PGP public key: finger pdm na aisa.fi.muni.cz


Další informace o konferenci Linux