Subject: 23.3.50; Directory-local variable ignored when file-local variables set mode

From: Reuben Thomas <[email-masked]>
Date: Fri, 29 Apr 2011 20:38:16 +0100

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/