LDP/LDP/howto/linuxdoc/Emacs-Beginner-HOWTO.sgml

1354 lines
49 KiB
Plaintext

<!doctype linuxdoc system>
<!-- $Id$ -->
<article>
<title>Emacs Beginner's HOWTO</title>
<author>
Jeremy D. Zawodny: <htmlurl url="mailto:Jeremy@Zawodny.com" name="Jeremy@Zawodny.com">
</author>
<date>v1.12, 2001-03-25</date>
<abstract>
This document introduces Linux users to the Emacs editor. It assumes
minimal familiarity with <tt>vi</tt> or a similar editor. The latest
version of this document is usually available from <htmlurl url =
"http://www.wcnet.org/jzawodn/emacs/" name =
"http://www.wcnet.org/jzawodn/emacs/">
</abstract>
<toc>
<!-- ********************************************* -->
<sect>Introduction <label id="introduction">
<sect1>Copyright
<p>Copyright &copy; 1998 - 2001 Jeremy D. Zawodny. Permission to
distribute and modify this document is granted under the GNU General
Public License. An on-line copy is available at <htmlurl url =
"http://www.gnu.org/copyleft/gpl.html" name =
"http://www.gnu.org/copyleft/gpl.html">
</sect1>
<sect1>Audience and Intent
<p>This document is targeted at the Linux user interested in learning
a bit about Emacs and trying it out. This actually began as the
outline of a brief tutorial that I was to give at a Toledo Area Linux
User Group meeting: <htmlurl url = "http://www.talug.org/" name =
"http://www.talug.org/">. It has since grown a bit as the result of
the helpful feedback I have received from the community. See the
Credits section for details.
<p>Having said that, there is virtually nothing Linux-specific in this
document. It applies to virtually all flavors of Unix and even Emacs
running on Microsoft Windows. But since this document is part of the
Linux Documentation Project, I make a point of saying that it was
developed for Linux users--because it was.
<p>And finally, those of you who prefer the name GNU/Linux to simply
``Linux'' (read <htmlurl
name="http://www.gnu.org/gnu/linux-and-gnu.html"
url="http://www.gnu.org/gnu/linux-and-gnu.html"> to see why one might)
are welcomed to mentally substitute GNU/Linux for all occurrences of
Linux in this document. While I don't disagree with the reasoning and
spirit behind that idea, I don't feel compelled to write GNU/Linux.
</sect1>
<sect1>What is Emacs?
<p>Emacs is different things to different people. Depending who you
ask, you'll could get any of the following responses:
<itemize>
<item>Text Editor
<item>Mail Client
<item>News Reader
<item>Word Processor
<item>Religion
<item>Integrated Development Environment
<item>Whatever you want it to be!
</itemize>
<p>But for our purposes, let's just pretend it's a text editor--an
amazingly flexible text editor. We'll dig deeper into the question
later on. Emacs was written by Richard Stallman (founder of the Free
Software Foundation: <htmlurl url="http://www.fsf.org/"
name="http://www.fsf.org/"> and the GNU project <htmlurl
url="http://www.gnu.org/" name="http://www.gnu.org/">) and he still
maintains it today.
<p>Emacs is one of the most popular and powerful text editors used on
Linux (and Unix). It is second in popularity only to <bf>vi</bf>. It
is known for it huge feature set, ability to be easily customized, and
lack of bugs. It's large feature set and ability to be customized
actually are the result of how Emacs was designed and
implemented. Without going into all the details, I'll simply point out
that Emacs isn't ``just an editor''. It is an editor written mostly in
the programming language <bf>Lisp</bf>. At the core of Emacs is a
full-featured Lisp interpreter written in C. Only the most basic and
low-level pieces of Emacs are written in C. The majority of the editor
is actually written in Lisp. So, in a sense, Emacs has an entire
programming language ``built in'' which you can use to customize,
extend, and change its behavior.
<p>Emacs is also one of the oldest editors around. The fact that is
has been used by thousands of programmers over the past 20 (?) years
means that there are many add-on packages available. These add-ons
allow you to make Emacs do things that Stallman had probably never
dreamed possible when he first began work on Emacs. More on that
in a later section.
<p>There are many other web sites and documents which give a better
overview of Emacs, its history, and related matters. Rather than
attempt to reproduce much of that here, I suggest that you check out
some of the places listed in Section <ref id = "other_resources" name
= "Other Resources"> section of this document.
<sect2>Ports and Versions
<p>It's worth pointing out that there are actually two different Emacs
editors: GNU Emacs and XEmacs. Both come from the same heritage and
share most of the same features. This document focuses on GNU Emacs
(version 20.3, specifically) but much of what you'll read here will
apply just as well to XEmacs and earlier versions of GNU
Emacs. Throughout this document I will simply refer to ``Emacs''. When
I do so, bear that in mind.
</sect2>
<sect2>Getting Emacs
<p>Getting Emacs is easy. If you are using a popular Linux
distribution like Debian, RedHat, Slackware, or any of the others,
Emacs is probably an optional package that you can install from your
distribution media. If not, you can get the Emacs source code and
compile it yourself. Visit the GNU web site for the exact location:
<htmlurl url = "http://www.gnu.org/software/emacs/emacs.html" name = "http://www.gnu.org/software/emacs/emacs.html">
</sect2>
</sect1>
</sect>
<!-- ********************************************* -->
<sect>Running Emacs <label id="running_emacs">
<sect1>Starting &amp; Quitting Emacs
<p>As a new user, you'll probably want to launch Emacs just to mess
around and try it out. Once you're into Emacs and want to exit,
however, you may not be able to figure out what to do. So if you've
never used Emacs before, give it a shot right now. At your shell
prompt, type <tt>emacs</tt> and hit enter. Emacs should start up. If
not, it is either not installed or not in your path.
<p>Once you've seen Emacs, you need to know how to exit. The
keystrokes for leaving Emacs are <tt>C-x C-c</tt>. The <tt>C-x</tt>
notation means hold down the <tt>Ctrl</tt> key and press
<tt>x</tt>. In this case, you'll then need to hold down <tt>Ctrl</tt>
and press <tt>c</tt> to finish the task.
<p>The keystrokes used in Emacs will likely seem odd, foreign, and
maybe even uncomfortable to you at first--especially if you're a
<tt>vi</tt> user. Unlike <tt>vi</tt>, Emacs doesn't have separate
modes for editing text and issuing commands.
<p>To re-cap: <tt>emacs</tt> will start Emacs. <tt>C-x C-c</tt> will
exit Emacs.
<sect2>What you'll see
<p>When Emacs starts up it will consume a whole X window (or screen if
you're running on a console instead of in the X Window System). You'll
see a menu across the top, some text in the main part of the screen,
and a couple of lines at the bottom.
<p>It will look something like this ASCII sketch:
<verb>
+----------------------------------------------------------------------+
|Buffers Files Tools Edit Search Mule Help |
| |
|Welcome to GNU Emacs, one component of a Linux-based GNU system. |
| |
| |
| |
| ... |
| |
|---1:---F1 *scratch* (Lisp Interaction)--L1--All-------------|
|For information about the GNU Project and its goals, type C-h C-p. |
+----------------------------------------------------------------------+
</verb>
<p><bf>NOTE:</bf> Emacs will usually fill the entire
screen/window. I've shrunk the above example to save space here. You
will also see a welcome message in Emacs when you first start it. I
omitted that as well and substituted ``<tt>...</tt>'' instead. The
welcome message simply identifies the exact version of Emacs you are
using as well as pointing you to the on-line help and related items.
<sect3>The Menu Bar
<p>The topmost line of the Emacs interface is a menu. If you're
running X, you'll recognize them as traditional pull-down menus that
you can access using your mouse. Otherwise you'll need to use keyboard
shortcuts (not covered here) for accessing the menus.
</sect3>
<sect3>The Status Bar and Mini-buffer
<p>Of the last two lines in the Emacs interface, the topmost one is
essentially a status bar. It contains information about the buffer
you're working in, which mode Emacs is in, and various other
things. For now, just realize that it's there.
<p>The bottommost line is called the <bf>mini-buffer</bf>. It is
separated from the main buffer by the status bar we just
discussed. You can think of the mini-buffer as the Emacs
``command-line''. It is where commands that you give Emacs appear and
it is where status messages are printed in response to things you do.
<p>You'll find that what I've called the status bar is usually referred
to as the mode line in Emacs related documentation. It is where Emacs
displays information about the current modes(s) you may be using as
well as things like the current date and time, line number, file size,
and almost anything else you might want to see there.
</sect3>
</sect2>
</sect1>
<sect1>Some Terminology
<p>This section covers the most basic of Emacs terminology that you'll
encounter when using and reading about Emacs.
<sect2>Buffers &amp; Files
<p>Unlike some editors, when you open a file in Emacs it does not stay
``open'' the entire time you're working with it. Instead, Emacs reads
the file into a <bf>buffer</bf> in memory. While you're editing the
buffer and working with the data nothing is changed on disk. Only when
you actually save the buffer does the file on disk get updated. There
are advantages and disadvantages to this approach but it is only
important that you understand that it works this way.
<p>As a consequence, you will see the term ``buffer'' used in Emacs
documentation, modes, packages, and so on. Just realize that buffer
means ``a copy of the file that is currently in memory.'' Oh, it's
worth pointing out that a buffer doesn't always have to refer to a
specific file on disk. Often times Emacs will create buffers as the
result of commands you run. Such buffers may contain the result of the
command, a list of selections to pick from, and so on.
</sect2>
<sect2>Point &amp; Region
<p>In Emacs lingo, you'll often hear or see references to the
<bf>point</bf>. In general terms the point is the cursor. The actual
distinction between the point and cursor probably isn't important when
you're first starting out with Emacs. But if you are curious, think
about it this way. The cursor is the visual representation of the
point. The cursor is always ``on'' a particular character position in
the current buffer. The point, on the other hand, lives in the space
<em>between characters</em> on in the buffer. So you might say that if
the cursor is on the letter `h' in the word ``the'' then the point is
between the `t' and the `h'.
<p>Like many modern editors, Emacs allows to perform operations
(indent, spell-check, reformat, cut, copy, paste, ...) on a section of
the current buffer. You can highlight (or ``mark'') a block of text
using the keyboard or mouse and then perform operations on just the
selected block of text. In Emacs, that block of text is called a
<bf>region</bf>.
</sect2>
<sect2>Windows
<p>Okay, this will be a bit confusing to anyone who has ever used a
GUI interface before. Just remember that Emacs was developed long
before GUI interfaces and window managers were popular.
<p>A <bf>window</bf> in Emacs is an area of the screen in which a
buffer is displayed. When Emacs is first started, you have one window
on your screen. Some Emacs functions (such as the help and
documentation) often [temporarily] open up additional windows in your
Emacs screen.
<p>Emacs windows have nothing to do with X windows in the GUI
sense. You can open up additional X windows to display Emacs buffers,
maybe to compare two files side by side. Those new X windows are
referred to as <bf>frames</bf> in Emacs lingo. Read on.
</sect2>
<sect2>Frames
<p>In Emacs, a <bf>frame</bf> is a separate X window in which an Emacs
buffer is displayed. But both are part of the same Emacs session. The
behavior is somewhat (but not too much) like what happens if you hit
Alt+N in Netscape Navigator.
</sect2>
</sect1>
<sect1>Keyboard Basics
<p>This section covers the basics of keyboarding for Emacs. Like every
powerful editor, everything that you can do with Emacs is just a few
keystrokes away.
<p>If you're a <tt>vi</tt> user, the notion of using the <tt>k, j, l,
h</tt> keys to move up a line, down a line, forward by a character,
and backward by a character probably took some getting used to. In
fact, it might have taken you a few hours or even weeks of practice
before you could comfortably navigate a file using the various key
combinations available in <tt>vi</tt>.
<p>Emacs is no different. There are different keystrokes and commands
to learn. Just like <tt>vi</tt>, you only need to master the basics to
get a lot of work done. Then, as time goes on, you can slowly expand
your knowledge and find faster ways of doing things.
<sect2>Command Keys (Meta, Esc, Control, and Alt)
<p>As you'll soon learn, Emacs makes heavy use of multi-key
combinations. Because it is not a modal editor like <tt>vi</tt>, you
don't have to think about being in ``command mode'' or ``editing
mode'' before you can try to move the cursor or execute a
command. Instead, you just press the right combination of keys and
Emacs does as told (usually).
<p>The keys that Emacs makes the most use of are usually abbreviated in
the documentation as <tt>C</tt> (for Control or Ctrl) and <tt>M</tt>
for (Meta). While most modern PC keyboards have one or more keys
labeled <tt>Ctrl</tt> few have one labeled <tt>Meta</tt>. You'll want
to mentally substitute either <tt>Esc</tt> or <tt>Alt</tt> for the Meta
key. In most standard configurations, both Esc and Alt do essentially
the same thing.
<p>So when you see a reference in any Emacs related documentation to
<tt>C-x f</tt> it means ``press control-x and then f.'' And if you see
a reference to something like <tt>M-x shell</tt> is means ``press
alt-x and type the word shell''.
<p>A very useful command for beginners is <tt>M-x apropos</tt> or
<tt>C-h a</tt>. apropos will search the Emacs on-line documentation
for all functions and search for the regular expression you type. This
is a great way to discover all commands related to frames. Simply
<tt>C-h a</tt> and then <tt>frame</tt>.
</sect2>
<sect2>Moving Around in a Buffer
<p>Now that you know what all those fancy abbreviations mean, here's a
list of the most common keystrokes for moving within a buffer:
<verb>
Keystrokes Action
-----------------------------------
C-p Up one line
C-n Down one line
C-f Forward one character
C-b Backward one character
C-a Beginning of line
C-e End of line
C-v Down one page
M-v Up one page
M-f Forward one word
M-b Backward one word
M-< Beginning of buffer
M-> End of buffer
C-g Quit current operation
-----------------------------------
</verb>
<p>And, as you might expect, the cursor keys (or arrow keys) usually
work just as you'd expect. Your <tt>Backspace</tt> may not. That's
another story. <tt>:-(</tt>
</sect2>
<sect2>Essential Commands
<p>Okay, now that you know how to move around within a buffer what
about opening and saving files? Search? Here are some basic commands.
<p>Before we jump straight to those commands, I need to briefly point
out how this works.
<p>All ``command keystrokes'' in Emacs (those that are <tt>M-x
something</tt> or <tt>C-something</tt>) are actually just shortcuts to
functions which are part of Emacs. You can call any of those functions
by typing <tt>M-x function-name</tt> and hitting <tt>Enter</tt>. You
can also use the keyboard shortcut for that function (if it has one).
<p>For example, the Emacs function which saves a buffer to disk is
called <tt>save-buffer</tt>. By default it is also bound to <tt>C-x
C-s</tt>. So, you can either use they shortcut to save the current
buffer, or you could type <tt>M-x save-buffer</tt> and achieve the
exact same result.
<p>All of the most common functions have keyboard shortcuts by
default. Some of them are listed below.
<verb>
Keystrokes Function Description
-------------------------------------------------------------------
C-x C-s save-buffer Save the current buffer to disk
C-x u undo Undo the last operation
C-x C-f find-file Open a file from disk
C-s isearch-forward Search forward for a string
C-r isearch-backward Search backward for a string
replace-string Search & replace for a string
replace-regexp Search & replace using regexp
C-h t help-with-tutorial Use the interactive tutorial
C-h f describe-function Display help for a function
C-h v describe-variable Display help for a variable
C-h x describe-key Display what a key sequence does
C-h a apropos Search help for string/regexp
C-h F view-emacs-FAQ Display the Emacs FAQ
C-h i info Read the Emacs documentation
C-x r m bookmark-set Set a bookmark. Useful in searches
C-x r b bookmark-jump Jump to a bookmark.
-------------------------------------------------------------------
</verb>
<p>As you try many of those functions, you'll notice that many will
prompt you for input. They will always to do in the mini-buffer. This
is similar to using the <tt>:</tt> commands in <tt>vi</tt> or most
commands that you'd use within your favorite Unix shell.
<p>Emacs has literally hundreds of built-in functions available. The
list above is a tiny sample that represents those that I use
regularly. See the on-line help for a more complete listing of the
available functions and more complete documentation on those I
mentioned above.
</sect2>
<sect2>Tab Completion
<p>Like many popular Unix shells (bash, csh, tcsh, ...) Emacs offers
command completion via the <tt>Tab</tt> key. In fact, the command
completion in bash was modeled after that in Emacs, so if you use that
feature in bash you'll be right at home.
<p>As an example, try <tt>M-x search</tt> and then hit
<tt>Tab</tt>. Emacs will append a hyphen to indicate that there are
several possible completions but they all have a hyphen as the next
character. Hit <tt>Tab</tt> once more and Emacs will display a list of
the possible matches for you to choose from. Notice that it does so in
a <em>new window</em>. It temporarily splits your display into two
windows: one which contains the buffer you were editing and the other
contains the list of possible completions for ``search-''. You may hit
<tt>C-g</tt> to exit out of the selection process and close the new
window.
</sect2>
</sect1>
<sect1>Tutorial, Help, &amp Info
<p>Emacs comes with an on-line tutorial which walks you through the
basic editing features and functions that everyone should know. It
also explains how to use the other help features in Emacs.
<p>I highly recommend that you spend some time going through the
tutorial if you plan on making a serious effort to learn Emacs. As
shown in the table above, you can enter the tutorial via <tt>C-h
t</tt>. The tutorial is self-guided and aimed at folks who are just
getting started with Emacs.
<p>If you are running Emacs in X, you will see that the rightmost menu
on the menu bar is labeled Help. As you explore the Help menu notice
that some items have keyboard shortcuts and those are listed right in
the menu.
<p>Finally, to see the volume of documentation available with Emacs,
you should try <tt>M-x info</tt> or <tt>C-h i</tt> which launches
Info, the Emacs documentation browser.
</sect1>
</sect>
<!-- ********************************************* -->
<sect>Emacs Modes
<p>Emacs modes are different behaviors and features which you can turn
on or off (or customize, of course) for use in different
circumstances. Modes are what make one editor (Emacs) equally useful
for writing documentation, programming in a variety of languages (C,
C++, Perl, Python, Java, and many more), creating a home page, sending
E-Mail, reading Usenet news, keeping track of your appointments, and
even playing games.
<p>Emacs modes are simply libraries of Lisp code that extend, modify,
or enhance Emacs is some way.
<sect1>Major vs. Minor Modes
<p>There are fundamentally two types of modes available: Major and
Minor. The distinction isn't the easiest thing to grasp until you've
worked with a few of them off and on, but let's give it a shot.
<p>Only one major mode can be active at a given time. Many minor modes
can be active at a given time. Major modes tend to be language or
task-specific, while minor modes are smaller and less specific
utilities that cut across many tasks.
<p>Sounds kind of abstract, so let's try an example. There's a mode
that I use quite often when I'm writing plain old text files. It's
called <tt>text-mode</tt>. This mode was designed for writing free
form text like a README file. It understands how to identify words and
paragraphs and generally makes sure that it does what I expect when I
use the normal navigation keystrokes.
<p>When I'm writing text for human consumption, I typically want it
to look good. It should be properly word-wrapped to a reasonable value
and so on. To enable word wrapping I just turn on the
<tt>auto-fill</tt> minor mode. This mode tries to do the Right Thing
when I'm typing along and hit the end of the line. The fact that it is
a minor mode means that it can work with several different major
modes. My notion of the ``Right Thing'' to do when I hit the end of
the line is different when I'm in <tt>text-mode</tt> than it is when
I'm in <tt>java-mode</tt> for example. I don't want my Java code to be
word-wrapped as if was English text. But I <em>do</em> want the blocks
of comments in my Java code to be word wrapped! <tt>auto-fill</tt>
mode is smart enough to figure that out.
<p>The authors of various Emacs modes have done a great job of making
sure that things that should work as minor modes are minor modes.
<p>If you look back at that ASCII sketch of an Emacs screen, you'll
notice that the mode line identifies the mode(s) that Emacs is in. In
that case it was in a mode called ``Lisp Interaction'' which is the
default mode. It's really only useful if you're going to be writing
Lisp code. (But since most of Emacs is written in Lisp, why not?)
</sect1>
<sect1>Programming Modes
<p>First and foremost, Emacs was designed by a programmer for
programmers. There are high-quality modes available for almost every
popular programming language you can think of (and even some not so
popular ones). I only briefly describe a few of them here.
<p>Most programming modes share some common characteristics. Usually,
they'll do some or all of the following:
<itemize>
<item>Provide color-syntax highlighting for the language.
<item>Provide automatic indentation and code formatting for the
language.
<item>Provide context (language) sensitive help.
<item>Automatically interface with your debugger.
<item>Add language-specific menus to the menu bar.
</itemize>
<p>In addition, there are some non-language specific modes that help
out with tasks that are common to programming in many
languages. Things like interfacing to your version control software,
automatically adding comments to your code, creating Makefiles,
updating Change Logs and so on.
<p>When you add all these modes together and consider the maturity and
stability of the Emacs code, it compares quite nicely to commercially
marketed Integrated Development Environments (IDEs) for languages like
C++ and Java. And, of course, it's free.
<sect2>C/C++/Java
<p>Because the syntax of C, C++, and Java are quite similar, there is
one Emacs mode which handles all three languages (as well as
Objective-C and IDL). It's a very mature and complete package and it
included in the Emacs distribution. This mode is called either
<tt>cc-mode</tt> or <tt>CC Mode</tt>.
<p>For more details or to download a newer version, visit <htmlurl
url="http://cc-mode.sourceforge.net/"
name="http://cc-mode.sourceforge.net/">.
</sect2>
<sect2>Perl
<p>There are actually two modes for editing Perl code in Emacs. The
first is called <tt>perl-mode</tt> (as you would expect) and the
second is <tt>cperl-mode</tt>. I don't have a good grasp of this
history and why there are two modes (the docs don't say), but it would
appear that <tt>perl-mode</tt> was the original mode for editing Perl
code in Emacs. It seems to have fewer features than
<tt>cperl-mode</tt> and is lacking the ability to recognize some of
Perl's fancier language constructs.
<p>Personally, I use and recommend <tt>cperl-mode</tt> which seems to
be quite actively maintained and has just about every feature I could
ever want. You can find the latest release here: <htmlurl
url="ftp://ftp.math.ohio-state.edu/pub/users/ilya/emacs"
name="ftp://ftp.math.ohio-state.edu/pub/users/ilya/emacs">.
<p>But don't take my word for it. Try them both and pick the one that
best meets your needs.
</sect2>
<sect2>Python
<p>Python (another very popular scripting language) has an Emacs mode
available for it as well. As far as I can tell, it is <em>not</em>
distributed with GNU Emacs but it distributed with XEmacs. It works
quite well in both editors, though.
<p>You can get <tt>python-mode</tt> from the official Python web site
<htmlurl url="http://www.python.org/emacs/python-mode/"
name="http://www.python.org/emacs/python-mode/">.
</sect2>
<sect2>Others
<p>There are many many other editing modes available to help out
programmers. Such modes help out with things like:
<itemize>
<item>Shell Scripts (Bash, sh, ksh, csh, ...)
<item>Awk, Sed, Tcl, ...
<item>Makefiles
<item>Change Logs
<item>Documentation
<item>Debugging
</itemize>
<p>And much more. See the last section of this document for more
information on finding other modes and add-ins.
</sect2>
</sect1>
<sect1>Authoring
<p>Fancy Emacs modes are <em>not</em> limited to just those who write
code. Folks writing documentation (of any sorts) can also benefit from
a wide selection of Emacs modes.
<sect2>Spell-Checking (<tt>ispell</tt> mode)
<p>Authors of many types of documents need to spell-check once in a
while. If you have <bf>GNU ispell</bf> installed, you can type <tt>M-x
ispell</tt> and spell-check the current buffer. If ispell finds words
that it doesn't know, it prompts you with a list of possible
replacements and lets you select one (or none) of them. It's
functionally equivalent to the spell-checkers in many popular non-free
software packages.
</sect2>
<sect2>HTML (<tt>html-helper</tt> mode)
<p>If you find yourself writing HTML files once in a while (or even a
lot), you might want to try out <tt>html-helper-mode</tt>. It is
available from <htmlurl url="http://www.santafe.edu/~nelson/tools/"
name="http://www.santafe.edu/~nelson/tools/"> as is the documentation
and related stuff.
<p>As its name suggests, <tt>html-helper-mode</tt> provides lots of
things to help out those folks who still write HTML by hand--the old
fashioned way.
</sect2>
<sect2>TeX (<tt>tex-mode</tt>)
<p>When you're writing documents in TeX, it's often helpful to get
Emacs to add some color and highlight the backslashes, braces and
other characters. <tt>tex-mode</tt> takes care of that for you.
<p>Though I don't write much directly in TeX anymore, when I did this
mode proved to be quite helpful in making my TeX source a bit more
readable.
</sect2>
<sect2>SGML (<tt>sgml-mode</tt>)
<p>The document you're now reading was written in SGML (and probably
converted to the format you're reading it in). <tt>sgml-mode</tt>
provides all the basics for SGML documents: validation, highlighting,
forward-tag, backward-tag, and much more. It is a standard part of
Emacs.
</sect2>
</sect1>
<sect1>Other Modes
<p>Of course, there are lots of other handy modes to make life
easier. Here's just a sampling of the popular ones:
<sect2>Version Control (<tt>vc</tt> mode)
<p><tt>vc</tt> mode interfaces with most of the popular version
control back-ends (RCS, SCCS, CVS) to make it very easy to check files
in and out, manage releases and so on. It is a standard part of Emacs
and is documented in the Emacs documentation.
</sect2>
<sect2>Shell Mode
<p>Why switch to another X window or virtual console just to run a few
shell commands? Do it from within Emacs and save yourself the
trouble. <tt>:-)</tt>
<p><tt>M-x shell</tt> will launch a shell within an Emacs buffer. You
can do most things with this buffer that you could do with a normal
shell prompt (except for running full screen programs like <tt>vi</tt>
or <tt>pine</tt>) because Emacs is talking to your real shell behind
the scenes.
<p>This is a standard part of Emacs, too, so you'll find it documented
in the Emacs docs.
</sect2>
<sect2>Telnet and FTP
<p>Why switch to another X window or virtual console just to run telnet
or FTP? Do it from within Emacs and save yourself the
trouble. (Notice the pattern yet?)
<p>Just like running a shell inside of Emacs, you can telnet and
ftp. Try <tt>M-x telnet</tt> or <tt>M-x ftp</tt> to experience it for
yourself. See the documentation for all the gory details.
</sect2>
<sect2>Man
<p>Why switch to another X window or virtual console just to read a
manual page? Do it from within Emacs and save yourself the
trouble. (I promise. I'll stop.)
<p>Just like running a shell inside of Emacs, you can read manual
pages. Try <tt>M-x man</tt> to experience it for yourself. See the
documentation for more.
</sect2>
<sect2>Ange-FTP
<p>To quote the <tt>ange-ftp</tt> documentation:
<quote>
This package attempts to make accessing files and directories using
FTP from within GNU Emacs as simple and transparent as possible. A
subset of the common file-handling routines are extended to interact
with FTP.
</quote>
<p>That means you can treat files on remote machines as if there were
local. So if you need to edit a file on a different computer, just
tell Emacs to open it (using a slightly different path syntax) and it
takes care of all the details of logging in and retrieving the
file. Then, when you save the file via <tt>C-x C-s</tt>,
<tt>ange-ftp</tt> intercepts the save and writes the file back to the
remote machine.
<p>The slightly different path syntax goes like this... A file named
``myfile'', in a ``user'''s directory, on a machine named
``my.host.org'' can be opened by opening (<tt>C-x f</tt>) the file:
<quote><tt>/user@my.host.org:~user/myfile</tt></quote>
<p>This, also, is a standard part of the Emacs distribution so you can
find it documented in the Emacs documentation.
<p>Thanks to Etienne Grossmann (<htmlurl name =
"etienne@anonimo.isr.ist.utl.pt" url =
"mailto:etienne@anonimo.isr.ist.utl.pt">) for the example above.
</sect2>
</sect1>
</sect>
<!-- ********************************************* -->
<sect>Customizing Emacs <label id="customizing_emacs">
<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).
<sect1>Temporary Customization
<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 <tt>C-x C-c</tt> 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 <tt>.emacs</tt> file so
that they take effect every time you start Emacs. This is discussed in
the next section.
<sect2>Variable Assignments
<p>The easiest customizations are accomplished by changing the value
of a variable in Emacs. The list code to do this looks like this:
<verb>
(setq variable-name new-value)
</verb>
<p>Where <tt>variable-name</tt> is the name of the variable and
<tt>new-value</tt> is the value you'd like to give the variable. (In
Lisp-speak, you're binding a variable to a value.) The <tt>setq</tt>
function in lisp is analogous to the assignment operators (usually
<tt>=</tt>) in other programming languages.
<p><bf>NOTE:</bf> I'm glossing over many details here for the sake of
simplicity. You may also see me or others use the Lisp functions
<tt>set</tt> and even <tt>setq-default</tt>. If you're really curious,
feel free to look them up in an Emacs Lisp reference.
<p>Let's look at a line from my <tt>.emacs</tt> file
<verb>
(setq-default transient-mark-mode t)
</verb>
<p>The variable <tt>transient-mark-mode</tt> 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 <tt>transient-mark-mode</tt> variable is set (to a non-nil
value).
<p>A <em>WHAT</em> value?
<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>True is usually written as <tt>t</tt> and false (or null) is
written as <tt>nil</tt>. Like in other languages, though, any non-nill
value is considered true.
<p>To get the full description of what <tt>transient-mark-mode</tt>
does, you can use the on-line help. Type <tt>C-h v</tt> or <tt>M-x
describe-variable</tt> and then <tt>transient-mark-mode</tt>. If
you're lazy like me, you can take advantage of variable name
completion using the <tt>Tab</tt> key. Just type part of the variable
name and hit the <tt>Tab</tt> 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>Another variable that folks often set is <tt>fill-column</tt>. It
tells Emacs how wide the screen should be for the purposes of
word-wrapping (and <tt>auto-fill-mode</tt> respects this value). To
set the value to something absurd, you could type:
<verb>
(setq fill-column 20)
</verb>
<p>But that won't actually do anything. You need to tell Emacs to
<bf>evaluate</bf> the expression you typed. To do so, put the point
(cursor) at the end of the expression end then type <tt>C-x C-e</tt>,
which calls the function <tt>eval-last-sexp</tt> in case you
care. When you do that, notice that <tt>20</tt> (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>Just to prove that it works, type a sentence or two. If you happen
to have <tt>auto-fill-mode</tt> enabled (you probably don't), you'll
notice the text wrapping at the 20 column mark. Otherwise, after
you've typed some stuff, type <tt>M-q</tt> which calls the function
<tt>fill-paragraph</tt>. It will then perform the word wrapping.
</sect2>
<sect2>File Associations
<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 <tt>text-mode</tt> every time I open a file with a
<tt>.txt</tt> extension. Well, that already happens. <tt>:-)</tt> So
let's tell Emacs to always enter <tt>text-mode</tt> when you open a
file named ``README''.
<verb>
(setq auto-mode-alist (cons '("README" . text-mode) auto-mode-alist))
</verb>
<p>Huh?
<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 <tt>auto-mode-alist</tt> 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
<tt>README</tt>) Emacs starts the mode you specified.
<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
<tt>auto-mode-alist</tt> without making sure the values that it
already contains aren't lost.
<p>And if I wanted Emacs to automatically switch to
<tt>html-helper-mode</tt> every time that I opened a file that ended
with <tt>.html</tt> or <tt>.htm</tt>, I would add this to my .emacs
file:
<verb>
(setq auto-mode-alist (cons '("\\.html$" . html-helper-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("\\.htm$" . html-helper-mode) auto-mode-alist))
</verb>
<p>The possibilities are truly endless.
</sect2>
</sect1>
<sect1>Using a <tt>.emacs</tt> File
<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 <tt>.emacs</tt> 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 <bf>you</bf> want it do work. It's a shame that
more software products don't let you do that.
<p>In case you haven't already guessed, every time you start Emacs, it
looks for a file named <tt>.emacs</tt> in your home directory. Your
<tt>.emacs</tt> 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>Another example from my <tt>.emacs</tt> file:
<verb>
(setq inhibit-startup-message t)
</verb>
<p>The <tt>inhibit-startup-message</tt> 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>As an exercise, try creating a <tt>.emacs</tt> file of your own and
add that line to it. Then exit and start Emacs again. You should not
see the welcome message.
<p>Often times when your read about an Emacs mode (or a package), the
documentation will suggest some code to add to your <tt>.emacs</tt>
file in order to make the mode or package work in a particular way.
<p>The GNU Emacs FAQ (<tt>C-h F</tt>) contains some items related to
<tt>.emacs</tt> files that you might find useful.
</sect1>
<sect1>The Customize Package
<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 <tt>customize</tt> was born.
<p>Customize provides a more intuitive method of customizing parts of
Emacs. To try it out, either visit the <tt>Customize</tt> sub-menu in
your <tt>Help</tt> menu, or type <tt>M-x customize</tt>.
<p>Customize groups customization into logical groups like
``Editing'', ``Programming'', ``Files'', and so on. Some groups
contain sub-groups.
<p>If you make changes using the customize interface, Emacs will save
the changes to your <tt>.emacs</tt> file. That's rather handy, because
you can easily inspect (and change) the changes it made for you.
<p><em>I don't use the Customize interface, so I can't say much more
about it.</em>.
</sect1>
<sect1>X Windows Display
<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 <tt>xterm</tt>,
<tt>nxterm</tt>, or whatever.
<p>Here's the relevant bit of my <tt>~/.Xdefaults</tt> file:
<verb>
emacs*Background: DarkSlateGray
emacs*Foreground: Wheat
emacs*pointerColor: Orchid
emacs*cursorColor: Orchid
emacs*bitmapIcon: on
emacs*font: fixed
emacs.geometry: 80x25
</verb>
<p>See your <tt>X</tt> manual page for more details about X resources.
<p>Chris Gray (<htmlurl name="cgray4@po-box.mcgill.ca" url="mailto:cgray4@po-box.mcgill.ca">) also notes:
<quote>In Debian, the <tt>~/.Xdefaults</tt> doesn't seem to be used.
However, Debian people can put what you have given in
<tt>/etc/X11/Xresources/emacs</tt> and they can have the pretty colors
that they had when they were using RedHat.</quote>
</sect>
<!-- ********************************************* -->
<sect>Popular Packages <label id="popular_packages">
<p>In addition to the many different modes available for Emacs, there
are also many add-on <bf>packages</bf>. I call them packages because
they're more than just new modes. They often include extra utilities
or are so large that calling them modes just doesn't seem to do them
justice. In still other cases, they are software which extends or
integrates other Emacs modes and packages. The distinction isn't
entirely clear, but that's okay.
<sect1>VM (Mail)
<p>To quote the VM FAQ:
<quote>
VM (View Mail) is an Emacs subsystem that allows mail to be read and
disposed of within Emacs. Commands exist to do the normal things
expected of a mail user agent, such as generating replies, saving
messages to folders, deleting messages and so on. There are other more
advanced commands that do tasks like bursting and creating digests,
message forwarding, and organizing message presentation according to
various criteria.
</quote>
<p>When I first began using Emacs, I tried VM out for a while. I found
it to be a great replacement for Pine, Elm, or most any other mail
program. But I didn't want to use separate programs to read mail and
news. VM is actively developed and well supported today.
<p>It is available here: <htmlurl url="http://www.wonderworks.com/vm/"
name="http://www.wonderworks.com/vm/">.
</sect1>
<sect1>Gnus (Mail and News)
<p>To quote the GNUS Manual:
<quote>
Gnus is a message-reading laboratory. It will let you look at just
about anything as if it were a newsgroup. You can read mail with it,
you can browse directories with it, you can ftp with it---you can even
read news with it!
</quote>
<quote>
Gnus tries to empower people who read news the same way Emacs empowers
people who edit text. Gnus sets no limits to what the user should be
allowed to do. Users are encouraged to extend Gnus to make it behave
like they want it to behave. A program should not control people;
people should be empowered to do what they want by using (or abusing)
the program.
</quote>
<p>GNUS is what I currently use for mail and news (as hinted
above). GNUS is also actively developed and well supported today.
<p>It is available here: <htmlurl url="http://www.gnus.org/"
name="http://www.gnus.org/">.
</sect1>
<sect1>BBDB (A rolodex)
<p>BBDB is an Insidious Big Brother Database, a rolodex-like program
for Emacs that works with most of the popular Emacs Mail packages (VM
and GNUS included).
<p>It is available here: <htmlurl
url="http://pweb.netcom.com/~simmonmt/bbdb/index.html"
name="http://pweb.netcom.com/~simmonmt/bbdb/index.html">.
</sect1>
<sect1>AucTeX (another TeX mode)
<p>AucTeX is another mode for editing TeX files.
<p>To quote the AucTeX web site:
<quote>
AUC TeX is an extensible package that supports writing and formatting
TeX files for most variants of GNU Emacs. Many different macro
packages are supported, including AMS TeX, LaTeX, and TeXinfo.
</quote>
<p>It is available here: <htmlurl url="http://sunsite.auc.dk/auctex/"
name="http://sunsite.auc.dk/auctex/">.
</sect1>
</sect>
<!-- ********************************************* -->
<sect>Other Resources <label id="other_resources">
<p>This section covers books, web sites, newsgroups, mailing lists,
and other places you can find more information about Emacs.
<sect1>Books
<p>There are a a few really good books available for learning
Emacs. In addition to these, you'll find that many Linux and Unix
books also contain a chapter or two about Emacs (and <tt>vi</tt>).
<sect2>Learning GNU Emacs
<p>Authors: Debra Cameron, Bill Rosenblatt, Eric S. Raymond
<p>Publisher: O'Reilly &amp; Associates - <htmlurl
url="http://www.ora.com/" name="http://www.ora.com/">
<p><bf>Commentary:</bf> This is probably the best book to start
with. After you've read the HOWTO and looked through the FAQ this book
serves as a comprehensive and very approachable tutorial.
</sect2>
<sect2>Writing GNU Emacs Extensions
<p>Author: Bob Glickstein
<p>Publisher: O'Reilly &amp; Associates - <htmlurl
url="http://www.ora.com/" name="http://www.ora.com/">
<p><bf>Commentary:</bf> After you've used Emacs for a while and have
decided that you'd like to try writing your own mode or maybe try out
some advanced customization, this is the book for you. While it
doesn't attempt to teach Lisp, it does contain a brief introduction to
the language.
</sect2>
<sect2>Programming in Emacs Lisp: An Introduction
<p>Author: Robert J. Chassell
<p>From the README file:
<quote>
This is an elementary introduction to programming in Emacs Lisp for
people who are not programmers, and who are not necessarily interested
in programming, but who do want to customize or extend their computing
environment.
</quote>
<p>You can retrieve the manual in its entirety via anonymous FTP from
the GNU FTP server: <htmlurl url="ftp://prep.ai.mit.edu/gnu/emacs/"
name="ftp://prep.ai.mit.edu/gnu/emacs/">.
<p><bf>Commentary:</bf> This a good introductory manual for Emacs
Lisp--even if you're not a heavy-duty programmer.
</sect2>
<sect2>The GNU Emacs Lisp Reference Manual
<p>Author: Richard Stallman
<p>Publisher: The Free Software Foundation - <htmlurl
url="http://www.fsf.org/" name="http://www.fsf.org/">
<p>You can retrieve the manual in its entirety via anonymous FTP from
the GNU FTP server: <htmlurl url="ftp://prep.ai.mit.edu/gnu/emacs/"
name="ftp://prep.ai.mit.edu/gnu/emacs/">.
<p><bf>Commentary:</bf> This is the definitive guide to the Emacs Lisp
programming language.
</sect2>
</sect1>
<sect1>Web Sites
<sect2>EMACSulation
<p>EMACSulation is a column written by Eric Marsden that appears in
the on-line magazine Linux Gazette located at <htmlurl
url="http://www.linuxgazette.com/"
name="http://www.linuxgazette.com/">. The most recent column as of
this writing is located at <htmlurl
url="http://www.linuxgazette.com/issue39/marsden.html"
name="http://www.linuxgazette.com/issue39/marsden.html">. Scan to the
bottom of the article for links to previous ones.
</sect2>
</sect1>
<sect1>Newsgroups
<p>Search you local news feed for newsgroups which contain the string
``emacs'' and you'll probably find many. Those which my server carries
are:
<itemize>
<item>comp.emacs
<item>comp.emacs.sources
<item>gnu.emacs
<item>gnu.emacs.bug
<item>gnu.emacs.help
<item>gnu.emacs.sources
</itemize>
</sect1>
<sect1>Mailing Lists
<p>There is a mailing list for GNU Emacs which is hosted by the Free
Software Foundation. See the web site <htmlurl
url="http://mail.gnu.org/mailman/listinfo/help-gnu-emacs"
name="http://mail.gnu.org/mailman/listinfo/help-gnu-emacs"> for more
information.
<p>The only mailing list devoted to Emacs that I know of right now is
the NT-Emacs list. It is a list for folks who are using the Micro$oft
Windows version of Emacs. See the NT-Emacs FAQ <htmlurl
url="http://www.cs.washington.edu/homes/voelker/ntemacs.html"
name="http://www.cs.washington.edu/homes/voelker/ntemacs.html"> for
more information.
</sect1>
<sect1>The Emacs Lisp Archive
<p>From the Emacs Lisp Archive README:
<quote>
The Emacs Lisp archives on ftp.cis.ohio-state.edu contain
various pieces and packages of Emacs Lisp code. Emacs Lisp is the
language used to extend the GNU Emacs editor published by the Free
Software Foundation. Although much Emacs Lisp code is included in the
GNU Emacs distribution, many people have written packages to interface
with other systems, to better support editing the programming language
they use, to add new features, or to change Emacs' default behavior.
Most of the contents of this archive have been written by individuals
and distributed publicly over the Internet through the info-emacs or
info-gnu-emacs mailing lists or the comp.emacs, gnu.emacs, or
gnu.emacs.sources newsgroups.
</quote>
<p>The archives are available via anonymous FTP from <htmlurl
url="ftp://ftp.cis.ohio-state.edu/pub/emacs-lisp/"
name="ftp://ftp.cis.ohio-state.edu/pub/emacs-lisp/">.
<p><bf>NOTE:</bf> As far as I can tell, the Emacs Lisp Archive is
slowly becoming out of date. I see very few new (or updated) packages
appearing there, though I know they exist. They <em>do</em> get posted
to the <tt>comp.emacs.sources</tt> newsgroup. (Feel free to correct me
if this is wrong.)
</sect1>
</sect>
<!-- ********************************************* -->
<sect>Credits <label id="credits">
<p>The following people have contributed to the success of this
document.
<itemize>
<item>Craig Lyons <htmlurl name = "Craig.Lyons@compaq.com"
url="mailto:Craig.Lyons@compaq.com">
<item>Robert Vollmert <htmlurl name = "rvollmer@gmx.net"
url="mailto:rvollmer@gmx.net" >
<item>Larry Brasfield <htmlurl name = "larrybr@seanet.com"
url="mailto:larrybr@seanet.com">
<item>Etienne Grossmann <htmlurl name =
"etienne@anonimo.isr.ist.utl.pt" url =
"mailto:etienne@anonimo.isr.ist.utl.pt">
<item>Thomas Weinell <htmlurl name = "kf6mli@amsat.org" url =
"mailto:kf6mli@amsat.org">
<item>Adam C. Finnefrock <htmlurl name =
"adam@bigbro.biophys.cornell.edu" url =
"mailto:adam@bigbro.biophys.cornell.edu">
<item>Chris Gray <htmlurl name="cgray4@po-box.mcgill.ca"
url="mailto:cgray4@po-box.mcgill.ca">
<item>Robert J. Chassell <htmlurl name="bob@rattlesnake.com"
url="mailto:bob@rattlesnake.com">
<item>Isaac To <htmlurl name="kkto@csis.hku.hk"
url="mailto:kkto@csis.hku.hk">
<item>Matteo Valsasna <htmlurl name="valsasna@elet.polimi.it"
url="mailto:valsasna@elet.polimi.it">
<item>Tijs van Bakel <htmlurl name="smoke@casema.net"
url="mailto:smoke@casema.net">
</itemize>
</sect>
</article>