bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#8586: 23.3.50; Directory-local variable ignored when file-local vari


From: Glenn Morris
Subject: bug#8586: 23.3.50; Directory-local variable ignored when file-local variables set mode
Date: Sat, 21 May 2011 21:35:49 -0400
User-agent: Gnus (www.gnus.org), GNU Emacs (www.gnu.org/software/emacs/)

I think this area is a bit of mess, but here is an attempt at a fix.

In the longer term, since they do a lot of the same thing, unifying
set-auto-mode and set-auto-coding might make sense (eg to solve bug#7169).


*** lisp/files.el       2011-05-22 01:18:49 +0000
--- lisp/files.el       2011-05-22 01:28:30 +0000
***************
*** 2244,2250 ****
      (report-errors "File mode specification error: %s"
        (set-auto-mode))
      (report-errors "File local-variables error: %s"
!       (hack-local-variables)))
    ;; Turn font lock off and on, to make sure it takes account of
    ;; whatever file local variables are relevant to it.
    (when (and font-lock-mode
--- 2244,2250 ----
      (report-errors "File mode specification error: %s"
        (set-auto-mode))
      (report-errors "File local-variables error: %s"
!       (hack-local-variables nil t)))
    ;; Turn font lock off and on, to make sure it takes account of
    ;; whatever file local variables are relevant to it.
    (when (and font-lock-mode
***************
*** 2616,2631 ****
    "Select major mode appropriate for current buffer.
  
  To find the right major mode, this function checks for a -*- mode tag,
  checks if it uses an interpreter listed in `interpreter-mode-alist',
  matches the buffer beginning against `magic-mode-alist',
  compares the filename against the entries in `auto-mode-alist',
  then matches the buffer beginning against `magic-fallback-mode-alist'.
  
! It does not check for the `mode:' local variable in the
! Local Variables section of the file; for that, use `hack-local-variables'.
! 
! If `enable-local-variables' is nil, this function does not check for a
! -*- mode tag.
  
  If the optional argument KEEP-MODE-IF-SAME is non-nil, then we
  set the major mode only if that would change it.  In other words
--- 2616,2629 ----
    "Select major mode appropriate for current buffer.
  
  To find the right major mode, this function checks for a -*- mode tag,
+ checks for a `mode:' entry in the Local Variables section of the file,
  checks if it uses an interpreter listed in `interpreter-mode-alist',
  matches the buffer beginning against `magic-mode-alist',
  compares the filename against the entries in `auto-mode-alist',
  then matches the buffer beginning against `magic-fallback-mode-alist'.
  
! If `enable-local-variables' is nil, this function does not check for
! any mode: tag.
  
  If the optional argument KEEP-MODE-IF-SAME is non-nil, then we
  set the major mode only if that would change it.  In other words
***************
*** 2667,2672 ****
--- 2665,2677 ----
              (or (set-auto-mode-0 mode keep-mode-if-same)
                  ;; continuing would call minor modes again, toggling them off
                  (throw 'nop nil))))))
+     (and (not done)
+        (setq mode (hack-local-variables t))
+        (not (memq mode modes))        ; already tried and failed
+        (if (not (functionp mode))
+            (message "Ignoring unknown mode `%s'" mode)
+          (setq done t)
+          (set-auto-mode-0 mode keep-mode-if-same)))
      ;; If we didn't, look for an interpreter specified in the first line.
      ;; As a special case, allow for things like "#!/bin/env perl", which
      ;; finds the interpreter anywhere in $PATH.
***************
*** 3144,3155 ****
                   (assq-delete-all (car elt) file-local-variables-alist)))
           (push elt file-local-variables-alist)))))
  
! (defun hack-local-variables (&optional mode-only)
    "Parse and put into effect this buffer's local variables spec.
  If MODE-ONLY is non-nil, all we do is check whether a \"mode:\"
  is specified, and return the corresponding mode symbol, or nil.
  In this case, we try to ignore minor-modes, and only return a
! major-mode."
    (let ((enable-local-variables
         (and local-enable-local-variables enable-local-variables))
        result)
--- 3149,3164 ----
                   (assq-delete-all (car elt) file-local-variables-alist)))
           (push elt file-local-variables-alist)))))
  
! (defun hack-local-variables (&optional mode-only keep-mode-if-same)
    "Parse and put into effect this buffer's local variables spec.
  If MODE-ONLY is non-nil, all we do is check whether a \"mode:\"
  is specified, and return the corresponding mode symbol, or nil.
  In this case, we try to ignore minor-modes, and only return a
! major-mode.
! 
! If the optional argument KEEP-MODE-IF-SAME is non-nil, then we
! ignore a mode: entry if it specifies the same major-mode as the
! buffer already has."
    (let ((enable-local-variables
         (and local-enable-local-variables enable-local-variables))
        result)
***************
*** 3186,3192 ****
              (forward-line 1)
              (let ((startpos (point))
                    endpos
!                   (thisbuf (current-buffer)))
                (save-excursion
                  (unless (let ((case-fold-search t))
                            (re-search-forward
--- 3195,3202 ----
              (forward-line 1)
              (let ((startpos (point))
                    endpos
!                   (thisbuf (current-buffer))
!                   (thismajor major-mode))
                (save-excursion
                  (unless (let ((case-fold-search t))
                            (re-search-forward
***************
*** 3242,3248 ****
                                     "-minor\\'"
                                     (setq val2 (symbol-name val))))
                               (setq result (intern (concat val2 "-mode"))))
!                       (unless (eq var 'coding)
                          (condition-case nil
                              (push (cons (if (eq var 'eval)
                                              'eval
--- 3252,3266 ----
                                     "-minor\\'"
                                     (setq val2 (symbol-name val))))
                               (setq result (intern (concat val2 "-mode"))))
!                       (or (eq var 'coding)
!                           (and keep-mode-if-same
!                                (eq var 'mode)
!                                (functionp
!                                 (setq val2
!                                       (intern
!                                        (concat (symbol-name val) "-mode"))))
!                                (eq (indirect-function thismajor)
!                                    (indirect-function val2)))
                            (condition-case nil
                                (push (cons (if (eq var 'eval)
                                                'eval






reply via email to

[Prev in Thread] Current Thread [Next in Thread]