| ||||||
|
|
Go to the previous, next chapter. Compiling and Testing ProgramsThe previous chapter discusses the Emacs commands that are useful for making changes in programs. This chapter deals with commands that assist in the larger process of developing and maintaining programs.
Running Compilations under EmacsEmacs can run compilers for noninteractive languages such as C and Fortran as inferior processes, feeding the error log into an Emacs buffer. It can also parse the error messages and show you the source lines where compilation errors occurred.
To run When the shell command line is read, the minibuffer appears containing a default command line, which is the command
you used the last time you did M-x compile. If you type just RET,
the same command line is used again. For the first M-x
compile, the default is make -k. The default compilation command
comes from the variable Starting a compilation displays the buffer *compilation* in another window but does not select it. The buffer's mode line tells you whether compilation is finished, with the word run or exit inside the parentheses. You do not have to keep this buffer visible; compilation continues in any case. While a compilation is going on, the string Compiling appears in the mode lines of all windows. When this string disappears, the compilation is finished. To kill the compilation process, do M-x kill-compilation. When the compiler process terminates, 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 exist at any time. However, M-x compile asks for confirmation before actually killing a compilation that is running. The *compilation* buffer uses a special major mode, Compilation mode. This mode provides the keys SPC and DEL to scroll by screenfuls, and M-n and M-p to move to the next or previous error message. You can also use M-{ and M-} to move up or down to an error message for a different source file. You can visit the source for any particular error message by moving point
in *compilation* to that error message and
typing RET ( To parse the compiler error messages sequentially,
type C-x ` ( The first time C-x ` is used after the start of a compilation, it moves to the first error's location. Subsequent uses of C-x ` advance down to subsequent errors. If you visit a specific error message with RET or Mouse-2, subsequent C-x ` commands advance from there. When C-x ` gets to the end of the buffer and finds no more error messages to visit, it fails and signals an Emacs error. C-u C-x ` starts scanning from the beginning of the compilation buffer. This way, you can process the same set of errors again. Just as you can run a compiler, you can also run Note: a shell is used to run the compile command, but the shell is told that it should be noninteractive. This means in particular 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 init file by setting the prompt unconditionally. (The init file name may be .profile, .cshrc, .shrc, or various other things, depending on the shell you use.) The shell init file should set the prompt only if there already is a prompt. In csh, here is how to do it: if ($?prompt) set prompt = ... And here's how to do it in bash:
if [ "${PS1+set}" = set ]
then prompt=...
fi
There may well be other things that your shell's init file ought to do only for an interactive shell. You can use the same method to conditionalize them. The features of Compilation mode are also available in a minor mode called Compilation Minor mode. This lets you parse error messages in any buffer, not just a normal compilation output buffer. Type M-x compilation-minor-mode to enable the minor mode. This defines the keys RET and Mouse-2, as in the Compilation major mode. In an Rlogin buffer (see section Remote Host Shell), Compilation minor mode automatically accesses remote source files by FTP (see section File Names). The MS-DOS ``operating system'' does not support asynchronous subprocesses; to work around this lack, M-x compile runs the compilation command synchronously on MS-DOS. As a consequence, you must wait until the command finishes before you can do anything else in Emacs. See section MS-DOS Issues. Running Debuggers Under EmacsThe GUD (Grand Unified Debugger) library provides an interface to various symbolic debuggers from within Emacs. We recommend the debugger GDB, which is free software, but you can also run DBX, SDB or XDB if you have them. GUD can also serve as an interface to the Perl's debugging mode.
Starting GUDThere are five commands for starting a debugger, each corresponding to a particular debugger program.
You can only run one debugger process at a time. Each of these commands takes one argument: a command line to invoke the debugger. In the simplest case, specify just the name of the executable file you want to debug. You may also use options that the debugger supports. However, shell wild cards and variables are not allowed. GUD assumes that the first argument not preceded by a - is the executable file name. Debugger OperationWhen you run a debugger with GUD, the debugger uses an Emacs buffer for its ordinary input and output. This is called the GUD buffer. The debugger displays the source files of the program by visiting them in Emacs buffers. An arrow (=>) in one of these buffers indicates the current execution line. Moving point in this buffer does not move the arrow. You can start editing these source files at any time in the buffers that were made to display them. The arrow is not part of the file's text; it appears only on the screen. If you do modify a source file, keep in mind that inserting or deleting lines will throw off the arrow's positioning; GUD has no way of figuring out which line corresponded before your changes to the line number in a debugger message. Also, you'll typically have to recompile and restart the program for your changes to be reflected in the debugger's tables. If you wish, you can control your debugger process entirely through the debugger buffer, which uses a variant of Shell mode. All the usual commands for your debugger are available, and you can use the Shell mode history commands to repeat them. See section Shell Mode. Commands of GUDThe GUD interaction buffer uses a variant of Shell mode, so the commands of Shell mode are available (see section Shell Mode). GUD mode also provides commands for setting and clearing breakpoints, for selecting stack frames, and for stepping through the program. These commands are available both in the GUD buffer and globally, but with different key bindings. The breakpoint commands are usually used in source file buffers, because that is the way to specify where to set or clear the breakpoint. Here's the global command to set a breakpoint:
Here are the other special commands provided by GUD. The keys starting with C-c are available only in the GUD interaction buffer. The bindings that start with C-x C-a are available in the GUD buffer and also in source files.
The above commands are common to all supported debuggers. If you are using GDB or (some versions of) DBX, these additional commands are available:
If you are using GDB, these additional key bindings are available:
These commands interpret a numeric argument as a repeat count, when that makes sense. GUD CustomizationOn startup, GUD runs one of the following hooks: Here is a convenient way to define a command that sends a particular command string to the debugger, and set up a key binding for it in the debugger interaction buffer: (gud-def function cmdstring binding docstring) This defines a command named function
which sends cmdstring to the debugger process, and gives it the documentation string docstring. You can use the command thus defined in any buffer.
If binding is non- The command string cmdstring may contain certain %-sequences that stand for data to be filled in at the time function is called:
Executing Lisp ExpressionsEmacs has several different major modes for Lisp and Scheme. They are the same in terms of editing commands, but differ in the commands for executing Lisp expressions. Each mode has its own purpose.
Libraries of Lisp Code for EmacsLisp code for Emacs editing commands is stored in files whose names conventionally end in .el. This ending tells Emacs to edit them in Emacs-Lisp mode (see section Executing Lisp Expressions). To execute a file of Emacs Lisp code, use M-x load-file. This command reads a file name using the minibuffer and then executes the contents of that file as Lisp code. It is not necessary to visit the file first; in any case, this command reads the file as found on disk, not text in an Emacs buffer. Once a file of Lisp code is installed in the Emacs Lisp library directories, users can
load it using M-x load-library. Programs can load it by calling M-x load-library differs from M-x load-file in that it searches a sequence of directories and tries three file names in each directory. Suppose your argument is lib; the three names are lib.elc, lib.el, and lastly just lib. If lib.elc exists, it is by convention the result of compiling lib.el; it is better to load the compiled file, since it will load and run faster. If Because the argument to The sequence of directories searched by M-x load-library is specified by the
variable Often you do not have to give any command to load a
library, because the commands defined in the library are set up to autoload
that library. Trying to run any of those commands calls Emacs Lisp code can be compiled into byte-code which loads faster, takes up less space
when loaded, and executes faster. See section 'Byte Compilation'
in the Emacs Lisp Reference Manual. By convention, the compiled code for a
library goes in a separate file whose name consists of the library source file with c
appended. Thus, the compiled code for foo.el goes in foo.elc. That's why
Evaluating Emacs-Lisp ExpressionsLisp programs intended to be run in Emacs should be edited in Emacs-Lisp mode; this happens automatically for file names ending in .el. By contrast, Lisp mode itself is used for editing Lisp programs intended for other Lisp systems. To switch to Emacs-Lisp mode explicitly, use the command M-x emacs-lisp-mode. For testing of Lisp programs to run in Emacs, it is often useful to evaluate part of the program as it is found in the Emacs buffer. For example, after changing the text of a Lisp function definition, evaluating the definition installs the change for future calls to the function. Evaluation of Lisp expressions is also useful in any kind of editing, for invoking noninteractive functions (functions that are not commands).
M-: ( M-: can easily confuse users who do not understand it. Therefore, In Emacs-Lisp mode, the key C-M-x is bound to the command C-M-x treats The command C-x C-e ( If C-M-x or C-x C-e is given a numeric argument, it inserts the value into the current buffer at point, rather than displaying it in the echo area. The argument's value does not matter. The most general command for evaluating Lisp
expressions from a buffer is Lisp Interaction BuffersThe buffer *scratch* which is selected when Emacs starts up is provided for evaluating Lisp expressions interactively inside Emacs. The simplest way to use the *scratch* buffer is to insert Lisp expressions and type LFD after each expression. This command reads the Lisp expression before point, evaluates it, and inserts the value in printed representation before point. The result is a complete typescript of the expressions you have evaluated and their values. The *scratch* buffer's major mode is Lisp Interaction mode, which is the same as Emacs-Lisp mode except for the binding of LFD. The rationale for this feature is that Emacs must have a buffer when it starts up, but that buffer is not useful for editing files since a new buffer is made for every file that you visit. The Lisp interpreter typescript is the most useful thing I can think of for the initial buffer to do. Type M-x lisp-interaction-mode to put the current buffer in Lisp Interaction mode. Running an External LispEmacs has facilities for running programs in other Lisp systems. You can run a Lisp process as an inferior of Emacs, and pass expressions to it to be evaluated. You can also pass changed function definitions directly from the Emacs buffers in which you edit the Lisp programs to the inferior Lisp process. To run an inferior Lisp process, type M-x run-lisp. This runs the program
named To give input to Lisp, go to the end of the buffer and type the input, terminated by RET. The *lisp* buffer is in Inferior Lisp mode, which combines the special characteristics of Lisp mode with most of the features of Shell mode (see section Shell Mode). The definition of RET to send a line to a subprocess is one of the features of Shell mode. For the source files of programs to run in external Lisps, use Lisp mode. This mode can be selected with M-x lisp-mode, and is used automatically for files whose names end in .l, .lsp, or .lisp, as most Lisp systems usually expect. When you edit a function in a Lisp program you are running, the easiest way to send the
changed definition to the inferior Lisp process is the key C-M-x. In Lisp mode,
this runs the function Contrast the meanings of C-M-x in Lisp mode (for editing programs to be run in another Lisp system) and Emacs-Lisp mode (for editing Lisp programs to be run in Emacs): in both modes it has the effect of installing the function definition that point is in, but the way of doing so is different according to where the relevant Lisp environment is found. See section Executing Lisp Expressions.
|
|
|
Email addresses listed on this site may NOT be used for unsolicited commercial email. Ready-to-Run Software, Inc Privacy Statement Portions (c)Copyright, 1996-2005 by
Ready-to-Run
Software, Inc |