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")
))
- Panther blogja
- A hozzászóláshoz be kell jelentkezni
- 806 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
Ez nem egy nagy durranás: http://hup.hu/node/62448
- A hozzászóláshoz be kell jelentkezni
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
.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni