From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Eric Abrahamsen Newsgroups: gmane.emacs.help Subject: Re: Adding and running a major mode hook Date: Sun, 27 Apr 2014 11:12:50 +0800 Message-ID: <87wqebwjm5.fsf@ericabrahamsen.net> References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1398568225 1582 80.91.229.3 (27 Apr 2014 03:10:25 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 27 Apr 2014 03:10:25 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Sun Apr 27 05:10:18 2014 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1WeFTu-0008PP-H0 for geh-help-gnu-emacs@m.gmane.org; Sun, 27 Apr 2014 05:10:18 +0200 Original-Received: from localhost ([::1]:37838 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WeFTt-0006yY-Ls for geh-help-gnu-emacs@m.gmane.org; Sat, 26 Apr 2014 23:10:17 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:46746) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WeFTa-0006mD-7O for help-gnu-emacs@gnu.org; Sat, 26 Apr 2014 23:10:05 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WeFTS-0002yr-Mz for help-gnu-emacs@gnu.org; Sat, 26 Apr 2014 23:09:58 -0400 Original-Received: from plane.gmane.org ([80.91.229.3]:53897) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WeFTS-0002yn-Ft for help-gnu-emacs@gnu.org; Sat, 26 Apr 2014 23:09:50 -0400 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1WeFTQ-0007gS-BO for help-gnu-emacs@gnu.org; Sun, 27 Apr 2014 05:09:48 +0200 Original-Received: from 114.248.6.105 ([114.248.6.105]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 27 Apr 2014 05:09:48 +0200 Original-Received: from eric by 114.248.6.105 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 27 Apr 2014 05:09:48 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 83 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: 114.248.6.105 User-Agent: Gnus/5.13001 (Ma Gnus v0.10) Emacs/24.3 (gnu/linux) Cancel-Lock: sha1:yIttpwJrcZaITVphUPOLsOrevNw= X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 80.91.229.3 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:97391 Archived-At: Jacob Gerlach writes: > I think that a hook is the right way for me to allow users some customization in my major mode. > > I have a list that is used to create font lock constructs, and I'd like to allow users to add to that list before my code processes it into font lock constructs. > > What I have now is basically: > > (setq content-list...) > > (mapc 'create-constructs content-list) > > What I've tried to do is > > (setq content-list ...) > > (defvar add-user-content-hook nil) > (defun add-user-content (input) > (add-hook 'add-user-content-hook > (lambda () (add-to-list 'content-list input)))) > > (run-hooks 'add-user-content-hook) > > (mapc 'create-constructs content-list) > > With the intention that users put something like > > (add-user-content '("my content")) > > in their .emacs > > This code doesn't generate any errors, but it doesn't work either. > > Reading about hooks in the documentation makes me think that I have a conceptual misunderstanding about the manner and sequence in which code in mymode.el is executed. Specifically, what is the difference between putting (run-hooks... in (define-derived-mode ... vs putting (run-hooks... somewhere in the mode's code (as I have done above)? If you've got the run-hooks inside the mode declaration, then the hooks won't run until the user activates the mode in some particular buffer. They will then run *every* time your mode is activated. If you've got it at the top level of the file, the hooks will run once, *while* the file is being loaded for the first time: ie quite likely during emacs startup, possibly before the user's relevant customization is loaded, probably before any relevant file are opened. They won't run again later, when the user calls `add-user-content', because all `add-user-content' does is add to the hook, it doesn't run the hook again. You'd have to reload the file for that. >From what I can see from your examples above, it might be enough just to have: (defvar content-list '(default values)) (define-derived-mode 'your-mode .... (mapc 'create-constructs content-list) (defun add-user-content (input) (add-to-list 'content-list input)) Without any hooks at all. When the file is loaded, these functions are defined, but no constructs are created. After the file is loaded, the user's customizations are loaded, including possible calls to `add-user-content', which put new values into `content-list'. Then, *every time* the user activates this mode, constructs are created out of whatever's in `content-list'. Now your new problem is, do you want new constructs created every time the mode is activated? Will that create duplicate/extraneous constructs? I don't actually know much about font constructs, so maybe this is how it's supposed to work to begin with. Anyway, if you do go the hook route, remember that it won't make much sense to call `run-hooks' at the top level of the file. That's pretty much always done in the mode declaration, or in other functions. Hooks are meant to store functions to be run later, when something else happens. If you put it at the top level of the file, it will only happen on load, in which case you might as well just call whatever the function is directly. Hope that didn't make it worse, Eric