Have you ever been in a situation where you repeat the same sequence of commands over and over again. Then Keyboard Macros are for you.

Using Keyboard Macros you can build complex commands that fit your specific needs and you can do this without any iota of proficiency with the Emacs Lisp programming language.

A simple and stupid Usecase: Insert a Horizontal Line

For the sake of this article, let us pretend that you are in the habit of collecting memorable quotes and you separate the quotes in your file with a horizontal line. Here is a sample of your fortune file, say fortune.txt :

You are dishonest, but never to the point of hurting a friend. -------------------------------------------------------------------------------- Be careful! UGLY strikes 9 out of 10! -------------------------------------------------------------------------------- They have been at a great feast of languages, and stolen the scraps. -- William Shakespeare, "Love's Labour's Lost" -------------------------------------------------------------------------------- Living your life is a task so difficult, it has never been attempted before. -------------------------------------------------------------------------------- Q: How many Bell Labs Vice Presidents does it take to change a light bulb? A: That's proprietary information. Answer available from AT&T on payment of license fee (binary only). -------------------------------------------------------------------------------- "You have been in Afghanistan, I perceive." -- Sir Arthur Conan Doyle, "A Study in Scarlet" --------------------------------------------------------------------------------

You love collecting the quotes, but you hate typing out all those 80 hyphen characters. You now have a repetitive task and you want to automate this task by programming your Emacs. You can accomplish this using Keyboard Macros .

Preparatory Step: Add Macro commands to Menu

The stock Emacs doesn’t come with a menu for recording and re-playing keyboard macros. As a preparatory step, we will create this menu.

Copy the snippet below to your .emacs , and restart your Emacs.

(easy-menu-define kmacro-menu nil "Keyboard Macro Menu." '("Keyboard Macro" ["Universal Argument" universal-argument :help "Begin a numeric argument for the following command."] "--" ["Start Macro" kmacro-start-macro :help "Record subsequent keyboard input, defining a keyboard macro."] ["End Macro" kmacro-end-macro :help "Finish defining a keyboard macro."] ["End And Call Macro" kmacro-end-and-call-macro :help "Call last keyboard macro, ending it first if currently being defined."] "--" ["Kmacro Bind To Key" kmacro-bind-to-key :help "When not defining or executing a macro, offer to bind last macro to a key."] ["Name Last Macro" kmacro-name-last-macro :help "Assign a name to the last keyboard macro defined."] ["Insert Macro" insert-kbd-macro :help "Insert in buffer the definition of kbd macro MACRONAME, as Lisp code."] )) (easy-menu-add-item menu-bar-tools-menu nil kmacro-menu "grep")

Once you restart your Emacs, you should see the menu items for Keyboard Macros .

Start Recording the Macro

Compose your Macro

Play the following keystrokes C-u 8 0 - This inserts 80 numbers of hyphen characters in the current buffer.

Stop Recording the Macro

Run the above recorded Macro

At this point, you have created a macro for inserting a horizontal line. Now whenever you want to create an horizontal line, just run this recorded macro. Note that you are re-playing the recently recorded macro, whatever that may be. Consequently, if you were to record a new macro, the same re-play command will behave differently. This is because it is now running the newly recorded macro and not the old one. So long as you don’t need a new macro, or need a macro for future sessions, replaying the last recorded macro is all you need. However there are occasions where you want more than one macro and you want them across sessions. This is where naming your macro, binding it to it’s own key and saving it in your .emacs becomes a necessity.

Give your Macro a Name

You can give the macro a name, say insert-horizontal-line .

Congrats!!! You have created your own custom edit command

Once you have given your macro a name, you can invoke it with M-x ... , just like any other regular command. In the present case, you have created a custom command insert-horizontal-line which you can invoke with M-x insert-horizontal-line .

Save it for future use

Now that you have created a command, you can save it for future use by storing it in your .emacs .

Here is the Emacs Lisp snippet created by your Emacs.

(fset 'insert-horizontal-line (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([(menu-bar) tools Keyboard\ Macro Universal\ Argument (menu-bar) tools Keyboard\ Macro Universal\ Argument 56 48 45] 0 "%d")) arg)))

Bind your macro to a custom key sequence

You can bind the macro to a key sequence. Emacs recommends that keyboard macros be bound to key sequences starting with C-x C-k , and ending with one of the digits 0 through 9 or one of the uppercase letters A through Z . You can bind your macro to say H . Whenever you need to create a horizontal line, all you need to do is type C-x C-k H .

Concluding Words

There are many more commands for working with Keyboard Macros . However, for most situations, a working knowledge of the steps introduced here is all you would need.