From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.devel Subject: Reacting to local var changes in mode-hooks and file-local vars Date: Fri, 10 Dec 2010 15:31:51 -0500 Message-ID: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: dough.gmane.org 1292013126 6262 80.91.229.12 (10 Dec 2010 20:32:06 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Fri, 10 Dec 2010 20:32:06 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Dec 10 21:32:03 2010 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1PR9dK-0001ig-U8 for ged-emacs-devel@m.gmane.org; Fri, 10 Dec 2010 21:32:03 +0100 Original-Received: from localhost ([127.0.0.1]:40054 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PR9dK-00061l-5i for ged-emacs-devel@m.gmane.org; Fri, 10 Dec 2010 15:32:02 -0500 Original-Received: from [140.186.70.92] (port=60834 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PR9dB-00061S-KS for emacs-devel@gnu.org; Fri, 10 Dec 2010 15:31:58 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PR9dA-0003m0-Ck for emacs-devel@gnu.org; Fri, 10 Dec 2010 15:31:53 -0500 Original-Received: from ironport2-out.teksavvy.com ([206.248.154.183]:12367 helo=ironport2-out.pppoe.ca) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PR9dA-0003ls-8u for emacs-devel@gnu.org; Fri, 10 Dec 2010 15:31:52 -0500 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmYOAEsdAk3O+KIs/2dsb2JhbACVZ40MgRp5v16FSgSEZI4F X-IronPort-AV: E=Sophos;i="4.59,326,1288584000"; d="scan'208";a="85134467" Original-Received: from 206-248-162-44.dsl.teksavvy.com (HELO ceviche.home) ([206.248.162.44]) by ironport2-out.pppoe.ca with ESMTP/TLS/ADH-AES256-SHA; 10 Dec 2010 15:31:51 -0500 Original-Received: by ceviche.home (Postfix, from userid 20848) id 12E476616B; Fri, 10 Dec 2010 15:31:51 -0500 (EST) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:133586 Archived-At: Some major modes currently do things like (defun my-mode () ... (kill-all-local-variables) ... (run-mode-hooks 'my-mode-hook) ...set up some more vars...) The "set up some more vars" code is there because those vars may depend on some other vars that are likely to be changed by the user in the my-mode-hook. This is actually a hack. It works in some cases but has several downsides, such as: - can't use define-derived-mode to define such a mode. - can't derive from this mode since the "set up some more vars" would then be run before the child mode hook. - does not react properly to file-local variable settings. Currently, the best fix I know is to do: (define-derived-mode my-mode nil "My" ... (add-hook 'hack-local-variables-hook (lambda () ...set up some more vars...) nil t)) but this also has some downsides: - hack-local-variables-hook is not run if enable-local-variables is nil. - hack-local-variables-hook is not run for non-file-modes (e.g. comint modes) or when the user does M-x my-mode RET Another option is to use something like after-change-major-mode-hook. But that one tends to be called before file-local vars. I'd like to find a good solution to this problem. I think part of the solution is to make it so that M-x my-mode RET will also run hack-local-variables. My current idea is to try and make it so that, just before running after-change-major-mode-hook, we either call hack-local-variables or hack-dir-local-variables-non-file-buffer. Stefan