Skip to main content

C'est la Z

Learning Elisp 14 - defining a minor mode

Another short one today. We're taking the code we already wrote and making a minor mode out of it.

In Emacs, a minor mode is a set of functionality that you can turn on (or off) in a buffer (or globally). For example, the built in auto-fill-mode can be turned on in a buffer will automatically add newlines when your line gets "too long." You can see the modes that you currently have on using the describe-mode function, usually bound to C-h m. I also currently have Hungry-Delete mode as well as Flyspell and a few others. Hungry-Delete automatically deletes multiple whitespace characters all at once so if I have five spaces between words, I can just delete or kill once and they'll all go away. Flyspell adds auto spell checking.

Minor modes can be turned on manually using M-x whatever-mode command which toggles whatever mode on and off or automatically based on hooks. For example, when you load a C file, I go into c mode which is a major mode (more about them some other time) as well as these minor modes:

  • Auto-Save
  • Corfu
  • Eglot–Managed
  • Eldoc
  • Flymake
  • Font-Lock
  • Hungry-Delete
  • Yas

Here's specific code we go over in the video to turn on and off our new mode:

(define-minor-mode emoji-replace-mode
  "fill in the docstring later"
  :lighter " ER"
  (if emoji-replace-mode
      (add-hook 'after-change-functions #'emoji-replace-insert nil t)
    (remove-hook 'after-change-functions #'emoji-replace-insert)))

The macro define-minor-mode does all the magic. The key is that it defines a "mode variable" - in this case named emoji-replace-mode which tells us if we're turning the mode on or off. Based on that, we either add or remove our hook. The :lighter " ER" sets what to show in the mode line.

We're just scratching the surface today - just setting up the basics. Later we'll see how to clean up the variables we need for the mode - specifically our list of emojis as well as how we can select either of our emoji replacement methods - overlay a text property or replace the text. We'll also see about setting up key combos for a mode in our next elisp project.

That's it for today.

Enjoy.

Code:

The code for the series is still up here:

comments powered by Disqus