[comp.emacs] jump to compiler error line in editor GNU Emacs' compile mode ad

Dan_Jacobson@ATT.COM (02/21/91)

A former office mate of mine asked about not having to worry about
moving the cursor himself to the line with a compiler error in his
editor.  Well, I couldn't resist the urge to share my response with
the net, in the hope I can create more GNU Emacs converts.
GNU Emacs is available by anonymous ftp to prep.ai.mit.edu.  Also see
the *.emacs.* and gnu.* newsgroups.
-----
[begin]

GNU Emacs has been doing this for years, and as you might have read
from its manual, has two vi emulation modes --- "VIP" mode has its own
manual too.

A GNU Emacs user rarely is aware of line numbers any more than inode
numbers.  The commands in question are

ESC x compile:
Compile the program including the current buffer.  Default: run `make'.
Runs COMMAND, a shell command, in a separate process asynchronously
with output going to the buffer *compilation*.
You can then use the command C-x ` to find the next error message
and move to the source code that caused it.

ESC x grep:
Run grep, with user-specified args, and collect output in a buffer.
While grep runs asynchronously, you can use the C-x ` command
to find the text that grep hits refer to.

We see in the GNU Emacs manual, furthermore

--------

File: emacs  Node: Compilation, Prev: Running, Up: Running, Next: Lisp Modes

Running `make', or Compilers Generally
======================================

  Emacs 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 visit the files in which errors
are found, moving point right to the line where the error occurred.

`M-x compile'     
     Run a compiler asynchronously under Emacs, with error messages to
     `*compilation*' buffer.
`M-x grep'     
     Run `grep' asynchronously under Emacs, with matching lines
     listed in the buffer named `*compilation*'.
`M-x kill-compiler'     
`M-x kill-grep'     
     Kill the running compilation or `grep' subprocess.
`C-x `'     
     Visit the locus of the next compiler error message or `grep' match.

  To run `make' or another compiler, do `M-x compile'.  This command
reads a shell command line using the minibuffer, and then executes the
specified command line in an inferior shell with output going to the buffer
named `*compilation*'.  The current buffer's default directory is used
as the working directory for the execution of the command; normally,
therefore, the makefile comes from this directory.

  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.  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' (*Note File Variables::).

  Starting a compilation causes the buffer `*compilation*' to be
displayed in another window but not selected.  Its 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.

  To kill the compilation process, do `M-x kill-compilation'.  You will see
that 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, this requires
confirmation before actually killing a compilation that is running.

  To parse the compiler error messages, type `C-x `' (`next-error').  The
character following the `C-x' is the grave accent, not the single
quote.  This 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 displayed.

  The first time `C-x `' is used after the start of a compilation, it
parses all the error messages, visits all the files that have error
messages, and makes markers pointing at the lines that the error messages
refer to.  Then it 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 the compiler errors while the compilation is still going on.  If no
more 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 over again, then displaying 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 `grep' when running
it normally: a `grep'-style regexp (usually in singlequotes to quote
the shell's special characters) followed by filenames which may use wildcards.
The output from `grep' goes in the `*compilation*' buffer and the
lines that matched can be found with `C-x `' as if they were compilation
errors.

  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 (`.cshrc' or `.shrc' or
...) by setting the prompt unconditionally.  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 = ... 

------
[(Dan J. back again)  Disclaimer: there may be ways to do this in the
/usr/bin/vi program (as opposed to one of GNU Emacs' vi emulations).]


Furthermore, when one runs GDB, the GNU debugger, one can get an arrow
in GNU EMacs pointing at the current source line being debugged.
-- 
Dan_Jacobson@ATT.COM  Naperville IL USA  +1 708-979-6364

ng@cfd.di.nrc.ca (Kai Ng) (02/21/91)

In article <DANJ1.91Feb20114049@cbnewse.ATT.COM>, Dan_Jacobson@ATT.COM writes:
|> 
|> ESC x compile:
|> Compile the program including the current buffer.  Default: run `make'.
|> Runs COMMAND, a shell command, in a separate process asynchronously
|> with output going to the buffer *compilation*.
|> You can then use the command C-x ` to find the next error message
|> and move to the source code that caused it.
|> 

Yes, it is one of the best feature of GNU Emacs, but it doesn't work
in AIX 3002 (with GNU Emacs 18.57 with X11 support). Has anybody encountered
the same problem and have a solution?

The other nice feature is dynamic abbreviation and global/mode abbreviation.
Again, the global/mode abbreviation doen't work. It insists on putting a '-'
at the end of an expansion. Help me please!

-- 
-----------------------------------------------------------------------------
Kai S. Ng                     Informatics, National Research Council Canada
INTERNET ng@cfd.di.nrc.ca     M-60 Montreal Road, Ottawa, Canada    K1A 0R6
BITNET   kain@nrcvm01.bitnet  VOICE (613) 993-0240       FAX (613) 954-2561

tporczyk@na.excelan.com (Tony Porczyk) (02/21/91)

The News Manager)
Nntp-Posting-Host: na
Reply-To: tporczyk@na.excelan.com (Tony Porczyk)
Organization: Novell, Inc. San Jose, California
References: <DANJ1.91Feb20114049@cbnewse.ATT.COM>
Date: Wed, 20 Feb 1991 20:44:29 GMT

In article <DANJ1.91Feb20114049@cbnewse.ATT.COM> Dan_Jacobson@ATT.COM writes:
>A former office mate of mine asked about not having to worry about
>moving the cursor himself to the line with a compiler error in his
>editor.  Well, I couldn't resist the urge to share my response with
>the net, in the hope I can create more GNU Emacs converts.

Thank you for this information. To those who deal mostly with PC editors,
such feat is easily achieved with QEdit (2.1 can do it for sure, I use it,
I don't know about the shareware 2.08 - email me if you have problems), and,
I believe, with Brief, but I'm not 100% sure - a Brief expert will help
me here.
It is indeed a very nice feature to have.

Tony

rmf@cs.columbia.edu (Robert M. Fuhrer) (02/22/91)

Well, since we're on the subject, the IBM RS/6000 XLC C compiler generates
pretty funny looking error messages.  The really unfortunate part is that
where compilation-error-regexp is expected to parse a file name and line
number, the XLC compiler's messages don't include the file name.  Does anyone
have a solution?  I've really gotten used to this feature, and would hate to
see it go...
--

--------------------------
Robert M. Fuhrer
Computer Science Department
Columbia University
1117B Fairchild Building
Internet: rmf@cs.columbia.edu
UUCP:     ...!rutgers!cs.columbia.edu!rmf

barmar@think.com (Barry Margolin) (02/23/91)

In article <RMF.91Feb21171911@chopin.cs.columbia.edu> rmf@cs.columbia.edu (Robert M. Fuhrer) writes:
>Well, since we're on the subject, the IBM RS/6000 XLC C compiler generates
>pretty funny looking error messages.  The really unfortunate part is that
>where compilation-error-regexp is expected to parse a file name and line
>number, the XLC compiler's messages don't include the file name.  Does anyone
>have a solution?  I've really gotten used to this feature, and would hate to
>see it go...

If the compiler's messages don't include the file name, how do *humans*
figure out which file the message refers to?  If humans can't do it, then
we'd be hard pressed to teach a computer to do it.
--
Barry Margolin, Thinking Machines Corp.

barmar@think.com
{uunet,harvard}!think!barmar

rmf@cs.columbia.edu (Robert M. Fuhrer) (02/27/91)

>In article <RMF.91Feb21171911@chopin.cs.columbia.edu> rmf@cs.columbia.edu (Robert M. Fuhrer) writes:
>>Well, since we're on the subject, the IBM RS/6000 XLC C compiler generates
>>pretty funny looking error messages.  The really unfortunate part is that
>>where compilation-error-regexp is expected to parse a file name and line
>>number, the XLC compiler's messages don't include the file name.  Does anyone
>>have a solution?  I've really gotten used to this feature, and would hate to
>>see it go...
>
>If the compiler's messages don't include the file name, how do *humans*
>figure out which file the message refers to?  If humans can't do it, then
>we'd be hard pressed to teach a computer to do it.
>--
>Barry Margolin, Thinking Machines Corp.

Well, of course, the problem is that it doesn't include the file name
on each line.  I've since realized the way to do it is by
pre-processing the compilation buffer to insert the filename on each
line so as not to have to munge compilation-parse-errors.
--

--------------------------
Robert M. Fuhrer
Computer Science Department
Columbia University
1117B Fairchild Building
Internet: rmf@cs.columbia.edu
UUCP:     ...!rutgers!cs.columbia.edu!rmf