Emacs, könyvtárfüggő formázás (C, C++)

Sokszor bizonyos könyvárakban egységesen kell a C/C++ kódot formázni, vim esetén ezt nagyon egyszerűen megcsináltam, de emacs esetén nem találtam rá könnyű megoldást, így megírtam. Könnyen használható (szemben az előző kettő kis kódommal), a c-set-style-t burkolja.

Link: c-styles.el

Használat:
1) be kell állítani a könyvtárneveket a "(setq modes-in-dir" után, két példa már van benne.
2) és használható is:
- C-ccs billentyűkkel be manuálisan
- c-mode-hooks, c++-mode-hooks vagy c-common-hooks-hoz felvéve (a kód végén az első kettő eset található)

A kód jelenlegi formájában:


(setq modes-in-dir '(
       ("/home/panther/src" "linux" )
       ("/home/panther/gnu" "gnu")
       )
)

(defun compare-strings-ex (str1 b1 e1 str2 b2 e2)
  "Returns t if compare-string returns t, nil otherwise"
  (setq r (compare-strings str1 b1 e1 str2 b2 e2))
  (and (booleanp r) (not (eq r nil)))
)

(defun file-in-dir (filename directory)
  "Check that filename's prefix is directory"
 (setq len (length directory))
  (if (compare-strings-ex directory (- len 1) len "/" 0 1)
    (setq dir directory)
      (setq dir (concat directory "/"))
    )
 (setq len (length dir))
  (compare-strings-ex filename 0 len dir 0 len)
)

(defun set-style-in-dirs (filename default-style)
 "Sets the C style in the current buffer"
 (setq st default-style)
 (dolist (item modes-in-dir)
  (if (file-in-dir filename (car item))
    (setq st (car (cdr item)))
   )
  )
 (message st)
 (c-set-style st)
 st
 )

(global-set-key "\C-ccs" '(lambda ()
                         (interactive)
                         (message "Setting C style")
                         (set-style-in-dirs (buffer-file-name) "gnu")
                         ))

(add-hook 'c-mode-hook (lambda () (interactive)
                         (message "Setting C style")
                         (set-style-in-dirs (buffer-file-name) "gnu")
                         ))
(add-hook 'c++-mode-hook (lambda () (interactive)
                         (message "Setting C style")
                         (set-style-in-dirs (buffer-file-name) "gnu")
                         ))

Hozzászólások

Tedd ki a vimes megoldast is... erdekel...
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Talán így egyszerűbb. A panther/c-modes-directory-alist változót a M-x customize-variable panther/c-modes-directory-alist utasítással bármikor könnyen tudod módosítani.


(defcustom panther/c-modes-directory-alist
  '(("/home/panther/src" "linux")
    ("/home/panther/gnu" "gnu"))
  "Alist of Panther's (DIRECTORY CODING-STYLE) mapping."
  :type '(alist :key-type file :value-type (group string))
  :group 'c)

(defun panther/c-set-style ()
  "Set C style according to visiting file's directory."
  (interactive)
  (mapcar (lambda (item)
            (when (string-match (car item) (buffer-file-name))
              (message "Setting C-style to '%s'" (cadr item))
              (c-set-style (cadr item)))) panther/c-modes-directory-alist))

(add-hook 'c-mode-hook 'panther/c-set-style)

A

file-in-dir

függvényed beépítettje a

file-directory-p

, string összehasonlításra pedig itt kiváló a

string-equal

.

Ismerkedem még csak a lisp-pel. De köszi, így sokkal barátságosabb :D

A gondom csak az, hogy elsőre elég tömény (funkcionális nyelv, és a procedurálist szoktam meg, értem ez alatt az objektum-orientált nyelveket is), és egyelőre kevés könyvet, meg példát találtam.

szerk: ebből hiányzik a fallback stílus, de majd törpölök rajta, legalább megértem teljes egészében (a használatot). Bár lehet, erre a hétre nem sok emacsozás jut :P

Csak a teljesség kedvéért: Emacs 23-ban már benne van a kívánt funkció, dir-locals-set-class-variables néven fut. Pont az teszi, amit szeretnél: elérési útvonaltól függően megváltoztatja a megadott változók értékéet.