19

I have written a few nearly identical functions, except for their names. For example:

; x is name, such as function/paragraph/line/etc.
(defun my-x-function
 (interactive)
 (mark-x) (do-more-stuff) (modify-x))

Is there a way to automatically generate such functions? I have a feeling this is what macros do, but I am not sure how to use them. Any help, maybe including a small example would be great.

Thanks!

user1404316
  • 463
  • 6
  • 11
Anycorn
  • 50,217
  • 42
  • 167
  • 261

2 Answers2

23

Yep, that's exactly what macros do. Here's a straightforward macro that builds functions according to the pattern you specified:

(defmacro make-my-function (name)
  (list 'defun (intern (format "my-%s-function" name)) ()
        (list 'interactive)
        (list (intern (format "mark-%s" name)))
        (list 'do-more-stuff)
        (list (intern (format "modify-%s" name)))))

You can copy this macro to a *scratch* buffer in Emacs and evaluate it, and then check that it works like this:

(make-my-function x) ; type control-J here
my-x-function ; <-- Emacs's output
(symbol-function 'my-x-function) ; type control-J here
(lambda nil (interactive) (mark-x) (do-more-stuff) (modify-x)) ; <-- Emacs's output

More commonly one would use the backquote facility to write macros more concisely, but all macros essentially work in the same manner as the above example.

Sean
  • 29,130
  • 4
  • 80
  • 105
3

Macros can do that, but there are lots of template modules for emacs to do similar work. I use a thing called yasnippet.el to do quick code-generation things. For example, in a C-source file, if I type for<TAB>, I get a for loop template; it allows me to fill in the template, setting the variable name, limits, and internal loop contents.

looks like this:

alt text

You can set up templates for anything you like. Function definitions, if statements, switch statements, whatever. Set up different templates for different modes. The template for a for loop in C is different than the template for a for loop in C#, and so on. Very handy.

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Cheeso
  • 189,189
  • 101
  • 473
  • 713
  • yasnippet is great, but might not necessarily be the same thing. Macro is ambiguous, because emacs has *keyboard macros* which replicate typing or *lisp macros* which alter the code tree; yasnippet is more helpful mainly if he has to enter a set of boilerplate that can't be abstracted out (which is more true of C/C++ than Lisp.) – Skrylar May 27 '15 at 17:30