From 8117868f0ce67b6db33081f77b6715a6c10e45b8 Mon Sep 17 00:00:00 2001 From: Dan Nicolaescu Date: Fri, 12 Mar 2010 00:04:54 -0800 Subject: [PATCH] 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. --- etc/NEWS | 5 +++++ lisp/ChangeLog | 18 ++++++++++++++++++ lisp/diff-mode.el | 4 +++- lisp/files.el | 30 ++++++++++++++++++------------ lisp/log-edit.el | 3 ++- lisp/log-view.el | 3 ++- lisp/vc-annotate.el | 3 ++- lisp/vc-dir.el | 1 + 8 files changed, 51 insertions(+), 16 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 82c63f4449..fcc08e7b6e 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -40,6 +40,11 @@ so we will look at it and add it to the manual. *** 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 --git a/lisp/ChangeLog b/lisp/ChangeLog index e7f4f17d54..1e54ed03a9 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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 --git a/lisp/diff-mode.el b/lisp/diff-mode.el index 27f8318f91..75ea98ba91 100644 --- a/lisp/diff-mode.el +++ b/lisp/diff-mode.el @@ -1287,7 +1287,9 @@ a diff with \\[diff-reverse-direction]. (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 --git a/lisp/files.el b/lisp/files.el index 99fa7ddf1b..07442d4ba1 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -3112,14 +3112,17 @@ is specified, returning t if it is specified." ;; 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 @@ is found. Returns the new class name." 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 @@ and `file-local-variables-alist', without applying them." (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 --git a/lisp/log-edit.el b/lisp/log-edit.el index 10c6d480d2..e26521642d 100644 --- a/lisp/log-edit.el +++ b/lisp/log-edit.el @@ -368,7 +368,8 @@ commands (under C-x v for VC, for example). \\{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 --git a/lisp/log-view.el b/lisp/log-view.el index 6fbe842967..5c454ead5f 100644 --- a/lisp/log-view.el +++ b/lisp/log-view.el @@ -255,7 +255,8 @@ The match group number 1 should match the revision number itself.") '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 --git a/lisp/vc-annotate.el b/lisp/vc-annotate.el index 7183944355..1878fe8740 100644 --- a/lisp/vc-annotate.el +++ b/lisp/vc-annotate.el @@ -162,7 +162,8 @@ menu items." (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 --git a/lisp/vc-dir.el b/lisp/vc-dir.el index 2f661e8bec..a0350eb301 100644 --- a/lisp/vc-dir.el +++ b/lisp/vc-dir.el @@ -938,6 +938,7 @@ the *vc-dir* buffer. ;; 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) -- 2.39.2