How to add a hook to only run in a particular mode?

后端 未结 2 1459
日久生厌
日久生厌 2020-12-24 02:07

I have the following defun

(defun a-test-save-hook()
  \"Test of save hook\"
  (message \"banana\")
  )

that I use via the following hook

相关标签:
2条回答
  • 2020-12-24 02:20

    If you take a look at the documentation for add-hook (or C-h f add-hook RET), you'll see that one possible solution is to make the hook local to the major modes you want. This is slightly more involved than vderyagin's answer, and looks like this:

    (add-hook 'org-mode-hook 
              (lambda () 
                 (add-hook 'after-save-hook 'a-test-save-hook nil 'make-it-local)))
    

    The 'make-it-local is the flag (can be anything that isn't nil) that tells add-hook to add the hook only in the current buffer. With the above, you'll only get the a-test-save-hook added in org-mode.

    This is nice if you want to use a-test-save-hook in more than one mode.

    The documentation for add-hook is:

    add-hook is a compiled Lisp function in `subr.el'.
    
    (add-hook HOOK FUNCTION &optional APPEND LOCAL)
    
    Add to the value of HOOK the function FUNCTION.
    FUNCTION is not added if already present.
    FUNCTION is added (if necessary) at the beginning of the hook list
    unless the optional argument APPEND is non-nil, in which case
    FUNCTION is added at the end.
    
    The optional fourth argument, LOCAL, if non-nil, says to modify
    the hook's buffer-local value rather than its default value.
    This makes the hook buffer-local if needed, and it makes t a member
    of the buffer-local value.  That acts as a flag to run the hook
    functions in the default value as well as in the local value.
    
    HOOK should be a symbol, and FUNCTION may be any valid function.  If
    HOOK is void, it is first set to nil.  If HOOK's value is a single
    function, it is changed to a list of functions.
    
    0 讨论(0)
  • 2020-12-24 02:26

    Simplest solution, i suppose, is to add major-mode checking in the hook itself:

    (defun a-test-save-hook()
      "Test of save hook"
      (when (eq major-mode 'org-mode)
        (message "banana")))
    
    (add-hook 'after-save-hook 'a-test-save-hook)
    
    0 讨论(0)
提交回复
热议问题