unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#8586: 23.3.50; Directory-local variable ignored when file-local variables set mode
@ 2011-04-29 19:38 Reuben Thomas
  2011-05-03  0:45 ` Glenn Morris
  0 siblings, 1 reply; 7+ messages in thread
From: Reuben Thomas @ 2011-04-29 19:38 UTC (permalink / raw)
  To: 8586

I have the following .dir-locals.el in a directory:

((nil . ((indent-tabs-mode . nil)
	 (tab-width . 4))))

and two other files, foo and foo.pl, with the same contents:

## Local Variables:
## mode : perl
## End:

When I open foo, tab-width and indent-tabs-mode are set to their default
values. When I open foo.pl, they are set to the values given by
.dir-locals.el.

If I remove the mode: setting from foo and add other local variables,
both they and the .dir-locals.el values are used.

If I change the initial nil in .dir-locals.el to perl-mode, it has no effect.

The bug here is that the .dir-locals.el settings should be applied in
both cases AFAICS, but they are only applied in one, and ignored in the
other (even when the mode matches exactly!). Apparently, it is something
to do with the mode being set at a late stage.


In GNU Emacs 23.3.50.1 (i686-pc-linux-gnu, GTK+ Version 2.24.4)
 of 2011-04-24 on canta
Windowing system distributor `The X.Org Foundation', version 11.0.11001000
Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: en_GB.UTF-8
  value of $XMODIFIERS: nil
  locale-coding-system: utf-8-unix
  default enable-multibyte-characters: t

Major mode: Help

Minor modes in effect:
  recentf-mode: t
  show-paren-mode: t
  savehist-mode: t
  minibuffer-electric-default-mode: t
  iswitchb-mode: t
  icomplete-mode: t
  global-whitespace-mode: t
  global-auto-revert-mode: t
  desktop-save-mode: t
  nxhtml-menu-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  view-mode: t

Recent input:
C-x C-f . <M-backspace> <M-backspace> . r e <tab> <backspace> 
<backspace> d i <tab> <return> <down> <down> <down> 
<left> <left> <left> <left> <down> <left> <down> <down> 
<down> <left> <left> <left> <left> <left> <backspace> 
n i l <backspace> l C-x C-s C-x b <return> C-x k <return> 
C-x b <return> C-x k <return> C-x C-f <up> <up> <return> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> C-c 
C-h v <up> <return> <help-echo> <help-echo> <down-mouse-1> 
<mouse-1> C-x C-f <up> <return> C-x C-f <up> <up> <return> 
C-x C-f C-g <left> <left> <left> <left> <left> <left> 
<left> <left> <left> <left> <left> <left> <left> <left> 
<left> <left> <left> <left> <left> <left> <left> <left> 
<left> <left> <left> <left> <right> <backspace> <backspace> 
C-x C-s C-x k <return> C-x C-f <up> <return> <down> 
<down> <down> <right> <right> <right> <right> <right> 
<right> SPC . SPC <left> <left> <backspace> <down> 
<down> <down> <down> C-x C-s <help-echo> <help-echo> 
<help-echo> <help-echo> <down-mouse-1> <mouse-1> <return> 
( t a b - w i d t h SPC 4 ) C-e C-x C-s C-x b C-g C-n 
C-n C-n C-n C-n C-n C-x C-f C-g <down-mouse-1> <mouse-movement> 
<drag-mouse-1> SPC . C-x C-s M-x r e p o r t - e m 
a c s - <tab> <return> D i r e c t o r r y <backspace> 
<backspace> y - l o c a l SPC v a r i a b l e s <M-backspace> 
<M-backspace> <M-backspace> <M-backspace> C-_ <M-backspace> 
P r o <backspace> <backspace> <backspace> C l a s h 
SPC b e t w e e n SPC <M-backspace> <M-backspace> P 
r o b l e m SPC C-] C-] C-] C-h v <up> <return> M-x 
r e p o r t - e m a c s - b u g <return>

Recent messages:
Saving file /home/rrt/repo/gnulib/.dir-locals.el...
Wrote /home/rrt/repo/gnulib/.dir-locals.el
Saving file /home/rrt/repo/gnulib/.dir-locals.el...
Wrote /home/rrt/repo/gnulib/.dir-locals.el
Quit [2 times]
Mark set
Saving file /home/rrt/repo/gnulib/.dir-locals.el...
Wrote /home/rrt/repo/gnulib/.dir-locals.el
Read only text copied to kill ring
Quit
call-interactively: No recursive edit is in progress [2 times]

Load-path shadows:
/home/rrt/local/share/emacs/nxhtml/util/rnc-mode hides /usr/share/emacs-snapshot/site-lisp/rnc-mode/rnc-mode
/home/rrt/local/share/emacs/nxhtml/related/php-mode hides /home/rrt/local/share/emacs/site-lisp/php-mode
/home/rrt/.emacs.d/elpa/dictionary-1.8.7/link hides /usr/local/share/emacs/23.3.50/site-lisp/dictionary-el/link
/home/rrt/.emacs.d/elpa/dictionary-1.8.7/connection hides /usr/local/share/emacs/23.3.50/site-lisp/dictionary-el/connection
/home/rrt/.emacs.d/elpa/dictionary-1.8.7/dictionary-init hides /usr/local/share/emacs/23.3.50/site-lisp/dictionary-el/dictionary-init
/home/rrt/.emacs.d/elpa/dictionary-1.8.7/dictionary hides /usr/local/share/emacs/23.3.50/site-lisp/dictionary-el/dictionary
/home/rrt/local/share/emacs/site-lisp/graphviz-dot-mode hides /usr/local/share/emacs/23.3.50/site-lisp/emacs-goodies-el/graphviz-dot-mode
/home/rrt/local/share/emacs/site-lisp/dict hides /usr/local/share/emacs/23.3.50/site-lisp/emacs-goodies-el/dict
/usr/local/share/emacs/23.3.50/site-lisp/css-mode/css-mode hides /usr/local/share/emacs/23.3.50/lisp/textmodes/css-mode
/usr/share/emacs-snapshot/site-lisp/ruby1.8-elisp/ruby-mode hides /usr/local/share/emacs/23.3.50/lisp/progmodes/ruby-mode
/usr/local/share/emacs/23.3.50/site-lisp/css-mode/css-mode hides /usr/share/emacs/site-lisp/css-mode/css-mode
/usr/local/share/emacs/23.3.50/site-lisp/auctex/tex-info hides /usr/share/emacs/site-lisp/auctex/tex-info
/usr/local/share/emacs/23.3.50/site-lisp/auctex/context-nl hides /usr/share/emacs/site-lisp/auctex/context-nl
/usr/local/share/emacs/23.3.50/site-lisp/auctex/context-en hides /usr/share/emacs/site-lisp/auctex/context-en
/usr/local/share/emacs/23.3.50/site-lisp/auctex/latex hides /usr/share/emacs/site-lisp/auctex/latex
/usr/local/share/emacs/23.3.50/site-lisp/auctex/tex-mik hides /usr/share/emacs/site-lisp/auctex/tex-mik
/usr/local/share/emacs/23.3.50/site-lisp/auctex/tex-buf hides /usr/share/emacs/site-lisp/auctex/tex-buf
/usr/local/share/emacs/23.3.50/site-lisp/auctex/tex-jp hides /usr/share/emacs/site-lisp/auctex/tex-jp
/usr/local/share/emacs/23.3.50/site-lisp/auctex/tex-bar hides /usr/share/emacs/site-lisp/auctex/tex-bar
/usr/local/share/emacs/23.3.50/site-lisp/auctex/tex hides /usr/share/emacs/site-lisp/auctex/tex
/usr/local/share/emacs/23.3.50/site-lisp/auctex/multi-prompt hides /usr/share/emacs/site-lisp/auctex/multi-prompt
/usr/local/share/emacs/23.3.50/site-lisp/auctex/tex-fptex hides /usr/share/emacs/site-lisp/auctex/tex-fptex
/usr/local/share/emacs/23.3.50/site-lisp/auctex/tex-font hides /usr/share/emacs/site-lisp/auctex/tex-font
/usr/local/share/emacs/23.3.50/site-lisp/auctex/tex-fold hides /usr/share/emacs/site-lisp/auctex/tex-fold
/usr/local/share/emacs/23.3.50/site-lisp/auctex/texmathp hides /usr/share/emacs/site-lisp/auctex/texmathp
/usr/local/share/emacs/23.3.50/site-lisp/auctex/context hides /usr/share/emacs/site-lisp/auctex/context
/usr/local/share/emacs/23.3.50/site-lisp/auctex/font-latex hides /usr/share/emacs/site-lisp/auctex/font-latex
/usr/local/share/emacs/23.3.50/site-lisp/auctex/bib-cite hides /usr/share/emacs/site-lisp/auctex/bib-cite
/usr/local/share/emacs/23.3.50/site-lisp/auctex/toolbar-x hides /usr/share/emacs/site-lisp/auctex/toolbar-x
/usr/local/share/emacs/23.3.50/site-lisp/auctex/tex-style hides /usr/share/emacs/site-lisp/auctex/tex-style

Features:
(shadow sort mail-extr message sendmail ecomplete rfc822 mml mml-sec
password-cache mm-decode mm-bodies mm-encode mailcap mail-parse rfc2231
rfc2047 rfc2045 qp ietf-drums mailabbrev nnheader gnus-util netrc
time-date mm-util mail-prsvr gmm-utils mailheader canlock hashcash
mail-utils emacsbug two-column iso-transl cus-edit time-stamp
multi-isearch jka-compr find-func pp help-mode view parse-time vc-cvs
tex-info texinfo tex cperl-mode sh-script executable inform-mode
autoconf autoconf-mode make-mode info vc-git vc-bzr sha1 hex-util
face-remap filladapt flyspell completing-help recentf tree-widget
wid-edit uniquify paren savehist minibuf-eldef iswitchb icomplete
whitespace autorevert time as-external wrap-to-fill cus-start cus-load
desktop server nxhtml-autostart nxhtml-autoload majmodpri rnc-mode
nxhtml-menu web-autoload nxhtml-base php-mode etags cc-langs cc-mode
cc-fonts cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs
speedbar sb-image ezimage dframe lua-mode regexp-opt comint ring
ropemacs pymacs ffap ispell smart-quotes auto-dictionary-autoloads
c-eldoc-autoloads dictionary-autoloads diff-git-autoloads
dired-isearch-autoloads full-ack-autoloads guess-style-autoloads
kill-ring-search-autoloads magit-autoloads mv-shell-autoloads
tumble-autoloads http-post-simple-autoloads package reporter advice
advice-preload yasnippet help-fns derived edmacro kmacro easymenu assoc
cl cl-19 muse-autoloads emacs-goodies-el emacs-goodies-custom
emacs-goodies-loaddefs easy-mmode preview-latex tex-site auto-loads
tooltip ediff-hook vc-hooks lisp-float-type mwheel x-win x-dnd
font-setting tool-bar dnd fontset image fringe lisp-mode register page
menu-bar rfn-eshadow timer select scroll-bar mldrag mouse jit-lock
font-lock syntax facemenu font-core frame cham georgian utf-8-lang
misc-lang vietnamese tibetan thai tai-viet lao korean japanese hebrew
greek romanian slovak czech european ethiopic indian cyrillic chinese
case-table epa-hook jka-cmpr-hook help simple abbrev loaddefs button
minibuffer faces cus-face files text-properties overlay md5 base64
format env code-pages mule custom widget hashtable-print-readable
backquote make-network-process dbusbind system-font-setting
font-render-setting gtk x-toolkit x multi-tty emacs)

-- 
http://rrt.sc3d.org/





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#8586: 23.3.50; Directory-local variable ignored when file-local variables set mode
  2011-04-29 19:38 bug#8586: 23.3.50; Directory-local variable ignored when file-local variables set mode Reuben Thomas
@ 2011-05-03  0:45 ` Glenn Morris
  2011-05-22  1:35   ` Glenn Morris
  0 siblings, 1 reply; 7+ messages in thread
From: Glenn Morris @ 2011-05-03  0:45 UTC (permalink / raw)
  To: Reuben Thomas; +Cc: 8586

Reuben Thomas wrote:

> The bug here is that the .dir-locals.el settings should be applied in
> both cases AFAICS, but they are only applied in one, and ignored in the
> other (even when the mode matches exactly!). Apparently, it is something
> to do with the mode being set at a late stage.

I imagine this is an unintended version of this:

57.3.4.1 Specifying File Variables
[...]
    If `mode' is used to set a major mode, it should be the first
    "variable" in the list.  Otherwise, the entries that precede it will
    usually have no effect, since most major modes kill all local variables
    as part of their initialization.





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#8586: 23.3.50; Directory-local variable ignored when file-local variables set mode
  2011-05-03  0:45 ` Glenn Morris
@ 2011-05-22  1:35   ` Glenn Morris
  2011-05-22 16:53     ` Reuben Thomas
  0 siblings, 1 reply; 7+ messages in thread
From: Glenn Morris @ 2011-05-22  1:35 UTC (permalink / raw)
  To: Reuben Thomas; +Cc: 8586


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






^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#8586: 23.3.50; Directory-local variable ignored when file-local variables set mode
  2011-05-22  1:35   ` Glenn Morris
@ 2011-05-22 16:53     ` Reuben Thomas
  2011-05-23 17:04       ` Glenn Morris
  0 siblings, 1 reply; 7+ messages in thread
From: Reuben Thomas @ 2011-05-22 16:53 UTC (permalink / raw)
  To: Glenn Morris; +Cc: 8586

On 22 May 2011 02:35, Glenn Morris <rgm@gnu.org> wrote:
>
> I think this area is a bit of mess, but here is an attempt at a fix.

Thanks very much for this. While it would fix this bug, I'm not sure I
approve: it looks as though it makes things more complicated, and when
the "real fix" eventually arrives, would presumably have to remain in
place for those who'd adopted this partial solution in the mean
time...not great.

-- 
http://rrt.sc3d.org





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#8586: 23.3.50; Directory-local variable ignored when file-local variables set mode
  2011-05-22 16:53     ` Reuben Thomas
@ 2011-05-23 17:04       ` Glenn Morris
  2011-05-23 18:11         ` Reuben Thomas
  0 siblings, 1 reply; 7+ messages in thread
From: Glenn Morris @ 2011-05-23 17:04 UTC (permalink / raw)
  To: Reuben Thomas; +Cc: 8586

Reuben Thomas wrote:

> While it would fix this bug, I'm not sure I approve: it looks as
> though it makes things more complicated, and when the "real fix"
> eventually arrives, would presumably have to remain in place for those
> who'd adopted this partial solution in the mean time...not great.

These comments don't apply. This isn't a partial solution, and no-one
needs to "adopt" anything.

I'm making set-auto-mode respect mode: cookies whether they be at the
start or end of the file. That's how it should work, IMO. It also
removes the "major mode must be specified first" restriction (bug#5239).

The only issue I see with it is that normal-mode will be less efficient
than it could be, because set-auto-mode and hack-local-variables may
parse similar regions of the file in similar ways.

Ideally, the file would be parsed only once to get coding:, mode: and
variables, which would then be applied (also allowing bug#7169 to be
fixed). But this is not straightforward to do, because these features
are currently spread over at least 4 functions, so I don't see it
happening any time soon.





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#8586: 23.3.50; Directory-local variable ignored when file-local variables set mode
  2011-05-23 17:04       ` Glenn Morris
@ 2011-05-23 18:11         ` Reuben Thomas
  2011-05-27  1:01           ` Glenn Morris
  0 siblings, 1 reply; 7+ messages in thread
From: Reuben Thomas @ 2011-05-23 18:11 UTC (permalink / raw)
  To: Glenn Morris; +Cc: 8586

On 23 May 2011 18:04, Glenn Morris <rgm@gnu.org> wrote:
>
> These comments don't apply. This isn't a partial solution, and no-one
> needs to "adopt" anything.

I'm sorry, I misread the patch. Looks good.

-- 
http://rrt.sc3d.org





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#8586: 23.3.50; Directory-local variable ignored when file-local variables set mode
  2011-05-23 18:11         ` Reuben Thomas
@ 2011-05-27  1:01           ` Glenn Morris
  0 siblings, 0 replies; 7+ messages in thread
From: Glenn Morris @ 2011-05-27  1:01 UTC (permalink / raw)
  To: 8586-done

Version: 24.1

Applied. (Discovered the hack-local-variables part was not needed, since
it already doesn't change the mode needlessly.)





^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-05-27  1:01 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-29 19:38 bug#8586: 23.3.50; Directory-local variable ignored when file-local variables set mode Reuben Thomas
2011-05-03  0:45 ` Glenn Morris
2011-05-22  1:35   ` Glenn Morris
2011-05-22 16:53     ` Reuben Thomas
2011-05-23 17:04       ` Glenn Morris
2011-05-23 18:11         ` Reuben Thomas
2011-05-27  1:01           ` Glenn Morris

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).