Emacs can run compilers for non-interactive languages like C and Fortran as inferior processes, feeding the error log into an Emacs buffer. It can also parse the error messages and visit the files in which errors are found, moving point to the line where the error occurred.
Run a compiler asynchronously under Emacs, with error messages to ‘*compilation*’ buffer.
grep asynchronously under Emacs, with matching lines
listed in the buffer named ‘*compilation*’.
Kill the process made by the
M-x compile command.
Kill the running compilation or
Visit the next compiler error message or
make or another compiler, type M-x compile. This
command reads a shell command line using the minibuffer, then executes
the specified command line in an inferior shell with output going to the
buffer named ‘*compilation*’. By default, the current buffer’s
default directory is used as the working directory for the execution of
the command; therefore, the makefile comes from this directory.
When the shell command line is read, the minibuffer appears containing a
default command line (the command you used the last time you typed
M-x compile). If you type just RET, the same command line is used
again. The first M-x compile provides
make -k as the default.
The default is taken from the variable
compile-command; if the
appropriate compilation command for a file is something other than
make -k, it can be useful to have the file specify a local value for
compile-command (see File Variables).
When you start a compilation, the buffer ‘*compilation*’ is displayed in another window but not selected. Its mode line displays the word ‘run’ or ‘exit’ in the parentheses to tell you whether compilation is finished. You do not have to keep this buffer visible; compilation continues in any case.
To kill the compilation process, type M-x kill-compilation. The mode line of the ‘*compilation*’ buffer changes to say ‘signal’ instead of ‘run’. Starting a new compilation also kills any running compilation, as only one can occur at any time. Starting a new compilation prompts for confirmation before actually killing a compilation that is running.
To parse the compiler error messages, type C-x `
next-error). The character following C-x is the grave
accent, not the single quote. The command displays the buffer
‘*compilation*’ in one window and the buffer in which the next
error occurred in another window. Point in that buffer is moved to the
line where the error was found. The corresponding error message is
scrolled to the top of the window in which ‘*compilation*’ is
The first time you use C-x ` after the start of a compilation, it parses all the error messages, visits all the files that have error messages, and creates markers pointing at the lines the error messages refer to. It then moves to the first error message location. Subsequent uses of C-x ` advance down the data set up by the first use. When the preparsed error messages are exhausted, the next C-x ` checks for any more error messages that have come in; this is useful if you start editing compiler errors while compilation is still going on. If no additional error messages have come in, C-x ` reports an error.
C-u C-x ` discards the preparsed error message data and parses the ‘*compilation*’ buffer again, then displays the first error. This way, you can process the same set of errors again.
Instead of running a compiler, you can run
grep and see the
lines on which matches were found. To do this, type M-x grep with
an argument line that contains the same arguments you would give to
grep-style regexp (usually in single quotes to
quote the shell’s special characters) followed by filenames, which may
use wildcard characters. The output from
grep goes in the
‘*compilation*’ buffer. You can use C-x ` to find the lines that
match as if they were compilation errors.
Note: a shell is used to run the compile command, but the shell is not
run in interactive mode. In particular, this means that the shell starts
up with no prompt. If you find your usual shell prompt making an
unsightly appearance in the ‘*compilation*’ buffer, it means you
have made a mistake in your shell’s initialization file (.cshrc
or .shrc or …) by setting the prompt unconditionally. The
shell initialization file should set the prompt only if there already is
a prompt. Here’s how to do it in
if ($?prompt) set prompt = ...