Computer Laboratory

1. Introduction

This page talks about various topics relevant to adapting the behaviour of emacs in minor ways. All kinds of customisations affect only the particular emacs session that you do them in. They are completely lost when you kill the emacs session, and have no effect on other emacs sessions you may run at the same time or later. The only way to make a customisation permanent is to put something in your .emacs file. There are two ways to do this: hand editing (which does unfortunately require some minimal knowledge of emacs LISP in order to do anything ambitious), and (from version 20 onwards) through the Custom feature.

This page is written purely for emacs, parts of it may happen also to apply to Xemacs. This page does assume some minimal familiarity with emacs, for example that C-h v means press Control-h followed by v. NB. emacs is installed as gnuemacs on some systems.

Large parts of this page have been shamelessly pinched from the Emacs customisation manual pages which should continue to be considered the definitive source. Throughout references to The Emacs Manual means the online pages : in a emacs session select the Help menu, then Manuals, then Browse Manuals with Info, then Emacs.

2. Hand Editing

2.1 The Init File, ~/.emacs

When emacs is started, it normally loads a Lisp program from the file .emacs in your home directory. You can use the command line switches -q and -u to tell emacs whether to load an init file, and which one.

If you have a large amount of code in your .emacs file, you should move it into another file such as ~/something.el, byte-compile it (see the Emacs manual for details), and make your .emacs file load it with the entry (load "~/something").

2.2 Init File Syntax

The .emacs file contains one or more Lisp function call expressions. Each of these consists of a function name followed by arguments, all surrounded by parentheses. For example, (setq fill-column 60) calls the function setq to set the variable fill-column to 60.

The second argument to setq is an expression for the new value of the variable. This can be a constant, a variable, or a function call expression. In .emacs, constants are used most of the time. They can be:

Numbers are written in decimal, with an optional initial minus sign.

Lisp string syntax is the same as C string syntax with a few extra features. Use a double-quote character to begin and end a string constant.

In a string, you can include newlines and special characters literally. But often it is cleaner to use backslash sequences for them: \n for newline, \b for backspace, \r for carriage return, \t for tab, \f for formfeed (control-L), \e for escape, \\ for a backslash, \" for a double-quote, or \ooo for the character whose octal code is ooo. Backslash and double-quote are the only characters for which backslash sequences are mandatory.

\C- can be used as a prefix for a control character, as in \C-s for ASCII control-S, and \M- can be used as a prefix for a Meta character, as in \M-a for Meta-A or \M-\C-a for Control-Meta-A.

Lisp character constant syntax consists of a ? followed by either a character or an escape sequence starting with \. Examples: ?x, ?\n, ?\", ?\). Note that strings and characters are not interchangeable in Lisp; some contexts require one and some contexts require the other.

t stands for true.

nil stands for false.

Other Lisp objects:
Write a single-quote (') followed by the Lisp object you want.

2.2.1 Init File Examples

Here are some examples of doing certain commonly desired things with Lisp expressions. They make use of variables, hooks, and other features explained in subsequent sections. There are a lot more such examples at the Emacs Recipes page.

  • Make TAB in C mode just insert a tab if point is in the middle of a line.

    (setq c-tab-always-indent nil)

    Here we have a variable whose value is normally t for true and the alternative is nil for false.

  • Make searches case sensitive by default (in all buffers that do not override this).

    (setq-default case-fold-search nil)

    This sets the default value, which is effective in all buffers that do not have local values for the variable. Setting case-fold-search with setq affects only the current buffers local value, which is not what you probably want to do in an init file.

  • Specify your own email address, if emacs can't figure it out correctly.

    (setq user-mail-address "[Javascript required]")

    Various emacs packages that need your own email address use the value of user-mail-address.

  • Make Text mode the default mode for new buffers.

    (setq default-major-mode 'text-mode)

    Note that text-mode is used because it is the command for entering Text mode. The single-quote before it makes the symbol a constant; otherwise, text-mode would be treated as a variable name.

  • Turn on Auto Fill mode automatically in Text mode and related modes.

    (add-hook 'text-mode-hook
      '(lambda () (auto-fill-mode 1)))

    This shows how to add a hook function (see section 2.4 Hooks) to a normal hook variable. The function we supply is a list starting with lambda, with a single-quote in front of it to make it a list constant rather than an expression.

    It's beyond the scope of this page to explain Lisp functions, but for this example it is enough to know that the effect is to execute (auto-fill-mode 1) when Text mode is entered. You can replace that with any other expression that you like, or with several expressions in a row.

    emacs comes with a function named turn-on-auto-fill whose definition is (lambda () (auto-fill-mode 1)). Thus, a simpler way to write the above example is as follows:

    (add-hook 'text-mode-hook 'turn-on-auto-fill)

  • Load the installed Lisp library named foo (actually a file foo.elc or foo.el in a standard emacs directory).

    (load "foo")

    When the argument to load is a relative file name, not starting with / or ~, load searches the directories in load-path.

  • Load the compiled Lisp file foo.elc from your home directory.

    (load "~/foo.elc")

    Here an absolute file name is used, so no searching is done.

  • Rebind the key C-x l to run the function make-symbolic-link.

    (global-set-key "\C-xl" 'make-symbolic-link)


    (define-key global-map "\C-xl" 'make-symbolic-link)

    Note once again the single-quote used to refer to the symbol make-symbolic-link instead of its value as a variable.

  • Do the same thing for Lisp mode only.

    (define-key lisp-mode-map "\C-xl" 'make-symbolic-link)

  • Redefine all keys which now run next-line in Fundamental mode so that they run forward-line instead.

    (substitute-key-definition 'next-line 'forward-line

  • Make C-x C-v undefined.

    (global-unset-key "\C-x\C-v")

    One reason to undefine a key is so that you can make it a prefix. Simply defining C-x C-v anything will make C-x C-v a prefix, but C-x C-v must first be freed of its usual non-prefix definition.

  • Make $ have the syntax of punctuation in Text mode. Note the use of a character constant for $.

    (modify-syntax-entry ?\$ "." text-mode-syntax-table)

  • Enable the use of the command eval-expression without confirmation.

    (put 'eval-expression 'disabled nil)

2.3 Variables

A variable is a Lisp symbol which has a value. The symbol's name is also called the name of the variable. A variable name can contain any characters that can appear in a file, but conventionally variable names consist of words separated by hyphens. A variable can have a documentation string which describes what kind of value it should have and how the value will be used.

Lisp allows any variable to have any kind of value, but most variables that emacs uses require a value of a certain type. Often the value should always be a string, or should always be a number. Sometimes we say that a certain feature is turned on if a variable is "non-nil," meaning that if the variables value is nil, the feature is off, but the feature is on for any other value. The conventional value to use to turn on the feature - since you have to pick one particular value when you set the variable - is t.

emacs uses many Lisp variables for internal record keeping, as any Lisp program must, but the most interesting variables for you are the ones that exist for the sake of customisation. emacs does not (usually) change the values of these variables; instead, you set the values, and thereby alter and control the behaviour of certain emacs commands. These variables are called user options.

One example of a variable which is a user option is fill-column, which specifies the position of the right margin (as a number of characters from the left margin) to be used by the fill commands.

2.3.1 Examining and Setting Variables

C-h v var RET
Display the value and documentation of variable var (describe-variable).
M-x set-variable RET var RET value RET
Change the value of variable var to value.

To examine the value of a single variable, use C-h v (describe-variable), which reads a variable name using the minibuffer, with completion. It displays both the value and the documentation of the variable. For example,

C-h v fill-column RET

displays something like this:

fill-column's value is 75

*Column beyond which automatic line-wrapping should happen.
Automatically becomes buffer-local when set in any fashion.

You can customize this variable.

The star at the beginning of the documentation indicates that this variable is a user option. C-h v is not restricted to user options; it allows any variable name. The last line allows access to the automatic customisation feature - see section 3. The Custom feature.

The most convenient way to set a specific user option is with M-x set-variable. This reads the variable name with the minibuffer (with completion), and then reads a Lisp expression for the new value using the minibuffer a second time. For example,

M-x set-variable RET fill-column RET 75 RET

sets fill-column to 75.

M-x set-variable is limited to user option variables. You can set any variable with a Lisp expression using the function setq. Here's how to use it to set fill-column:

(setq fill-column 75)

Setting variables, like all means of customising emacs except where otherwise stated, affects only the current emacs session.

2.3.2 Editing Variable Values

These two functions make it easy to display all the emacs user option variables, and to change some of them if you wish:

M-x list-options
Display a buffer listing names, values and documentation of all options.
M-x edit-options
Change user option values by editing a list of user option variables. (The Custom feature is intended to make this obsolete. See section 3. The Custom feature.)

M-x list-options displays a list of all emacs option variables, in an emacs buffer named *List Options*. Each user option is shown with its documentation and its current value. Here is what a portion of it might look like:

;; exec-path:
("." "/usr/local/bin" "/usr/ucb" "/bin" "/usr/bin" "/u2/emacs/etc")
*List of directories to search programs to run in subprocesses.
Each element is a string (directory name)
or nil (try the default directory).
;; fill-column:
*Column beyond which automatic line-wrapping should happen.
Automatically becomes buffer-local when set in any fashion.

M-x edit-options goes one step further and immediately selects the *List Options* buffer; this buffer uses the major mode Options mode, which provides commands that allow you to point at a user option variable and change its value:

Set the variable point is in or near to a new value read using the minibuffer.
Toggle the variable point is in or near: if the value was nil, it becomes t; otherwise it becomes nil.
Set the variable point is in or near to t.
Set the variable point is in or near to nil.
Move to the next or previous user option.

Any changes take effect immediately, and last until you exit from emacs.

2.4 Hooks

A hook is a variable where you can store a function or functions to be called on a particular occasion by an existing program. emacs provides a number of hooks for the sake of customisation. Most major modes run hooks as the last step of initialisation. This makes it easy for a user to customize the behaviour of the mode, by overriding the local variable assignments already made by the mode. But hooks may also be used in other contexts. For example, the hook suspend-hook runs just before emacs suspends itself.

Most of the hooks in emacs are normal hooks. These variables contain lists of functions to be called with no arguments. The reason most hooks are normal hooks is so that you can use them in a uniform way. Every variable in emacs whose name ends in -hook is a normal hook.

The recommended way to add a hook function to a normal hook is by calling add-hook. You can use any valid Lisp function as the hook function. For example, here's how to set up a hook to turn on Auto Fill mode when entering Text mode and other modes based on Text mode:

(add-hook 'text-mode-hook 'turn-on-auto-fill)

The next example shows how to use a hook to customise the indentation of C code. (People often have strong personal preferences for one format compared to another.) Here the hook function is an anonymous lambda expression.

(setq my-c-style
  '((c-comment-only-line-offset . 4)
    (c-cleanup-list . (scope-operator
    (c-offsets-alist . ((arglist-close . c-lineup-arglist)
			(substatement-open . 0)))))

(add-hook 'c-mode-common-hook
  (function (lambda ()
    (c-add-style "my-style" my-c-style t))))

It is best to design your hook functions so that the order in which they are executed does not matter. Any dependence on the order is "asking for trouble." However, the order is predictable: the most recently added hook functions are executed first.

2.5 Customising Key Bindings

This section describes key bindings which map keys to commands, and the keymaps which record key bindings. It also explains how to customise key bindings.

2.5.1 Keymaps

The bindings between key sequences and command functions are recorded in data structures called keymaps. emacs has many of these, each used on particular occasions. A key sequence (key, for short) is a sequence of input events that have a meaning as a unit. Input events include characters, function keys and mouse buttons - all the inputs that you can send to the computer with your terminal. A key sequence gets its meaning from its binding, which says what command it runs. The function of keymaps is to record these bindings.

The global keymap is the most important keymap because it is always in effect. The global keymap defines keys for Fundamental mode; most of these definitions are common to most or all major modes. Each major or minor mode can have its own keymap which overrides the global definitions of some keys.

For example, a self-inserting character such as g is self-inserting because the global keymap binds it to the command self-insert-command. The standard emacs editing characters such as C-a also get their standard meanings from the global keymap. Commands to rebind keys, such as M-x global-set-key, actually work by storing the new binding in the proper place in the global map.

Meta characters work differently; emacs translates each Meta character into a pair of characters starting with ESC. When you type the character M-a in a key sequence, emacs replaces it with ESC a. A meta key comes in as a single input event, but becomes two events for purposes of key bindings. The reason for this is historical.

Most modern keyboards have function keys as well as character keys. Function keys send input events just as character keys do, and keymaps can have bindings for them. On many terminals, typing a function key actually sends the computer a sequence of characters; the precise details of the sequence depends on which function key and on the model of terminal you are using. If emacs understands your terminal type properly, it recognises the character sequences forming function keys wherever they occur in a key sequence (not just at the beginning). Thus, for most purposes, you can pretend the function keys reach emacs directly and ignore their encoding as character sequences.

Mouse buttons also produce input events. These events come with other data - the window and position where you pressed or released the button, and a time stamp. But only the choice of button matters for key bindings; the other data matters only if a command looks at it. (Commands designed for mouse invocation usually do look at the other data.)

A keymap records definitions for single events. Interpreting a key sequence of multiple events involves a chain of keymaps. The first keymap gives a definition for the first event; this definition is another keymap, which is used to look up the second event in the sequence, and so on.

As a user, you can redefine any key; but it might be best to stick to key sequences that consist of C-c followed by a letter. These keys are "reserved for users", so they wont conflict with any properly designed emacs extension. If you redefine some other key, your definition may be overridden by certain extensions or major modes which redefine the same key.

2.5.2 Prefix Keymaps

A prefix key such as C-x or ESC has its own keymap, which holds the definition for the event that immediately follows that prefix.

The definition of a prefix key is usually the keymap to use for looking up the following event. The definition can also be a Lisp symbol whose function definition is the following keymap; the effect is the same, but it provides a command name for the prefix key that can be used as a description of what the prefix key is for. Thus, the binding of C-x is the symbol Ctl-X-Prefix, whose function definition is the keymap for C-x commands. The definitions of C-c, C-x, C-h and ESC as prefix keys appear in the global map, so these prefix keys are always available.

Aside from ordinary prefix keys, there is a fictitious "prefix key" which represents the menu bar. Mouse button events that invoke pop-up menus are also prefix keys.

Some prefix keymaps are stored in variables with names:

  • ctl-x-map is the variable name for the map used for characters that follow C-x.
  • help-map is for characters that follow C-h.
  • esc-map is for characters that follow ESC. Thus, all Meta characters are actually defined by this map.
  • ctl-x-4-map is for characters that follow C-x 4.
  • mode-specific-map is for characters that follow C-c.

2.5.3 Local Keymaps

Major modes customise emacs by providing their own key bindings in local keymaps. For example, C mode overrides TAB to make it indent the current line for C code. Portions of text in the buffer can specify their own keymaps to substitute for the keymap of the buffers major mode.

Minor modes can also have local keymaps. Whenever a minor mode is in effect, the definitions in its keymap override both the major modes local keymap and the global keymap.

The local keymaps for Lisp mode and several other major modes always exist even when not in use. These are kept in variables named lisp-mode-map and so on. For major modes less often used, the local keymap is normally constructed only when the mode is used for the first time in a session. This is to save space. If you wish to change one of these keymaps, you must use its mode hook.

All minor mode keymaps are created in advance. There is no way to defer their creation until the first time the minor mode is enabled.

A local keymap can locally redefine a key as a prefix key by defining it as a prefix keymap. If the key is also defined globally as a prefix, then its local and global definitions (both keymaps) effectively combine: both of them are used to look up the event that follows the prefix key. Thus, if the modes local keymap defines C-c as another keymap, and that keymap defines C-z as a command, this provides a local meaning for C-c C-z. This does not affect other sequences that start with C-c; if those sequences don't have their own local bindings, their global bindings remain in effect.

Another way to think of this is that emacs handles a multi-event key sequence by looking in several keymaps, one by one, for a binding of the whole key sequence. First it checks the minor mode keymaps for minor modes that are enabled, then it checks the major modes keymap, and then it checks the global keymap. This is not precisely how key lookup works, but its good enough for understanding ordinary circumstances.

To change the local bindings of a major mode, you must change the modes local keymap. Normally you must wait until the first time the mode is used, because most major modes don't create their keymaps until then. If you want to specify something in your ~/.emacs file to change a major modes bindings, you must use the modes mode hook to delay the change until the mode is first used.

For example, the command texinfo-mode to select Texinfo mode runs the hook texinfo-mode-hook. Here's how you can use the hook to add local bindings (not very useful, we admit) for C-c n and C-c p in Texinfo mode:

(add-hook 'texinfo-mode-hook
          '(lambda ()
             (define-key texinfo-mode-map
             (define-key texinfo-mode-map

2.5.4 Minibuffer Keymaps

The minibuffer has its own set of local keymaps; they contain various completion and exit commands.

  • minibuffer-local-map is used for ordinary input (no completion).
  • minibuffer-local-ns-map is similar, except that SPC exits just like RET. This is used mainly for Mocklisp compatibility.
  • minibuffer-local-completion-map is for permissive completion.
  • minibuffer-local-must-match-map is for strict completion and for cautious completion.

2.5.5 Changing Key Bindings Interactively

The way to redefine an emacs key is to change its entry in a keymap. You can change the global keymap, in which case the change is effective in all major modes (except those that have their own overriding local definitions for the same key). Or you can change the current buffers local map, which affects all buffers using the same major mode.

M-x global-set-key RET key cmd RET
Define key globally to run cmd.
M-x local-set-key RET key cmd RET
Define key locally (in the major mode now in effect) to run cmd.
M-x global-unset-key RET key
Make key undefined in the global map.
M-x local-unset-key RET key
Make key undefined locally (in the major mode now in effect).

For example, suppose you like to execute commands in a subshell within an emacs buffer, instead of suspending emacs and executing commands in your login shell. Normally, C-z is bound to the function suspend-emacs (when not using the X Window System), but you can change C-z to invoke an interactive subshell within emacs, by binding it to shell as follows:

M-x global-set-key RET C-z shell RET

global-set-key reads the command name after the key. After you press the key (ie C-z), a message like this appears so that you can confirm that you are binding the key you want:

Set key C-z to command: 

You can redefine function keys and mouse events in the same way; just type the function key or click the mouse when its time to specify the key to rebind.

You can rebind a key that contains more than one event in the same way. emacs keeps reading the key to rebind until it is a complete key (that is, not a prefix key). Thus, if you type C-f for key, thats the end; the minibuffer is entered immediately to read cmd. But if you type C-x, another character is read; if that is 4, another character is read, and so on. For example,

M-x global-set-key RET C-x 4 $ spell-other-window RET

redefines C-x 4 $ to run the (fictitious) command spell-other-window.

The two-character keys consisting of C-c followed by a letter are reserved for user customisation. Lisp programs are not supposed to define these keys, so the bindings you make for them will be available in all major modes and will never get in the way of anything.

You can remove the global definition of a key with global-unset-key. This makes the key undefined; if you type it, emacs will just beep. Similarly, local-unset-key makes a key undefined in the current major mode keymap, which makes the global definition (or lack of one) come back into effect in that major mode.

If you have redefined (or undefined) a key and you subsequently wish to retract the change, undefining the key will not do the job - you need to redefine the key with its standard definition. To find the name of the standard definition of a key, go to a Fundamental mode buffer and use C-h c. The documentation of keys in the Emacs manual also lists their command names.

If you want to prevent yourself from invoking a command by mistake, it is better to disable the command than to undefine the key (see section 2.8 Disabling Commands). A disabled command is less work to invoke when you really want to.

2.5.6 Rebinding Keys in Your Init File

If you have a set of key bindings that you like to use all the time, you can specify them in your .emacs file by using their Lisp syntax.

The simplest method for doing this works for ASCII characters and Meta-modified ASCII characters only. This method uses a string to represent the key sequence you want to rebind. For example, here's how to bind C-z to shell:

(global-set-key "\C-z" 'shell)

This example uses a string constant containing one character, C-z. The single-quote before the command name, shell, marks it as a constant symbol rather than a variable. If you omit the quote, emacs would try to evaluate shell immediately as a variable. This probably causes an error; it certainly isn't what you want.

Here is another example that binds a key sequence two characters long:

(global-set-key "\C-xl" 'make-symbolic-link)

When the key sequence includes function keys or mouse button events, or non-ASCII characters such as C-= or H-a, you must use the more general method of rebinding, which uses a vector to specify the key sequence.

The way to write a vector in emacs Lisp is with square brackets around the vector elements. Use spaces to separate the elements. If an element is a symbol, simply write the symbols name - no other delimiters or punctuation are needed. If a vector element is a character, write it as a Lisp character constant: ? followed by the character as it would appear in a string.

Here are examples of using vectors to rebind C-= (a control character outside of ASCII), H-a (a Hyper character; ASCII doesn't have Hyper at all); f7 (a function key), and C-Mouse-1 (a keyboard-modified mouse button):

(global-set-key [?\C-=] 'make-symbolic-link)
(global-set-key [?\H-a] 'make-symbolic-link)
(global-set-key [f7] 'make-symbolic-link)
(global-set-key [C-mouse-1] 'make-symbolic-link)

You can use a vector for the simple cases too. Heres how to rewrite the first two examples, above, to use vectors:

(global-set-key [?\C-z] 'shell)

(global-set-key [?\C-x ?l] 'make-symbolic-link)

2.5.7 Rebinding Function Keys

Key sequences can contain function keys as well as ordinary characters. Just as Lisp characters (actually integers) represent keyboard characters, Lisp symbols represent function keys. If the function key has a word as its label, then that word is also the name of the corresponding Lisp symbol. Here are the conventional Lisp names for common function keys:

left, up, right, down
Cursor arrow keys.

begin, end, home, next, prior
Other cursor repositioning keys.

select, print, execute, backtab
insert, undo, redo, clearline
insertline, deleteline, insertchar, deletechar,
Miscellaneous function keys.

f1, f2, ... f35
Numbered function keys (across the top of the keyboard).

kp-add, kp-subtract, kp-multiply, kp-divide
kp-backtab, kp-space, kp-tab, kp-enter
kp-separator, kp-decimal, kp-equal
Keypad keys (to the right of the regular keyboard), with names or punctuation.

kp-0, kp-1, ... kp-9
Keypad keys with digits.

kp-f1, kp-f2, kp-f3, kp-f4
Keypad PF keys.

These names are conventional, but some systems (especially when using X windows) may use different names. To make certain what symbol is used for a given function key on your terminal, type C-h c followed by that key.

A key sequence which contains function key symbols (or anything but ASCII characters) must be a vector rather than a string. The vector syntax uses spaces between the elements, and square brackets around the whole vector. Thus, to bind function key f1 to the command rmail, write the following:

(global-set-key [f1] 'rmail)

To bind the right-arrow key to the command forward-char, you can use this expression:

(global-set-key [right] 'forward-char)

This uses the Lisp syntax for a vector containing the symbol right. (This binding is present in emacs by default.)

You can mix function keys and characters in a key sequence. This example binds C-x next to the command forward-page (on my keyboard, for example, next is actually the Keypad key marked 3 and Pg Dn).

(global-set-key [?\C-x next] 'forward-page)

where ?\C-x is the Lisp character constant for the character C-x. The vector element next is a symbol and therefore does not take a question mark.

You can use the modifier keys CTRL, META, HYPER, SUPER, ALT and SHIFT with function keys. To represent these modifiers, add the strings C-, M-, H-, s-, A- and S- at the front of the symbol name. Thus, here is how to make Shift-Meta-RIGHT move forward a word:

(global-set-key [S-M-right] 'forward-word)

2.6 Rebinding Mouse Buttons

emacs uses Lisp symbols to designate mouse buttons, too. The ordinary mouse events in emacs are click events; these happen when you press a button and release it without moving the mouse. You can also get drag events, when you move the mouse while holding the button down. Drag events happen when you finally let go of the button.

The symbols for basic click events are mouse-1 for the leftmost button, mouse-2 for the next, and so on. Here is how you can redefine the second mouse button to split the current window:

(global-set-key [mouse-2] 'split-window-vertically)

The symbols for drag events are similar, but have the prefix drag- before the word mouse. For example, dragging the first button generates a drag-mouse-1 event.

You can also define bindings for events that occur when a mouse button is pressed down. These events start with down- instead of drag-. Such events are generated only if they have key bindings. When you get a button-down event, a corresponding click or drag event will always follow.

If you wish, you can distinguish single, double, and triple clicks. A double click means clicking a mouse button twice in approximately the same place. The first click generates an ordinary click event. The second click, if it comes soon enough, generates a double-click event instead. The event type for a double click event starts with double-: for example, double-mouse-3.

This means that you can give a special meaning to the second click at the same place, but it must act on the assumption that the ordinary single click definition has run when the first click was received.

This constrains what you can do with double clicks, but user interface designers say that this constraint ought to be followed in any case. A double click should do something similar to the single click, only "more so". The command for the double-click event should perform the extra work for the double click.

If a double-click event has no binding, it changes to the corresponding single-click event. Thus, if you don't define a particular double click specially, it executes the single-click command twice.

emacs also supports triple-click events whose names start with triple-. emacs does not distinguish quadruple clicks as event types; clicks beyond the third generate additional triple-click events. However, the full number of clicks is recorded in the event list, so you can distinguish if you really want to. It is not recommended to set distinct meanings for more than three clicks, but sometimes it is useful for subsequent clicks to cycle through the same set of three meanings, so that four clicks are equivalent to one click, five are equivalent to two, and six are equivalent to three.

emacs also records multiple presses in drag and button-down events. For example, when you press a button twice, then move the mouse while holding the button, emacs gets a double-drag- event. And at the moment when you press it down for the second time, emacs gets a double-down- event (which is ignored, like all button-down events, if it has no binding).

The variable double-click-time specifies how long may elapse between clicks that are recognised as a pair. Its value is measured in milliseconds. If the value is nil, double clicks are not detected at all. If the value is t, then there is no time limit.

The symbols for mouse events also indicate the status of the modifier keys, with the usual prefixes C-, M-, H-, s-, A- and S-. These always precede double- or triple-, which always precede drag- or down-.

A frame includes areas that don't show text from the buffer, such as the mode line and the scroll bar. You can tell whether a mouse button comes from a special area of the screen by means of dummy "prefix keys." For example, if you click the mouse in the mode line, you get the prefix key mode-line before the ordinary mouse-button symbol. Thus, here is how to define the command for clicking the first button in a mode line to run scroll-up:

(global-set-key [mode-line mouse-1] 'scroll-up)

Here is the complete list of these dummy prefix keys and their meanings:

The mouse was in the mode line of a window.
The mouse was in the vertical line separating side-by-side windows. (If you use scroll bars, they appear in place of these vertical lines.)
The mouse was in a vertical scroll bar. (This is the only kind of scroll bar emacs currently supports.)

You can put more than one mouse button in a key sequence, but it isn't usual to do so.

2.7 Keyboard Translations

Some keyboards do not make it convenient to send all the special characters that emacs uses. The most common problem case is the DEL character. Some keyboards provide no convenient way to type this very important character - usually because they were designed to expect the character C-h to be used for deletion. On these keyboard, if you press the key normally used for deletion, emacs handles the C-h as a prefix character and offers you a list of help options, which is not what you want.

You can work around this problem within emacs by setting up keyboard translations to turn C-h into DEL and DEL into C-h, as follows:

;; Translate C-h to DEL.
(keyboard-translate ?\C-h ?\C-?)

;; Translate DEL to C-h.
(keyboard-translate ?\C-? ?\C-h)

Keyboard translations are not the same as key bindings in keymaps. emacs contains numerous keymaps that apply in different situations, but there is only one set of keyboard translations, and it applies to every character that emacs reads from the terminal. Keyboard translations take place at the lowest level of input processing; the keys that are looked up in keymaps contain the characters that result from keyboard translation.

Under X, the keyboard key named DELETE is a function key and is distinct from the ASCII character named DEL. Keyboard translations affect only ASCII character input, not function keys; thus, the above example used under X does not affect the DELETE key. However, the translation above isn't necessary under X, because emacs can also distinguish between the BACKSPACE key and C-h; and it normally treats BACKSPACE as DEL.

2.8 Disabling Commands

Disabling a command marks the command as requiring confirmation before it can be executed. The purpose of disabling a command is to prevent beginning users from executing it by accident and being confused.

An attempt to invoke a disabled command interactively in emacs displays a window containing the commands name, its documentation, and some instructions on what to do immediately; then emacs asks for input saying whether to execute the command as requested, enable it and execute it, or cancel. If you decide to enable the command, you are asked whether to do this permanently or just for the current session. Enabling permanently works by automatically editing your .emacs file.

The direct mechanism for disabling a command is to put a non-nil disabled property on the Lisp symbol for the command. Here is the Lisp program to do this:

(put 'delete-region 'disabled t)

If the value of the disabled property is a string, that string is included in the message printed when the command is used:

(put 'delete-region 'disabled
     "Its better to use kill-region instead.\n")

You can make a command disabled either by editing the .emacs file directly or with the command M-x disable-command, which edits the .emacs file for you. Likewise, M-x enable-command edits .emacs to enable a command permanently.

Whether a command is disabled is independent of what key is used to invoke it; disabling also applies if the command is invoked using M-x. Disabling a command has no effect on calling it as a function from Lisp programs.

3. The Custom Feature

The customisation feature is a powerful recent innovation which allows you to alter just about every alterable parameter associated with emacs, either permanently or just for the current session. It takes a little getting used to and the best way to learn how to use it is to try it out for yourself.

3.1 Customisation Groups

For customisation purposes, user options are organised into groups to help you find them. Groups are collected into bigger groups, all the way up to a master group called Emacs.

M-x customise creates a customisation buffer that shows the top-level Emacs group and the second-level groups immediately under it. It looks like this, in part (some items will appear in colour, and others - in square brackets - will change colour when the mouse pointer is moved over them):

    This is a customisation buffer for group Emacs.
    Square brackets show active fields; type RET or click mouse-1
    on an active field to invoke its action.  Editing an option value
    changes the text in the buffer; invoke the State button and
    choose the Set operation to set the option value.
    Invoke [Help] for more information.

    Operate on everything in this buffer:
     [Set for Current Session] [Save for Future Sessions]
     [Reset] [Reset to Saved] [Reset to Standard]   [Bury Buffer]

     /- Emacs group: ---------------------------------------------------\
           [State]: visible group members are all at standard settings.
        Customization of the One True Editor.
        See also [Manual].
     Editing group: [Go to Group]
     Basic text editing facilities.
     External group: [Go to Group]
     Interfacing to external utilities.
...more second level groups, down to ...
     \- Emacs group end ------------------------------------------------/
This says that the buffer displays the contents of the Emacs group. The other groups are listed because they are its contents. But they are listed differently, without indentation and dashes, because their contents are not included. Each group has a single-line documentation string; the Emacs group also has a [State] line.

Most of the text in the customisation buffer is read-only, but it typically includes some editable fields that you can edit. There are also active fields; this means a field that does something when you invoke it. To invoke an active field, either click on it with Mouse-1, or move point to it and type RET.

For example, the phrase [Go to Group] that appears in a second-level group is an active field. Invoking the [Go to Group] field for a group creates a new customisation buffer, which shows that group and its contents. This field is a kind of hypertext link to another group.

The Emacs group does not include any user options itself, but other groups do. By examining various groups, you will eventually find the options and faces that belong to the feature you are interested in customising. Then you can use the customisation buffer to set them. For example, clicking on [Go to Group] next to Editing group: changes the contents of the buffer to (minus some of the preamble):

Go to parent group: [Emacs]

/- Editing group: -------------------------------------------------------\
      [State]: visible group members are all at standard settings.
   Basic text editing facilities.

Killing group: [Go to Group] 
Killing and yanking commands

Indent group: [Go to Group] 
Indentation commands
...much more, down to...
\- Editing group end ---------------------------------------------------/
clicking on [Go to Group] next to Killing group: changes the contents of the buffer to (minus some of the preamble):
Go to parent group: [Editing]

/- Killing group: -------------------------------------------------------\
      [State]: visible group members are all at standard settings.
   Killing and yanking commands

Backward Delete Char Untabify Method: [Hide] [Value Menu] untabify
   [State]: this option is unchanged from its standard setting.
The method for untabifying when deleting backward. [More]

Kill Whole Line: [Hide] [Toggle]  off (nil)
   [State]: this option is unchanged from its standard setting.
If non-nil, `kill-line' with no arg at beg of line kills the whole line.

Kill Ring Max: [Hide] 60
   [State]: this option is unchanged from its standard setting.
Maximum length of kill ring before oldest elements are thrown away.

Kill Read Only Ok: [Hide] [Toggle]  off (nil)
   [State]: this option is unchanged from its standard setting.
Non-nil means don't signal an error for killing read-only text.

\- Killing group end ---------------------------------------------------/

3.1.1 Customisation Group browsing

The following is an alternative means of arriving at the same end. You can view the structure of customisation groups on a larger scale with M-x customize-browse. This command creates a special kind of customisation buffer which shows only the names of the groups (and options and faces), and their structure. It will initially look like this:
Square brackets show active fields; type RET or click mouse-1
on an active field to invoke its action.
Invoke [+] below to expand a group, and [-] to collapse an expanded group.
Invoke the [Group], [Face], and [Option] buttons below to edit that
item in another window.

[-]-\ [Group] Emacs
   [+]-- [Group] Editing
   [+]-- [Group] External
   [+]-- [Group] Convenience
   [+]-- [Group] Programming
   [+]-- [Group] Applications
   [+]-- [Group] Development
   [+]-- [Group] Environment
   [+]-- [Group] Data
   [+]-- [Group] Files
   [+]-- [Group] Wp
   [+]-- [Group] Faces
   [+]-- [Group] Hypermedia
   [+]-- [Group] Help
   [+]-- [Group] Local
In this buffer, you can show the contents of a group by invoking [+]. When the group contents are visible, this button changes to [-]; invoking that hides the group contents. For example, clicking on the [+] next to Editing results in (minus the usual preamble):
[-]-\ [Group] Emacs
   [-]-\ [Group] Editing
    | [+]-- [Group] Killing
    | [+]-- [Group] Indent
    | [+]-- [Group] Paragraphs
    | [+]-- [Group] Abbreviations
    | [+]-- [Group] Matching
    | [+]-- [Group] Emulations
    | [+]-- [Group] Mouse
    | [+]-- [Group] Outlines
    | [+]-- [Group] I18n
    | [+]-- [Group] Undo
    | [+]-- [Group] Fill
    | [+]-- [Group] Editing Basics
    | [+]-- [Group] Auto Show
    | [+]-- [Group] Hscroll
    | [+]-- [Group] Vcursor
    | [+]-- [Group] View
    | [+]-- [Group] Picture
   [+]-- [Group] External
   [+]-- [Group] Convenience
   [+]-- [Group] Programming
   [+]-- [Group] Applications
   [+]-- [Group] Development
   [+]-- [Group] Environment
   [+]-- [Group] Data
   [+]-- [Group] Files
   [+]-- [Group] Wp
   [+]-- [Group] Faces
   [+]-- [Group] Hypermedia
   [+]-- [Group] Help
   [+]-- [Group] Local
Each group, option or face name in this buffer has an active field which says [Group], [Option] or [Face]. Invoking that active field creates an ordinary customisation buffer showing just that group and its contents, just that option, or just that face. This is the way to set values in it.

3.2 Changing an Option

In the customisation browser mentioned above, clicking on the [+] next to Killing results in (minus the usual preamble):
[-]-\ [Group] Emacs
   [-]-\ [Group] Editing
    | [-]-\ [Group] Killing
    |  |  |--- [Option] Backward Delete Char Untabify Method
    |  |  |--- [Option] Kill Whole Line
    |  |  |--- [Option] Kill Ring Max
    |  |  `--- [Option] Kill Read Only Ok
    | [+]-- [Group] Indent
    | [+]-- [Group] Paragraphs
    | [+]-- [Group] Abbreviations
    | [+]-- [Group] Matching
    | [+]-- [Group] Emulations
    | [+]-- [Group] Mouse
    | [+]-- [Group] Outlines
    | [+]-- [Group] I18n
    | [+]-- [Group] Undo
    | [+]-- [Group] Fill
    | [+]-- [Group] Editing Basics
    | [+]-- [Group] Auto Show
    | [+]-- [Group] Hscroll
    | [+]-- [Group] Vcursor
    | [+]-- [Group] View
    | [+]-- [Group] Picture
   [+]-- [Group] External
   [+]-- [Group] Convenience
   [+]-- [Group] Programming
   [+]-- [Group] Applications
   [+]-- [Group] Development
   [+]-- [Group] Environment
   [+]-- [Group] Data
   [+]-- [Group] Files
   [+]-- [Group] Wp
   [+]-- [Group] Faces
   [+]-- [Group] Hypermedia
   [+]-- [Group] Help
   [+]-- [Group] Local
If you click on the [Option] item next to Kill Ring Max you will bring up a customisation buffer which looks like this (minus the usual preamble):
Kill Ring Max: [Hide] 60
   [State]: this option is unchanged from its standard setting.
Maximum length of kill ring before oldest elements are thrown away.
Parent groups: [Killing]
(You can arrive at something similar by working your way down from the top-level Emacs group, as shown above). The text following [Hide], 60 in this case, indicates the current value of the option. If you see [Show] instead of [Hide], it means that the value is hidden; the customisation buffer initially hides values that take up several lines. Invoke [Show] to show the value.

The line after the option name indicates the customisation state of the option: in the example above, it says you have not changed the option yet. The word [State] at the beginning of this line is active; you can get a menu of various operations by invoking it with Mouse-1 or RET. These operations are essential for customising the variable.

The line after the [State] line displays the beginning of the option's documentation string. If there are more lines of documentation, this line ends with [More]; invoke this to show the full documentation string.

To enter a new value for Kill Ring Max, move point to the value and edit it textually. For example, you can type M-d, then insert another number.

When you begin to alter the text, you will see the [State] line change to say that you have edited the value:

     [State]: you have edited the value as text, but not set the option.
Editing the value does not actually set the option variable. To do that, you must set the option. To do this, invoke the word [State] and choose Set for Current Session.

The state of the option changes visibly when you set it:

     [State]: you have set this option, but not saved it for future sessions.
You don't have to worry about specifying a value that is not valid; setting the option checks for validity and will not really install an unacceptable value.

While editing a value or field that is a file name, directory name, command name, or anything else for which completion is defined, you can type M-TAB (widget-complete) to do completion.

Some options have a small fixed set of possible legitimate values. These options don't let you edit the value textually. Instead, an active field [Value Menu] appears before the value; invoke this field to edit the value. For a boolean "on or off" value, the active field says [Toggle], and it changes to the other value. [Value Menu] and [Toggle] edit the buffer; the changes take effect when you use the `Set for Current Session' operation.

Some options have values with complex structure. For example, the value of load-path is a list of directories. Here is how it will probably appear to you in the customisation buffer (this is assuming you don't have any statements in your .emacs file which modify the load-path):

Load Path: [Hide]
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/site-lisp
[INS] [DEL] [Current dir?] /usr/share/emacs/site-lisp
[INS] [DEL] [Current dir?] /usr/share/emacs/site-lisp/auctex
[INS] [DEL] [Current dir?] /usr/share/emacs/site-lisp/egg
[INS] [DEL] [Current dir?] /usr/share/emacs/site-lisp/lang
[INS] [DEL] [Current dir?] /usr/share/emacs/site-lisp/site-start.d
[INS] [DEL] [Current dir?] /usr/share/emacs/site-lisp/sml-mode
[INS] [DEL] [Current dir?] /usr/share/emacs/site-lisp/egg/egg
[INS] [DEL] [Current dir?] /usr/share/emacs/site-lisp/egg/its
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/leim
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp/textmodes
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp/progmodes
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp/play
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp/mail
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp/language
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp/international
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp/gnus
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp/emulation
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp/emacs-lisp
[INS] [DEL] [Current dir?] /usr/share/emacs/20.7/lisp/calendar
        [State]: this item has been changed outside the customization buffer.
     List of directories to search for files to load....
Each directory in the list appears on a separate line, and each line has several editable or active fields.

You can edit any of the directory names. To delete a directory from the list, invoke [DEL] on that line. To insert a new directory in the list, invoke [INS] at the point where you want to insert it.

You can also invoke [Current dir?] to switch between including a specific named directory in the path, and including nil in the path (nil in a search path means try the current directory). Clicking on [Current dir?] will bring up a little popup window which allows you to chose between these options.

Two special commands, TAB and S-TAB (ie SHIFT and TAB simultaneously), are useful for moving through the customisation buffer. TAB (widget-forward) moves forward to the next active or editable field; S-TAB (widget-backward) moves backward to the previous active or editable field.

Typing RET on an editable field also moves forward, just like TAB. The reason for this is that people have a tendency to type RET when they are finished editing a field. If you have occasion to insert a newline in an editable field, use C-o or C-q C-j.

Setting the option changes its value in the current emacs session; saving the value changes it for future sessions as well. This works by writing code into your ~/.emacs file so as to set the option variable again each time you start emacs (see Section 3.2.1 Changing an Option Permanently). To save the option, invoke [State] and select the Save for Future Sessions operation.

You can also restore the option to its standard value by invoking [State] and selecting the Reset to Standard Settings operation. There are actually three reset operations:

If you have made some modifications and not yet set the option, this restores the text in the customisation buffer to match the actual value.
Reset to Saved
This restores the value of the option to the last saved value, and updates the text accordingly.
Reset to Standard Settings
This sets the option to its standard value, and updates the text accordingly. This also eliminates any saved value for the option, so that you will get the standard value in future emacs sessions.
The state of a group indicates whether anything in that group has been edited, set or saved. You can select Set for Current Session, Save for Future Sessions and the various kinds of Reset operations for the group; these operations on the group apply to all options in the group and its subgroups.

Near the top of the customisation buffer there are two lines containing several active fields:

      [Set for Current Session] [Save for Future Sessions]
      [Reset] [Reset to Saved] [Reset to Standard]   [Bury Buffer]
Invoking [Bury Buffer] buries this customisation buffer. Each of the other fields performs an operation - set, save or reset - on each of the items in the buffer that could meaningfully be set, saved or reset.

3.2.1 Changing an Option Permanently

Setting an option changes its value in the current emacs session; saving the value changes it for future sessions as well. This works by writing code into your ~/.emacs file so as to set the option variable again each time you start emacs. To save the option, invoke [State] and select the Save for Future Sessions operation.

For example, to set the vertical scrollbars to appear on the right of your emacs windows:
(One of several methods of going about this):

  1. Type M-x customize-browse. This brings up the Customize Browser buffer.
  2. Click on the [+] next to Environment
  3. Click on the [+] next to Frames
  4. Click on [Option] next to Scroll Bar Mode. This brings up a Customize Option buffer.
  5. Click on [Value Menu]. This brings up a popup headed Choice, and below are three options, none (nil), left, right.
  6. Click on right. the popup will disappear
  7. Click on [Save for Future Sessions] (or select this option by clicking on [State]). At this point your scrollbars will magically appear on the right of your emacs windows. The [State] information will change to:
      [State]: this option has been set and saved.
    and you will also find that a piece of lisp has been written into your .emacs file:
     '(scroll-bar-mode (quote right)))
    (or something similar). This will ensure that you will always have scrollbars on the right.

3.3 Customising Faces

In addition to user options, some customisation groups also include faces (in emacs terminology a face is the appearance of a piece of text, it has properties such as font, weight, colour etc). When you show the contents of a group, both the user options and the faces in the group appear in the customisation buffer. Here is an example of a face customisation item:

Bold Italic: (sample) [Hide]
   [State]: this face is unchanged from its standard setting.
Use bold italic font.
Attributes: [X] Bold: [Toggle]  on (non-nil)
            [X] Italic: [Toggle]  on (non-nil)
            [ ] Underline: [Toggle]  off (nil)
            [ ] Inverse Video: [Toggle]  off (nil)
            [ ] Foreground:             (sample)
            [ ] Background:             (sample)
            [ ] Stipple: 
(reached from the Emacs Group by selecting Go to Group for Faces, followed by Go to Group for Basic_Faces, followed by selecting Show next to Bold Italic.) Each face attribute has its own line. The [X] field before the attribute name indicates whether the attribute is "enabled"; X means that it is. You can enable or disable the attribute by invoking that field. When the attribute is enabled, you can change the attribute value in the usual ways.

On a black-and-white display, the colours you can use for the background are black, white, gray, gray1, and gray3. emacs supports these shades of gray by using background stipple patterns instead of a colour.

Setting, saving and resetting a face work like the same operations for options.

A face can specify different appearances for different types of display. For example, a face can make text red on a colour display, but use a bold font on a monochrome display. To specify multiple appearances for a face, select Show Display Types in the menu you get from invoking [State].

Another more basic way to set the attributes of a specific face is with M-x modify-face. This command reads the name of a face, then reads the attributes one by one. For the colour and stipple attributes, the attribute's current value is the default - type just RET if you don't want to change that attribute. Type none if you want to clear out the attribute.

3.4 Customising Specific Items

Instead of finding the options you want to change by moving down through the structure of groups, you can specify the particular option, face or group that you want to customise.

M-x customize-option RET OPTION RET
Set up a customisation buffer with just one option, OPTION.
M-x customize-face RET FACE RET
Set up a customisation buffer with just one face, FACE.
M-x customize-group RET GROUP RET
Set up a customisation buffer with just one group, GROUP.
M-x customize-apropos RET REGEXP RET
Set up a customisation buffer with all the options, faces and groups that match REGEXP.
M-x customize-changed-options RET VERSION RET
Set up a customisation buffer with all the options, faces and groups whose meaning has changed since emacs version VERSION.
M-x customize-saved
Set up a customisation buffer containing all options and faces that you have saved with customisation buffers.
M-x customize-customized
Set up a customisation buffer containing all options and faces that you have customised but not saved.
If you want to alter a particular user option variable with the customisation buffer, and you know its name, you can use the command M-x customize-option and specify the option name. This sets up the customisation buffer with just one option - the one that you asked for. Editing, setting and saving the value work as described above, but only for the specified option.

Likewise, you can modify a specific face, chosen by name, using M-x customize-face. You can also set up the customisation buffer with a specific group, using M-x customize-group. The immediate contents of the chosen group, including option variables, faces, and other groups, all appear as well. However, these subgroups' own contents start out hidden. You can show their contents in the usual way, by invoking [Show].

To control more precisely what to customise, you can use M-x customize-apropos. You specify a regular expression as argument; then all options, faces and groups whose names match this regular expression are set up in the customisation buffer. If you specify an empty regular expression, this includes all groups, options and faces in the customisation buffer (but that takes a long time).

When you upgrade to a new emacs version, you might want to customise new options and options whose meanings or default values have changed. To do this, use M-x customize-changed-options and specify a previous emacs version number using the minibuffer. It creates a customisation buffer which shows all the options (and groups) whose definitions have been changed since the specified version.

If you change option values and then decide the change was a mistake, you can use two special commands to revisit your previous changes. Use M-x customize-saved to look at the options and faces that you have saved. Use M-x customize-customized to look at the options and faces that you have set but not saved.

4. X Resources for emacs - font size

By default, Emacs displays text in the font named 9x15, which makes each character nine pixels wide and fifteen pixels high. You can specify a different font on your command line through the option -fn NAME.
emacs -fn NAME
Use font NAME as the default font.
emacs --font=NAME
--font is an alias for -fn.
Under X, each font has a long name which consists of eleven words or numbers, separated by dashes. Some fonts also have shorter nicknames - 9x15 is such a nickname. You can use either kind of name. You can use wildcard patterns for the font name; then emacs lets X choose one of the fonts that match the pattern. Here is an example, which happens to specify the font whose nickname is 6x13:
     emacs -fn "-misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1" &
You can also specify the font in your .Xresources file:
     emacs*font: -misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1
or just
     emacs*font: 6x13
Use only fixed-width fonts - that is, fonts in which all characters have the same width; emacs cannot yet display variable-width fonts properly. Any font with m or c in the SPACING field of the long name is a fixed-width font (if using xfontsel to choose a font that's the field marked spc). To use xlsfonts to list all the fixed-width fonts available on your system:
     xlsfonts -fn '*x*' | egrep "^[0-9]+x[0-9]+"
     xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-m*'
     xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-c*'
To see what a particular font looks like, use the xfd command. For example:
     xfd -fn 6x13
displays the entire font 6x13.

You can also specify a font as the principal font for the selected frame during a session by using M-x set-frame-font RET FONT RET. This sets the principal font to be used for all text displayed in the frame, except when a face specifies a different font to use for certain text.

You can also set a frame's principal font through a pop-up menu. Press SHIFT-Mouse-1 to activate this menu.