Edytowanie plików C w Emacsie. Konfiguracja Emacsa.

Pokrótce opiszę jak skonfigurować (X)Emacsa by wygodnie pisać w nim programy w C. Wszelkich konfiguracji można dokonywać w pliku .emacs, umieszczonym w swoim katalogu domowym (czyli tam, gdzie będziemy po wydaniu polecenia cd). Uwaga: w tym pliku wszystko po znaku średnika aż do końca linii jest komentarzem.

Ogólna konfiguracja

Ponieważ część poleceń zależy od tego, czy używamy Emacsa czy XEmacsa, dobry plik konfiguracyjny powinien wykrywać z jakim programem został uruchomiony. Wpisujemy zatem do .emacs

;; Sprawdza czy używamy XEmacsa
(defvar running-xemacs 
  (string-match "XEmacs\\|Lucid" emacs-version))

Warto używać mechanizmu zapamiętywania sesji. Na razie nie wiem, jak to zrobić w XEmacsie, zatem na wszelki wypadek uruchamiam to tylko dla Emacsa. W .emacs wpisujemy

;; Zapamiętywanie sesji
(unless running-xemacs
  (desktop-load-default)
  (desktop-read)
  )
Następnie przed wyjściem z Emacsa zapamiętujemy sesję za pomocą M-x desktop-save (tzn. wciskamy lewy alt i klawisz 'x', a następnie wpisujemy desktop-save). Emacs pyta o katalog, do którego zapisać plik z informacjami o sesji. Zapisuje do tego katalogu plik o nazwie .emacs.desktop zawierający m.in. informacje o otwartch plikach, pozycji kursora i zawartości "schowka" (w Emacsie: kill-ring). Od tej pory uruchomienie Emacsa bez podania plików w katalogu w którym znajduje się taki plik powoduje odtworzenie sesji, a każde zamknięcie Emacsa powoduje uaktualnienie pliku .emacs.desktop (tak więc wystarczy ten plik zapisać raz, chyba że chcemy mieć kilka niezależnych sesji; wtedy każdy plik .emacs.desktop zapisujemy do osobnego katalogu).

Jeśli przeszkadza nam sygnalizacja dźwiękowa o błędzie, możemy ją wyłaczyć, wpisując do .emacs linijkę:

;; Visible bell (no beep)
(setq visible-bell t)

Polskie literki

Aby móc pod Emacsem poprawnie widzieć i wpisywac polskie literki należy w .emacs wpisać linijkę
;; no-MULE
;; poniższa linijka wyłącz MULE i ustawia widzenie polskich znaczkow
(standard-display-european t)
Nie jest to jedyna możliwość, ale jest najprostsza. Polskie literki powinny byc kodowane w standardzie latin-2. Gdybyśmy chcieli używać innego standardu kodowania, nalezy użyć MULE; dalsze informacje w info do Emacsa.

Konfiguracja specyficzna dla pisania programów w C

Bardzo przydatne jest kolorowanie składni, nie tylko przy edycji programów. Zatem włączmy je globalnie:

;; Font-lock-mode settings (kolorowanie składni)
(if running-xemacs
    (progn
      (turn-on-font-lock)                         ;włączenie kolorków globalnie
      (lazy-shot-mode)                            ;'leniwe' kolorowanie
      )
  (progn
    (global-font-lock-mode t)                     ;włączenie kolorków globalnie
    (setq font-lock-support-mode 'lazy-lock-mode) ;'leniwe' kolorowanie
    )
)
(setq font-lock-maximum-decoration t)             ;kolorowanie na maksimum

Emacs w cc-mode (trybie używanym do pisania programów w C, C++, Javie i Objective C) potrafi automatycznie wcinać kod i go rozmieszczać. I tak np. dumyślnie po średniku wstawia znak nowej linii. Widać to w wierszu statusu, gdzie powinno znajdowac się C/ah. Zachowanie to przełączyć możemy za pomocą C-c C-a (t.j. wciskamy klawisz Ctrl i razem z nim c, a nastepnie Ctrl i klawisz a). Podobnie możemy przełączyć tryb "zjadania spacji" za pomocą C-c C-h. Zostanie to odwzorowane w wierszu statusu: jedna albo obie z literek a i h w C/ah zniknie. Można przełączyc obie te rzeczy jednoczesnie za pomocą C-c C-t.

Emacs potrafi także automatycznie wcinać kod. Linię możemy wciąć wciskając klawisz TAB, zaś cały program za pomocą kombinacji C-x h (zaznacza cały bufor t.j. plik) a następnie M-C-\ (która wcina cały zaznaczony obszar; M-C-\ oznacza jednoczesne wciśnięcie klawisza Alt, Ctrl i \). Jeśli chcemy by wcisnięcie klawisza Enter automatycznie wcinało linię możemy to ustawić wpisując

(define-key c-mode-base-map "\C-m" 'newline-and-indent)
do inicjalizacji cc-mode (patrz niżej).

Emacs powinien sam rozpoznać typ pliku po rozszerzeniu i zastosować odpowiedni tryb. Na wszelki wypadek można jednak napisać w pliku konfiguracyjnym:

;; Definiuje z jakiego pliku należy wczytać odpowiednie tryby
(autoload 'c++-mode  "cc-mode"  "C++ Editing Mode" t)
(autoload 'c-mode    "cc-mode"  "C Editing Mode" t)
(autoload 'objc-mode "cc-mode"  "Objective-C Editing Mode" t)
(autoload 'java-mode "cc-mode"  "Java Editing Mode" t)

;; powiązanie rozszerzeń z trybami Emacsa
(setq auto-mode-alist
      (append
       '(("\\.C$"    . c++-mode)
	 ("\\.H$"    . c++-mode)
	 ("\\.cc$"   . c++-mode)
	 ("\\.hh$"   . c++-mode)
	 ("\\.cxx$"  . c++-mode)
	 ("\\.cpp$"  . c++-mode)
	 ("\\.c$"    . c-mode)
	 ("\\.h$"    . c-mode)
	 ("\\.m$"    . objc-mode)
	 ("\\.java$" . java-mode)
	 ) auto-mode-alist))

Można także ustawić styl wcinania, np. gnu (domyślny; nawiasy otwierające blok znajdują się w linii komendy), k&r czy bsd (inaczej styl Allmana - nawiasy klamrowe otwierające blok znajdują się w osobnej linii). Można także zmienić głębokość wcięć. Dokonujemy tego wpisując:

(defun my-c-mode-common-hook ()
  ;; styl Allmana zamiast GNU.
  (c-set-style "bsd") 
  ;; enter automatycznie wcina.
  (define-key c-mode-base-map "\C-m" 'newline-and-indent) 
  ;; rozmiar wcięć
  (setq c-basic-offset '2)
  )

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
Oczywiście nie trzeba wpisywac wszystkiego, tylko potrzebne rzeczy.

Wkrótce powinny pojawić się dalsze wskazówki. Więcej informacji można znaleźć w info do CC-Mode (C-h i i szukamy CC Mode lub od razu wciskamy m i wpisujemy CC Mode). Mój plik konfiguracyjny do Emacsa jest do ściągnięcia z mojej strony domowej.


Jakub Narebski <Jakub.Narebski@fuw.edu.pl>
Last modified: Tue Feb 27 14:38:37 CET 2001