From the manual, Directory Variables
.dir-locals.elin a directory, Emacs will read it when it visits any file in that directory or any of its subdirectories, and apply the settings it specifies to the file’s buffer. Emacs searches for `.dir-locals.el’ starting in the directory of the visited file, and moving up the directory tree.
The `.dir-locals.el’ file should hold a specially-constructed list. This list maps Emacs mode names (symbols) to alists; each alist specifies values for variables to use when the respective mode is turned on. The special mode name
‘nil’ means that its alist applies to any mode. Instead of a mode name, you can specify a string that is a name of a subdirectory of the project’s directory; then the corresponding alist applies to all the files in that subdirectory.
Here’s an example of a `.dir-locals.el’ file:
((nil . ((indent-tabs-mode . t) (tab-width . 4) (fill-column . 80))) ;; Warn about spaces used for indentation: (haskell-mode . ((eval . (highlight-regexp "^ *")))) (c-mode . ((c-file-style . "BSD"))) (java-mode . ((c-file-style . "BSD"))) ("src/imported" . ((nil . ((change-log-default-name . "ChangeLog.local"))))))
Emacs (23.2.1) will not attempt to apply directory local variables to buffers visiting remote files (via tramp).
As of Emacs 24.3, you can set the variable
‘enable-remote-dir-locals’ to apply such values on remote files. If you’re using an earlier version of Emacs, read on:
We can advise
‘hack-dir-local-variables’ to work around this, if you are willing to incur the associated performance cost (which can be relatively minimal in some situations).
;; Enable directory local variables with remote files. This facilitates both ;; the (dir-locals-set-class-variables ...)(dir-locals-set-directory-class ...) ;; and the dir-locals.el approaches. (defadvice hack-dir-local-variables (around my-remote-dir-local-variables) "Allow directory local variables with remote files, by temporarily redefining `file-remote-p' to return nil unconditionally." (flet ((file-remote-p (&rest) nil)) ad-do-it)) (ad-activate 'hack-dir-local-variables)
And an example of using this without dir-locals.el:
(dir-locals-set-class-variables 'plone-core '((nil . ((buffer-read-only . t)))))
(dir-locals-set-class-variables 'plone-instance '((nil . ((indent-tabs-mode . nil) (fill-column . 80))) ;; (python-mode . (())) ;; (nxhtml-mode . (())) ))
(dir-locals-set-directory-class "/scpc:(user)@(host):/home/(user)/Plone/" 'plone-core)
(dir-locals-set-directory-class "/scpc:(user)@(host):/home/(user)/Plone/zinstance/" 'plone-instance)
As of Emacs 24:
‘whitespace-mode’for *vc-diff* buffers. Modes should call
‘hack-dir-local-variables-non-file-buffer’to support this.