old-www/HOWTO/Emacs-Beginner-HOWTO-4.html

251 lines
10 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
<TITLE>Emacs Beginner's HOWTO: Customizing Emacs </TITLE>
<LINK HREF="Emacs-Beginner-HOWTO-5.html" REL=next>
<LINK HREF="Emacs-Beginner-HOWTO-3.html" REL=previous>
<LINK HREF="Emacs-Beginner-HOWTO.html#toc4" REL=contents>
</HEAD>
<BODY>
<A HREF="Emacs-Beginner-HOWTO-5.html">Next</A>
<A HREF="Emacs-Beginner-HOWTO-3.html">Previous</A>
<A HREF="Emacs-Beginner-HOWTO.html#toc4">Contents</A>
<HR>
<H2><A NAME="customizing_emacs"></A> <A NAME="s4">4. Customizing Emacs </A></H2>
<P>Virtually all Emacs customization is done via Lisp code. You can
modify variables which influence the way Emacs operates or you can add
new functions to Emacs (or override existing functions--replacing them
with your own).
<P>
<H2><A NAME="ss4.1">4.1 Temporary Customization</A>
</H2>
<P>While experimenting with Emacs customization, you'll probably want
to do it in a way that is temporary. If you do something horribly
wrong, you can just <CODE>C-x C-c</CODE> to exit emacs and run it
again. Once you've figured out what changes you'd like to make
permanent, you can add them to your very own <CODE>.emacs</CODE> file so
that they take effect every time you start Emacs. This is discussed in
the next section.
<P>
<H3>Variable Assignments</H3>
<P>The easiest customizations are accomplished by changing the value
of a variable in Emacs. The list code to do this looks like this:
<P>
<PRE>
(setq variable-name new-value)
</PRE>
<P>
<P>Where <CODE>variable-name</CODE> is the name of the variable and
<CODE>new-value</CODE> is the value you'd like to give the variable. (In
Lisp-speak, you're binding a variable to a value.) The <CODE>setq</CODE>
function in lisp is analogous to the assignment operators (usually
<CODE>=</CODE>) in other programming languages.
<P>
<P><B>NOTE:</B> I'm glossing over many details here for the sake of
simplicity. You may also see me or others use the Lisp functions
<CODE>set</CODE> and even <CODE>setq-default</CODE>. If you're really curious,
feel free to look them up in an Emacs Lisp reference.
<P>
<P>Let's look at a line from my <CODE>.emacs</CODE> file
<P>
<PRE>
(setq-default transient-mark-mode t)
</PRE>
<P>
<P>The variable <CODE>transient-mark-mode</CODE> controls whether or not a
region becomes highlighted when I mark it. In many GUI applications,
if you click and drag the mouse to select a range of text it becomes
hi-lighted in reverse video or some other color. Emacs will do the same
thing it the <CODE>transient-mark-mode</CODE> variable is set (to a non-nil
value).
<P>
<P>A <EM>WHAT</EM> value?
<P>
<P>Okay. Brief digression. Most programming languages have some notion
of true/false values. In C/C++ a value is considered true if it is a
non-zero value. In Perl, a non-null or non-zero value is true. In
Lisp, the same idea applies but the names and symbols are different.
<P>
<P>True is usually written as <CODE>t</CODE> and false (or null) is
written as <CODE>nil</CODE>. Like in other languages, though, any non-nill
value is considered true.
<P>
<P>To get the full description of what <CODE>transient-mark-mode</CODE>
does, you can use the on-line help. Type <CODE>C-h v</CODE> or <CODE>M-x
describe-variable</CODE> and then <CODE>transient-mark-mode</CODE>. If
you're lazy like me, you can take advantage of variable name
completion using the <CODE>Tab</CODE> key. Just type part of the variable
name and hit the <CODE>Tab</CODE> key. If you've typed enough of it that
Emacs can already uniquely identify it, you'll see the whole name
completed for you.
<P>
<P>Another variable that folks often set is <CODE>fill-column</CODE>. It
tells Emacs how wide the screen should be for the purposes of
word-wrapping (and <CODE>auto-fill-mode</CODE> respects this value). To
set the value to something absurd, you could type:
<P>
<PRE>
(setq fill-column 20)
</PRE>
<P>
<P>But that won't actually do anything. You need to tell Emacs to
<B>evaluate</B> the expression you typed. To do so, put the point
(cursor) at the end of the expression end then type <CODE>C-x C-e</CODE>,
which calls the function <CODE>eval-last-sexp</CODE> in case you
care. When you do that, notice that <CODE>20</CODE> (or whatever value you
used) is echoed back to you in the mini-buffer at the bottom of the
screen. That's just the return value from the expression you
evaluated.
<P>
<P>Just to prove that it works, type a sentence or two. If you happen
to have <CODE>auto-fill-mode</CODE> enabled (you probably don't), you'll
notice the text wrapping at the 20 column mark. Otherwise, after
you've typed some stuff, type <CODE>M-q</CODE> which calls the function
<CODE>fill-paragraph</CODE>. It will then perform the word wrapping.
<P>
<H3>File Associations</H3>
<P>You can configure Emacs to automatically do something when you open
a file of a particular type (just like some GUIs will automatically
launch a specific application if you click on the icon for a
particular file). For example, I may want Emacs to automatically
switch to <CODE>text-mode</CODE> every time I open a file with a
<CODE>.txt</CODE> extension. Well, that already happens. <CODE>:-)</CODE> So
let's tell Emacs to always enter <CODE>text-mode</CODE> when you open a
file named ``README''.
<P>
<PRE>
(setq auto-mode-alist (cons '("README" . text-mode) auto-mode-alist))
</PRE>
<P>
<P>Huh?
<P>
<P>Without diving into lots of Lisp programming that you really don't
need to know (but it wouldn't hurt you to learn), let just say that
the variable <CODE>auto-mode-alist</CODE> contains a list of pairs. Each
pair contains a regular expression and an Emacs mode name. If a file
you open matches the regular expression (in this case, the string
<CODE>README</CODE>) Emacs starts the mode you specified.
<P>
<P>The funny syntax above is because we're actually adding another
pair to that mode list. You wouldn't want to just assign to
<CODE>auto-mode-alist</CODE> without making sure the values that it
already contains aren't lost.
<P>
<P>And if I wanted Emacs to automatically switch to
<CODE>html-helper-mode</CODE> every time that I opened a file that ended
with <CODE>.html</CODE> or <CODE>.htm</CODE>, I would add this to my .emacs
file:
<P>
<PRE>
(setq auto-mode-alist (cons '("\\.html$" . html-helper-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("\\.htm$" . html-helper-mode) auto-mode-alist))
</PRE>
<P>
<P>The possibilities are truly endless.
<P>
<H2><A NAME="ss4.2">4.2 Using a <CODE>.emacs</CODE> File</A>
</H2>
<P>After you've spent some time with Emacs and have a basic idea of
what customization can do for you, you'll probably want to customize a
few things permanently (or at least until you change your mind). If
you find yourself using Emacs on a daily basis, you'll also notice
that your <CODE>.emacs</CODE> file get bigger as time goes on. That's a
<EM>Good Thing</EM> because it means you've figured out how to make
Emacs work the way <B>you</B> want it do work. It's a shame that
more software products don't let you do that.
<P>
<P>In case you haven't already guessed, every time you start Emacs, it
looks for a file named <CODE>.emacs</CODE> in your home directory. Your
<CODE>.emacs</CODE> file is where you should put any Lisp code that you
want run automatically and that includes the sort of customization
we've been dealing with here.
<P>
<P>Another example from my <CODE>.emacs</CODE> file:
<P>
<PRE>
(setq inhibit-startup-message t)
</PRE>
<P>
<P>The <CODE>inhibit-startup-message</CODE> variable controls whether or
not Emacs displays that welcome message when it starts. After a while,
I got sick of looking at it (because I knew how to find the help and
whatnot), so I went in search of a way to turn it off.
<P>
<P>As an exercise, try creating a <CODE>.emacs</CODE> file of your own and
add that line to it. Then exit and start Emacs again. You should not
see the welcome message.
<P>
<P>Often times when your read about an Emacs mode (or a package), the
documentation will suggest some code to add to your <CODE>.emacs</CODE>
file in order to make the mode or package work in a particular way.
<P>
<P>The GNU Emacs FAQ (<CODE>C-h F</CODE>) contains some items related to
<CODE>.emacs</CODE> files that you might find useful.
<P>
<H2><A NAME="ss4.3">4.3 The Customize Package</A>
</H2>
<P>As Emacs has grown in popularity and continued to evolved, someone
eventually said ``there has to be a better way to let novice users
customize their Emacs.'' And <CODE>customize</CODE> was born.
<P>
<P>Customize provides a more intuitive method of customizing parts of
Emacs. To try it out, either visit the <CODE>Customize</CODE> sub-menu in
your <CODE>Help</CODE> menu, or type <CODE>M-x customize</CODE>.
<P>
<P>Customize groups customization into logical groups like
``Editing'', ``Programming'', ``Files'', and so on. Some groups
contain sub-groups.
<P>
<P>If you make changes using the customize interface, Emacs will save
the changes to your <CODE>.emacs</CODE> file. That's rather handy, because
you can easily inspect (and change) the changes it made for you.
<P>
<P><EM>I don't use the Customize interface, so I can't say much more
about it.</EM>.
<P>
<H2><A NAME="ss4.4">4.4 X Windows Display</A>
</H2>
<P>Like any well behaved X application, Emacs respects your X
resources. That means you can control the initial colors, geometry,
and other X specific things just as you could with an <CODE>xterm</CODE>,
<CODE>nxterm</CODE>, or whatever.
<P>
<P>Here's the relevant bit of my <CODE>~/.Xdefaults</CODE> file:
<P>
<PRE>
emacs*Background: DarkSlateGray
emacs*Foreground: Wheat
emacs*pointerColor: Orchid
emacs*cursorColor: Orchid
emacs*bitmapIcon: on
emacs*font: fixed
emacs.geometry: 80x25
</PRE>
<P>
<P>See your <CODE>X</CODE> manual page for more details about X resources.
<P>
<P>Chris Gray (
<A HREF="mailto:cgray4@po-box.mcgill.ca">cgray4@po-box.mcgill.ca</A>) also notes:
<P>
<BLOCKQUOTE>
In Debian, the <CODE>~/.Xdefaults</CODE> doesn't seem to be used.
However, Debian people can put what you have given in
<CODE>/etc/X11/Xresources/emacs</CODE> and they can have the pretty colors
that they had when they were using RedHat.
</BLOCKQUOTE>
<P>
<HR>
<A HREF="Emacs-Beginner-HOWTO-5.html">Next</A>
<A HREF="Emacs-Beginner-HOWTO-3.html">Previous</A>
<A HREF="Emacs-Beginner-HOWTO.html#toc4">Contents</A>
</BODY>
</HTML>