* 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).