How to adjust the path that Emacs' compile-goto-error gets from the compilation buffer?
Asked Answered
T

3

15

I am using Emacs 23 and have the following problem:

I run our project's build system from within Emacs like M-x compile -> cd /foo/bar && ./build

The build system now does some magic, "cd"s into some subdirectory for the build process and then gcc throws an error:

../src/somesource.cc:50 error: blablabla

Now the problem is that Emacs won't find that path, because it assumes the compile process started out in /foo/bar, and not in /foo/bar/builddir. So the leading "../" is not working for Emacs, e.g. when running compile-goto-error. Is there a way to tell Emacs to try skipping leading "../"?

Tempietempla answered 4/5, 2012 at 14:41 Comment(1)
Strangely enough, I'm running into this when building Emacs...Madonna
C
17

The best solution might be to change the build system to emit messages when it changes directories. Emacs looks for

Entering directory `...'
... 
Leaving directory `...'

(See the compilation-directory-matcher variable. If your build system does emit messages when it changes directories, but they're not in the format Emacs is looking for, you can add new regexps to compilation-directory-matcher.)

The other solution is to change compilation-search-path (which is a list of directories).

Cermet answered 4/5, 2012 at 17:55 Comment(4)
I didn't know about the "Entering..." functionality of Emacs. That'll probably help!Tempietempla
@Arne, GNU Make prints messages in that form when using recursive makefiles. That's why Emacs looks for them.Cermet
This solution seems to be what I'm looking for, but I'm unable to edit compilation-directory-matcher variable (as you can see here : stackoverflow.com/q/21309720/61838). Moreover, the compilation-search-path doesn't seems to solve the problem (even when I only need emacs to look for sources in one directory). Any help would be appreciated!Predestine
GNU make was recently changed/fixed to use U+0027 instead of U+0060 for the opening quotes and your version of emacs may still be looking for the old U+0060 characters only. See savannah.gnu.org/bugs/?34530 Try something like: (setq compilation-directory-matcher '("\(?:Entering\\|Leavin\(g\)\) directory ['`]\(.+\)'$" (2 . 1)))Vanillic
B
0

On a few occasions I solved by passing output of the make through sed.

First, debugged it interactively 'Compile command: make | sed 's/x/y/' . And then repackaged it as a custom emacs interactive function.

Bridgeboard answered 10/9, 2021 at 19:57 Comment(0)
U
0

I haven't found a way to make this project specific, but this in my init.el works for going to errors:

(setq directory-abbrev-alist '(("^/src" . "./")))

You need to adapt this to the substitution you want.

In your case, you could try to substitute ../ with ./:

(setq directory-abbrev-alist '(("^../" . "./")))

If you know how to make this work only for the compilation buffer of a specific project, I'd be happy to know.

Understandable answered 13/6 at 9:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.