# HG changeset patch # User Dan Nicolaescu # Date 1268381094 28800 # Node ID dc9565b08f102e163ee561825c3bf74932527a4f # Parent 09780b284e3a82412e6c273e24a19e343d80a7ea Add .dir-locals.el support for file-less buffers. * files.el (hack-local-variables): Split out code to apply local variable settings ... (hack-local-variables-apply): ... here. New function. (hack-dir-local-variables): Use the default directory for when the buffer does not have an associated file. (hack-dir-local-variables-non-file-buffer): New function. * diff-mode.el (diff-mode): * vc-annotate.el (vc-annotate-mode): * vc-dir.el (vc-dir-mode): * log-edit.el (log-edit-mode): * log-view.el (log-view-mode): Call hack-dir-local-variables-non-file-buffer. diff -r 09780b284e3a -r dc9565b08f10 etc/NEWS --- a/etc/NEWS Thu Mar 11 19:13:01 2010 -0800 +++ b/etc/NEWS Fri Mar 12 00:04:54 2010 -0800 @@ -40,6 +40,11 @@ *** vc-dir for Bzr supports viewing shelve contents and shelving snapshots. +** Directory local variables can apply to file-less buffers. +For example, adding "(diff-mode . ((mode . whitespace)))" to your +.dir-locals.el file, will turn on `whitespace-mode' for *vc-diff* +buffers. + * New Modes and Packages in Emacs 24.1 diff -r 09780b284e3a -r dc9565b08f10 lisp/ChangeLog --- a/lisp/ChangeLog Thu Mar 11 19:13:01 2010 -0800 +++ b/lisp/ChangeLog Fri Mar 12 00:04:54 2010 -0800 @@ -1,3 +1,21 @@ +2010-03-12 + + +2010-03-12 Dan Nicolaescu + + Add .dir-locals.el support for file-less buffers. + * files.el (hack-local-variables): Split out code to apply local + variable settings ... + (hack-local-variables-apply): ... here. New function. + (hack-dir-local-variables): Use the default directory for when the + buffer does not have an associated file. + (hack-dir-local-variables-non-file-buffer): New function. + * diff-mode.el (diff-mode): + * vc-annotate.el (vc-annotate-mode): + * vc-dir.el (vc-dir-mode): + * log-edit.el (log-edit-mode): + * log-view.el (log-view-mode): Call hack-dir-local-variables-non-file-buffer. + 2010-03-12 Dan Nicolaescu Add support for shelving snapshots and for showing shelves. diff -r 09780b284e3a -r dc9565b08f10 lisp/diff-mode.el --- a/lisp/diff-mode.el Thu Mar 11 19:13:01 2010 -0800 +++ b/lisp/diff-mode.el Fri Mar 12 00:04:54 2010 -0800 @@ -1287,7 +1287,9 @@ (set (make-local-variable 'add-log-current-defun-function) 'diff-current-defun) (set (make-local-variable 'add-log-buffer-file-name-function) - (lambda () (diff-find-file-name nil 'noprompt)))) + (lambda () (diff-find-file-name nil 'noprompt))) + (unless (buffer-file-name) + (hack-dir-local-variables-non-file-buffer))) ;;;###autoload (define-minor-mode diff-minor-mode diff -r 09780b284e3a -r dc9565b08f10 lisp/files.el --- a/lisp/files.el Thu Mar 11 19:13:01 2010 -0800 +++ b/lisp/files.el Fri Mar 12 00:04:54 2010 -0800 @@ -3112,14 +3112,17 @@ ;; Otherwise, set the variables. (enable-local-variables (hack-local-variables-filter result nil) - (when file-local-variables-alist - ;; Any 'evals must run in the Right sequence. - (setq file-local-variables-alist - (nreverse file-local-variables-alist)) - (run-hooks 'before-hack-local-variables-hook) - (dolist (elt file-local-variables-alist) - (hack-one-local-variable (car elt) (cdr elt)))) - (run-hooks 'hack-local-variables-hook))))) + (hack-local-variables-apply))))) + +(defun hack-local-variables-apply () + (when file-local-variables-alist + ;; Any 'evals must run in the Right sequence. + (setq file-local-variables-alist + (nreverse file-local-variables-alist)) + (run-hooks 'before-hack-local-variables-hook) + (dolist (elt file-local-variables-alist) + (hack-one-local-variable (car elt) (cdr elt)))) + (run-hooks 'hack-local-variables-hook)) (defun safe-local-variable-p (sym val) "Non-nil if SYM is safe as a file-local variable with value VAL. @@ -3413,15 +3416,14 @@ Store the directory-local variables in `dir-local-variables-alist' and `file-local-variables-alist', without applying them." (when (and enable-local-variables - (buffer-file-name) - (not (file-remote-p (buffer-file-name)))) + (not (file-remote-p (or (buffer-file-name) default-directory)))) ;; Find the variables file. - (let ((variables-file (dir-locals-find-file (buffer-file-name))) + (let ((variables-file (dir-locals-find-file (or (buffer-file-name) default-directory))) (class nil) (dir-name nil)) (cond ((stringp variables-file) - (setq dir-name (file-name-directory (buffer-file-name))) + (setq dir-name (if (buffer-file-name) (file-name-directory (buffer-file-name)) default-directory)) (setq class (dir-locals-read-from-file variables-file))) ((consp variables-file) (setq dir-name (nth 0 variables-file)) @@ -3438,6 +3440,10 @@ (push elt dir-local-variables-alist)) (hack-local-variables-filter variables dir-name))))))) +(defun hack-dir-local-variables-non-file-buffer () + (hack-dir-local-variables) + (hack-local-variables-apply)) + (defcustom change-major-mode-with-file-name t "Non-nil means \\[write-file] should set the major mode from the file name. diff -r 09780b284e3a -r dc9565b08f10 lisp/log-edit.el --- a/lisp/log-edit.el Thu Mar 11 19:13:01 2010 -0800 +++ b/lisp/log-edit.el Fri Mar 12 00:04:54 2010 -0800 @@ -368,7 +368,8 @@ \\{log-edit-mode-map}" (set (make-local-variable 'font-lock-defaults) '(log-edit-font-lock-keywords t)) - (make-local-variable 'log-edit-comment-ring-index)) + (make-local-variable 'log-edit-comment-ring-index) + (hack-dir-local-variables-non-file-buffer)) (defun log-edit-hide-buf (&optional buf where) (when (setq buf (get-buffer (or buf log-edit-files-buf))) diff -r 09780b284e3a -r dc9565b08f10 lisp/log-view.el --- a/lisp/log-view.el Thu Mar 11 19:13:01 2010 -0800 +++ b/lisp/log-view.el Fri Mar 12 00:04:54 2010 -0800 @@ -255,7 +255,8 @@ 'log-view-beginning-of-defun) (set (make-local-variable 'end-of-defun-function) 'log-view-end-of-defun) - (set (make-local-variable 'cvs-minor-wrap-function) 'log-view-minor-wrap)) + (set (make-local-variable 'cvs-minor-wrap-function) 'log-view-minor-wrap) + (hack-dir-local-variables-non-file-buffer)) ;;;; ;;;; Navigation diff -r 09780b284e3a -r dc9565b08f10 lisp/vc-annotate.el --- a/lisp/vc-annotate.el Thu Mar 11 19:13:01 2010 -0800 +++ b/lisp/vc-annotate.el Fri Mar 12 00:04:54 2010 -0800 @@ -162,7 +162,8 @@ (remove-from-invisibility-spec 'foo) (set (make-local-variable 'truncate-lines) t) (set (make-local-variable 'font-lock-defaults) - '(vc-annotate-font-lock-keywords t))) + '(vc-annotate-font-lock-keywords t)) + (hack-dir-local-variables-non-file-buffer)) (defun vc-annotate-toggle-annotation-visibility () "Toggle whether or not the annotation is visible." diff -r 09780b284e3a -r dc9565b08f10 lisp/vc-dir.el --- a/lisp/vc-dir.el Thu Mar 11 19:13:01 2010 -0800 +++ b/lisp/vc-dir.el Fri Mar 12 00:04:54 2010 -0800 @@ -938,6 +938,7 @@ ;; Make sure that if the directory buffer is killed, the update ;; process running in the background is also killed. (add-hook 'kill-buffer-query-functions 'vc-dir-kill-query nil t) + (hack-dir-local-variables-non-file-buffer) (vc-dir-refresh))) (defun vc-dir-headers (backend dir)