Mercurial > emacs
annotate lisp/progmodes/compile.el @ 88256:db2e6586ecf5
(rmail-msgbeg, rmail-msgend): Fix and make obsolete.
(rmail-process-new-messages): Use mail-decode-encoded-word-string
on the subject. Requires mail-parse from Gnus.
(rmail-highlight-headers): Doc.
author | Alex Schroeder <alex@gnu.org> |
---|---|
date | Sat, 21 Jan 2006 15:00:38 +0000 |
parents | d7ddb3e565de |
children |
rev | line source |
---|---|
38412
253f761ad37b
Some fixes to follow coding conventions in files maintained by FSF.
Pavel Janík <Pavel@Janik.cz>
parents:
38077
diff
changeset
|
1 ;;; compile.el --- run compiler as inferior of Emacs, parse error messages |
712
16823e891d56
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
621
diff
changeset
|
2 |
88155 | 3 ;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997, 1998, 1999, |
4 ;; 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. | |
846
20674ae6bf52
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
811
diff
changeset
|
5 |
88155 | 6 ;; Authors: Roland McGrath <roland@gnu.org>, |
7 ;; Daniel Pfeiffer <occitan@esperanto.org> | |
795
c693d56ef36d
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
778
diff
changeset
|
8 ;; Maintainer: FSF |
2247
2c7997f249eb
Add or correct keywords
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1846
diff
changeset
|
9 ;; Keywords: tools, processes |
795
c693d56ef36d
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
778
diff
changeset
|
10 |
71 | 11 ;; This file is part of GNU Emacs. |
12 | |
804 | 13 ;; GNU Emacs is free software; you can redistribute it and/or modify |
14 ;; it under the terms of the GNU General Public License as published by | |
15 ;; the Free Software Foundation; either version 2, or (at your option) | |
16 ;; any later version. | |
71 | 17 |
804 | 18 ;; GNU Emacs is distributed in the hope that it will be useful, |
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 ;; GNU General Public License for more details. | |
22 | |
23 ;; You should have received a copy of the GNU General Public License | |
14169 | 24 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
88155 | 25 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
26 ;; Boston, MA 02110-1301, USA. | |
71 | 27 |
2337
2ee64176069c
Fix library headers.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2307
diff
changeset
|
28 ;;; Commentary: |
2ee64176069c
Fix library headers.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2307
diff
changeset
|
29 |
88155 | 30 ;; This package provides the compile facilities documented in the Emacs user's |
31 ;; manual. | |
32 | |
33 ;; This mode uses some complex data-structures: | |
34 | |
35 ;; LOC (or location) is a list of (COLUMN LINE FILE-STRUCTURE) | |
36 | |
37 ;; COLUMN and LINE are numbers parsed from an error message. COLUMN and maybe | |
38 ;; LINE will be nil for a message that doesn't contain them. Then the | |
39 ;; location refers to a indented beginning of line or beginning of file. | |
40 ;; Once any location in some file has been jumped to, the list is extended to | |
41 ;; (COLUMN LINE FILE-STRUCTURE MARKER . VISITED) for all LOCs pertaining to | |
42 ;; that file. | |
43 ;; MARKER initially points to LINE and COLUMN in a buffer visiting that file. | |
44 ;; Being a marker it sticks to some text, when the buffer grows or shrinks | |
45 ;; before that point. VISITED is t if we have jumped there, else nil. | |
46 | |
47 ;; FILE-STRUCTURE is a list of | |
48 ;; ((FILENAME . DIRECTORY) FORMATS (LINE LOC ...) ...) | |
49 | |
50 ;; FILENAME is a string parsed from an error message. DIRECTORY is a string | |
51 ;; obtained by following directory change messages. DIRECTORY will be nil for | |
52 ;; an absolute filename. FORMATS is a list of formats to apply to FILENAME if | |
53 ;; a file of that name can't be found. | |
54 ;; The rest of the list is an alist of elements with LINE as key. The keys | |
55 ;; are either nil or line numbers. If present, nil comes first, followed by | |
56 ;; the numbers in decreasing order. The LOCs for each line are again an alist | |
57 ;; ordered the same way. Note that the whole file structure is referenced in | |
58 ;; every LOC. | |
59 | |
60 ;; MESSAGE is a list of (LOC TYPE END-LOC) | |
61 | |
62 ;; TYPE is 0 for info or 1 for warning if the message matcher identified it as | |
63 ;; such, 2 otherwise (for a real error). END-LOC is a LOC pointing to the | |
64 ;; other end, if the parsed message contained a range. If the end of the | |
65 ;; range didn't specify a COLUMN, it defaults to -1, meaning end of line. | |
66 ;; These are the value of the `message' text-properties in the compilation | |
67 ;; buffer. | |
2337
2ee64176069c
Fix library headers.
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2307
diff
changeset
|
68 |
795
c693d56ef36d
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
778
diff
changeset
|
69 ;;; Code: |
c693d56ef36d
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
778
diff
changeset
|
70 |
88155 | 71 (eval-when-compile (require 'cl)) |
72 | |
73 (defvar font-lock-extra-managed-props) | |
74 (defvar font-lock-keywords) | |
75 (defvar font-lock-maximum-size) | |
76 (defvar font-lock-support-mode) | |
77 | |
78 | |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
79 (defgroup compilation nil |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
80 "Run compiler as inferior of Emacs, parse error messages." |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
81 :group 'tools |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
82 :group 'processes) |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
83 |
569 | 84 |
85 ;;;###autoload | |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
86 (defcustom compilation-mode-hook nil |
88155 | 87 "*List of hook functions run by `compilation-mode' (see `run-mode-hooks')." |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
88 :type 'hook |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
89 :group 'compilation) |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
90 |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
91 ;;;###autoload |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
92 (defcustom compilation-window-height nil |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
93 "*Number of lines in a compilation window. If nil, use Emacs default." |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
94 :type '(choice (const :tag "Default" nil) |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
95 integer) |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
96 :group 'compilation) |
418 | 97 |
88155 | 98 (defvar compilation-first-column 1 |
99 "*This is how compilers number the first column, usually 1 or 0.") | |
71 | 100 |
40294
c3b8e6d5266f
(compilation-parse-errors-filename-function):
Gerd Moellmann <gerd@gnu.org>
parents:
40222
diff
changeset
|
101 (defvar compilation-parse-errors-filename-function nil |
c3b8e6d5266f
(compilation-parse-errors-filename-function):
Gerd Moellmann <gerd@gnu.org>
parents:
40222
diff
changeset
|
102 "Function to call to post-process filenames while parsing error messages. |
c3b8e6d5266f
(compilation-parse-errors-filename-function):
Gerd Moellmann <gerd@gnu.org>
parents:
40222
diff
changeset
|
103 It takes one arg FILENAME which is the name of a file as found |
c3b8e6d5266f
(compilation-parse-errors-filename-function):
Gerd Moellmann <gerd@gnu.org>
parents:
40222
diff
changeset
|
104 in the compilation output, and should return a transformed file name.") |
c3b8e6d5266f
(compilation-parse-errors-filename-function):
Gerd Moellmann <gerd@gnu.org>
parents:
40222
diff
changeset
|
105 |
474 | 106 ;;;###autoload |
16985
b0d8e7c0f906
* (compilation-process-setup-function): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
16950
diff
changeset
|
107 (defvar compilation-process-setup-function nil |
b0d8e7c0f906
* (compilation-process-setup-function): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
16950
diff
changeset
|
108 "*Function to call to customize the compilation process. |
88155 | 109 This function is called immediately before the compilation process is |
16985
b0d8e7c0f906
* (compilation-process-setup-function): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
16950
diff
changeset
|
110 started. It can be used to set any variables or functions that are used |
88155 | 111 while processing the output of the compilation process. The function |
112 is called with variables `compilation-buffer' and `compilation-window' | |
113 bound to the compilation buffer and window, respectively.") | |
16985
b0d8e7c0f906
* (compilation-process-setup-function): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
16950
diff
changeset
|
114 |
b0d8e7c0f906
* (compilation-process-setup-function): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
16950
diff
changeset
|
115 ;;;###autoload |
418 | 116 (defvar compilation-buffer-name-function nil |
1133 | 117 "Function to compute the name of a compilation buffer. |
118 The function receives one argument, the name of the major mode of the | |
119 compilation buffer. It should return a string. | |
120 nil means compute the name with `(concat \"*\" (downcase major-mode) \"*\")'.") | |
71 | 121 |
474 | 122 ;;;###autoload |
418 | 123 (defvar compilation-finish-function nil |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
124 "Function to call when a compilation process finishes. |
418 | 125 It is called with two arguments: the compilation buffer, and a string |
126 describing how the process finished.") | |
127 | |
88155 | 128 (make-obsolete-variable 'compilation-finish-function |
129 "Use `compilation-finish-functions', but it works a little differently." | |
130 "22.1") | |
131 | |
16042
18414e324084
(compilation-finish-functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15084
diff
changeset
|
132 ;;;###autoload |
18414e324084
(compilation-finish-functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15084
diff
changeset
|
133 (defvar compilation-finish-functions nil |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
134 "Functions to call when a compilation process finishes. |
16042
18414e324084
(compilation-finish-functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15084
diff
changeset
|
135 Each function is called with two arguments: the compilation buffer, |
18414e324084
(compilation-finish-functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15084
diff
changeset
|
136 and a string describing how the process finished.") |
18414e324084
(compilation-finish-functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15084
diff
changeset
|
137 |
740 | 138 (defvar compilation-in-progress nil |
139 "List of compilation processes now running.") | |
140 (or (assq 'compilation-in-progress minor-mode-alist) | |
141 (setq minor-mode-alist (cons '(compilation-in-progress " Compiling") | |
142 minor-mode-alist))) | |
143 | |
88155 | 144 (defvar compilation-error "error" |
145 "Stem of message to print when no matches are found.") | |
1133 | 146 |
17866
7d458582345c
(compilation-parse-errors): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
17653
diff
changeset
|
147 (defvar compilation-arguments nil |
88155 | 148 "Arguments that were given to `compilation-start'.") |
17866
7d458582345c
(compilation-parse-errors): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
17653
diff
changeset
|
149 |
1133 | 150 (defvar compilation-num-errors-found) |
71 | 151 |
88155 | 152 (defconst compilation-error-regexp-alist-alist |
153 '((absoft | |
154 "^\\(?:[Ee]rror on \\|[Ww]arning on\\( \\)\\)?[Ll]ine[ \t]+\\([0-9]+\\)[ \t]+\ | |
155 of[ \t]+\"?\\([a-zA-Z]?:?[^\":\n]+\\)\"?:" 3 2 nil (1)) | |
156 | |
157 (ada | |
158 "\\(warning: .*\\)? at \\([^ \n]+\\):\\([0-9]+\\)$" 2 3 nil (1)) | |
159 | |
160 (aix | |
161 " in line \\([0-9]+\\) of file \\([^ \n]+[^. \n]\\)\\.? " 2 1) | |
2461
1ecb75748794
(compilation-error-regexp-alist): Merged HP-UX 7.0 fc regexp with the
Roland McGrath <roland@gnu.org>
parents:
2460
diff
changeset
|
162 |
88155 | 163 (ant |
164 "^[ \t]*\\[[^] \n]+\\][ \t]*\\([^: \n]+\\):\\([0-9]+\\):\\(?:\\([0-9]+\\):[0-9]+:[0-9]+:\\)?\ | |
165 \\( warning\\)?" 1 2 3 (4)) | |
23866
b1adb6a721dd
(compilation-error-regexp-alist): Insist on a non-digit in the file name.
Karl Heuer <kwzh@gnu.org>
parents:
23865
diff
changeset
|
166 |
88155 | 167 (bash |
168 "^\\([^: \n\t]+\\): line \\([0-9]+\\):" 1 2) | |
169 | |
170 (borland | |
171 "^\\(?:Error\\|Warnin\\(g\\)\\) \\(?:[FEW][0-9]+ \\)?\ | |
172 \\([a-zA-Z]?:?[^:( \t\n]+\\)\ | |
173 \\([0-9]+\\)\\(?:[) \t]\\|:[^0-9\n]\\)" 2 3 nil (1)) | |
8398
38513039d818
(compilation-error-regexp-alist): Make separate
Richard M. Stallman <rms@gnu.org>
parents:
8359
diff
changeset
|
174 |
88155 | 175 (caml |
176 "^ *File \\(\"?\\)\\([^,\" \n\t<>]+\\)\\1, lines? \\([0-9]+\\)-?\\([0-9]+\\)?\\(?:$\\|,\ | |
177 \\(?: characters? \\([0-9]+\\)-?\\([0-9]+\\)?:\\)?\\([ \n]Warning:\\)?\\)" | |
178 2 (3 . 4) (5 . 6) (7)) | |
179 | |
180 (comma | |
181 "^\"\\([^,\" \n\t]+\\)\", line \\([0-9]+\\)\ | |
182 \\(?:[(. pos]+\\([0-9]+\\))?\\)?[:.,; (-]\\( warning:\\|[-0-9 ]*(W)\\)?" 1 2 3 (4)) | |
44413
2b898d069325
(compilation-error-regexp-alist):
Richard M. Stallman <rms@gnu.org>
parents:
44209
diff
changeset
|
183 |
88155 | 184 (edg-1 |
185 "^\\([^ \n]+\\)(\\([0-9]+\\)): \\(?:error\\|warnin\\(g\\)\\|remar\\(k\\)\\)" | |
186 1 2 nil (3 . 4)) | |
187 (edg-2 | |
188 "at line \\([0-9]+\\) of \"\\([^ \n]+\\)\"$" | |
189 2 1 nil 0) | |
190 | |
191 (epc | |
192 "^Error [0-9]+ at (\\([0-9]+\\):\\([^)\n]+\\))" 2 1) | |
15084
01518892abad
(compilation-error-regexp-alist): Add regexp
Richard M. Stallman <rms@gnu.org>
parents:
14807
diff
changeset
|
193 |
88155 | 194 (ftnchek |
195 "\\(^Warning .*\\)? line[ \n]\\([0-9]+\\)[ \n]\\(?:col \\([0-9]+\\)[ \n]\\)?file \\([^ :;\n]+\\)" | |
196 4 2 3 (1)) | |
2461
1ecb75748794
(compilation-error-regexp-alist): Merged HP-UX 7.0 fc regexp with the
Roland McGrath <roland@gnu.org>
parents:
2460
diff
changeset
|
197 |
88155 | 198 (iar |
199 "^\"\\(.*\\)\",\\([0-9]+\\)\\s-+\\(?:Error\\|Warnin\\(g\\)\\)\\[[0-9]+\\]:" | |
200 1 2 nil (3)) | |
46324
d992f5698971
(compilation-normalize-filename):
Richard M. Stallman <rms@gnu.org>
parents:
45829
diff
changeset
|
201 |
88155 | 202 (ibm |
203 "^\\([^( \n\t]+\\)(\\([0-9]+\\):\\([0-9]+\\)) :\ | |
204 \\(?:warnin\\(g\\)\\|informationa\\(l\\)\\)?" 1 2 3 (4 . 5)) | |
2461
1ecb75748794
(compilation-error-regexp-alist): Merged HP-UX 7.0 fc regexp with the
Roland McGrath <roland@gnu.org>
parents:
2460
diff
changeset
|
205 |
88155 | 206 ;; fixme: should be `mips' |
207 (irix | |
208 "^[-[:alnum:]_/ ]+: \\(?:\\(?:[sS]evere\\|[eE]rror\\|[wW]arnin\\(g\\)\\|[iI]nf\\(o\\)\\)[0-9 ]*: \\)?\ | |
209 \\([^,\" \n\t]+\\)\\(?:, line\\|:\\) \\([0-9]+\\):" 3 4 nil (1 . 2)) | |
14048
1a0cc425fb62
Mon Nov 6 18:01:01 1995 Dave Love <d.love@dl.ac.uk>
Roland McGrath <roland@gnu.org>
parents:
14047
diff
changeset
|
210 |
88155 | 211 (java |
212 "^\\(?:[ \t]+at \\|==[0-9]+== +\\(?:at\\|b\\(y\\)\\)\\).+(\\([^()\n]+\\):\\([0-9]+\\))$" 2 3 nil (1)) | |
2461
1ecb75748794
(compilation-error-regexp-alist): Merged HP-UX 7.0 fc regexp with the
Roland McGrath <roland@gnu.org>
parents:
2460
diff
changeset
|
213 |
88155 | 214 (jikes-file |
215 "^\\(?:Found\\|Issued\\) .* compiling \"\\(.+\\)\":$" 1 nil nil 0) | |
216 (jikes-line | |
217 "^ *\\([0-9]+\\)\\.[ \t]+.*\n +\\(<-*>\n\\*\\*\\* \\(?:Error\\|Warnin\\(g\\)\\)\\)" | |
218 nil 1 nil 2 0 | |
219 (2 (compilation-face '(3)))) | |
3606
713c76a95b74
* compile.el (compilation-error-list): When we haven't yet
Jim Blandy <jimb@redhat.com>
parents:
3514
diff
changeset
|
220 |
88155 | 221 (gcc-include |
222 "^\\(?:In file included\\| \\) from \ | |
223 \\(.+\\):\\([0-9]+\\)\\(?:\\(:\\)\\|\\(,\\)\\)?" 1 2 nil (3 . 4)) | |
45215
7c87a236ef78
(compilation-error-regexp-alist):
Richard M. Stallman <rms@gnu.org>
parents:
44413
diff
changeset
|
224 |
88155 | 225 (gnu |
226 "^\\(?:[[:alpha:]][-[:alnum:].]+: ?\\)?\ | |
227 \\([/.]*[a-zA-Z]:?[^ \t\n:]*\\|{standard input}\\): ?\ | |
228 \\([0-9]+\\)\\([.:]?\\)\\([0-9]+\\)?\ | |
229 \\(?:-\\(?:\\([0-9]+\\)\\3\\)?\\.?\\([0-9]+\\)?\\)?:\ | |
230 \\(?: *\\(\\(?:Future\\|Runtime\\)?[Ww]arning\\|W:\\)\\|\ | |
231 *\\([Ii]nfo\\(?:\\>\\|rmationa?l?\\)\\|I:\\)\\)?" | |
232 1 (2 . 5) (4 . 6) (7 . 8)) | |
2461
1ecb75748794
(compilation-error-regexp-alist): Merged HP-UX 7.0 fc regexp with the
Roland McGrath <roland@gnu.org>
parents:
2460
diff
changeset
|
233 |
88155 | 234 (lcc |
235 "^\\(?:E\\|\\(W\\)\\), \\([^(\n]+\\)(\\([0-9]+\\),[ \t]*\\([0-9]+\\)" | |
236 2 3 4 (1)) | |
1702
817bd71e0e72
* compile.el (compilation-error-regexp-alist): Tightened up
Jim Blandy <jimb@redhat.com>
parents:
1554
diff
changeset
|
237 |
88155 | 238 (makepp |
239 "^makepp: \\(?:\\(?:warning\\(:\\).*?\\|\\(Scanning\\|[LR]e?l?oading makefile\\) \\|.*?\\)\ | |
240 `\\(\\(\\S +?\\)\\(?::\\([0-9]+\\)\\)?\\)['(]\\)" | |
241 4 5 nil (1 . 2) 3 | |
242 ("`\\(\\(\\S +?\\)\\(?::\\([0-9]+\\)\\)?\\)['(]" nil nil | |
243 (2 compilation-info-face) | |
244 (3 compilation-line-face nil t) | |
245 (1 (compilation-error-properties 2 3 nil nil nil 0 nil) | |
246 append))) | |
11791
34dbef732b27
(compilation-error-regexp-alist): Add regexps for IBM and Cray compilers.
Roland McGrath <roland@gnu.org>
parents:
11618
diff
changeset
|
247 |
88155 | 248 ;; Should be lint-1, lint-2 (SysV lint) |
249 (mips-1 | |
250 " (\\([0-9]+\\)) in \\([^ \n]+\\)" 2 1) | |
251 (mips-2 | |
252 " in \\([^()\n ]+\\)(\\([0-9]+\\))$" 1 2) | |
12767
287cc74602fa
(compilation-error-regexp-alist): Add regexp for Sun ada.
Roland McGrath <roland@gnu.org>
parents:
12256
diff
changeset
|
253 |
88155 | 254 (msft |
255 "^\\([0-9]+>\\)?\\(\\(?:[a-zA-Z]:\\)?[^:(\t\n]+\\)(\\([0-9]+\\)) \ | |
256 : \\(?:error\\|warnin\\(g\\)\\) C[0-9]+:" 2 3 nil (4)) | |
17582
52780f61eb76
(compilation-error-regexp-alist): Add regexp for Perl -w.
Richard M. Stallman <rms@gnu.org>
parents:
17277
diff
changeset
|
257 |
88155 | 258 (oracle |
259 "^\\(?:Semantic error\\|Error\\|PCC-[0-9]+:\\).* line \\([0-9]+\\)\ | |
260 \\(?:\\(?:,\\| at\\)? column \\([0-9]+\\)\\)?\ | |
261 \\(?:,\\| in\\| of\\)? file \\(.*?\\):?$" | |
18477
270080940256
(compilation-error-regexp-alist): New item, for Oracle compiler.
Richard M. Stallman <rms@gnu.org>
parents:
18273
diff
changeset
|
262 3 1 2) |
18984
d2c26a873eb4
(compilation-error-regexp-alist): Add elt for EPC F90.
Richard M. Stallman <rms@gnu.org>
parents:
18619
diff
changeset
|
263 |
88155 | 264 (perl |
265 " at \\([^ \n]+\\) line \\([0-9]+\\)\\(?:[,.]\\|$\\)" 1 2) | |
266 | |
267 (rxp | |
268 "^\\(?:Error\\|Warnin\\(g\\)\\):.*\n.* line \\([0-9]+\\) char\ | |
269 \\([0-9]+\\) of file://\\(.+\\)" | |
270 4 2 3 (1)) | |
20187
0ee26e03e911
(compilation-error-regexp-alist):
Karl Heuer <kwzh@gnu.org>
parents:
20059
diff
changeset
|
271 |
88155 | 272 (sparc-pascal-file |
273 "^\\w\\w\\w \\w\\w\\w +[0-3]?[0-9] +[0-2][0-9]:[0-5][0-9]:[0-5][0-9]\ | |
274 [12][09][0-9][0-9] +\\(.*\\):$" | |
275 1 nil nil 0) | |
276 (sparc-pascal-line | |
277 "^\\(\\(?:E\\|\\(w\\)\\) +[0-9]+\\) line \\([0-9]+\\) - " | |
278 nil 3 nil (2) nil (1 (compilation-face '(2)))) | |
279 (sparc-pascal-example | |
280 "^ +\\([0-9]+\\) +.*\n\\(\\(?:e\\|\\(w\\)\\) [0-9]+\\)-+" | |
281 nil 1 nil (3) nil (2 (compilation-face '(3)))) | |
25435
5ff4e59e5f02
(compilation-error-regexp-alist): New item for SGI IRIX MipsPro compilers.
Richard M. Stallman <rms@gnu.org>
parents:
25433
diff
changeset
|
282 |
88155 | 283 (sun |
284 ": \\(?:ERROR\\|WARNIN\\(G\\)\\|REMAR\\(K\\)\\) \\(?:[[:alnum:] ]+, \\)?\ | |
285 File = \\(.+\\), Line = \\([0-9]+\\)\\(?:, Column = \\([0-9]+\\)\\)?" | |
286 3 4 5 (1 . 2)) | |
287 | |
288 (sun-ada | |
289 "^\\([^, \n\t]+\\), line \\([0-9]+\\), char \\([0-9]+\\)[:., \(-]" 1 2 3) | |
290 | |
291 (4bsd | |
292 "\\(?:^\\|:: \\|\\S ( \\)\\(/[^ \n\t()]+\\)(\\([0-9]+\\))\ | |
293 \\(?:: \\(warning:\\)?\\|$\\| ),\\)" 1 2 nil (3)) | |
41843
ab6cfeb406ab
(compilation-error-regexp-alist): Added regexps for RXP.
Miles Bader <miles@gnu.org>
parents:
41037
diff
changeset
|
294 |
88155 | 295 (gcov-file |
296 "^ +-: \\(0\\):Source:\\(.+\\)$" 2 1 nil 0) | |
297 (gcov-bb-file | |
298 "^ +-: \\(0\\):Object:\\(?:.+\\)$" nil 1 nil 0) | |
299 (gcov-never-called-line | |
300 "^ +\\(#####\\): +\\([0-9]+\\):.+$" nil 2 nil 2 nil | |
301 (1 compilation-error-face)) | |
302 (gcov-called-line | |
303 "^ +[-0-9]+: +\\([1-9]\\|[0-9]\\{2,\\}\\):.*$" nil 1 nil 0) | |
304 ) | |
305 "Alist of values for `compilation-error-regexp-alist'.") | |
26229
11ac69b74132
(compilation-error-regexp-alist): Recognize
Gerd Moellmann <gerd@gnu.org>
parents:
26222
diff
changeset
|
306 |
88155 | 307 (defcustom compilation-error-regexp-alist |
308 (mapcar 'car compilation-error-regexp-alist-alist) | |
1133 | 309 "Alist that specifies how to match errors in compiler output. |
88155 | 310 On GNU and Unix, any string is a valid filename, so these |
311 matchers must make some common sense assumptions, which catch | |
312 normal cases. A shorter list will be lighter on resource usage. | |
313 | |
314 Instead of an alist element, you can use a symbol, which is | |
315 looked up in `compilation-error-regexp-alist-alist'. You can see | |
316 the predefined symbols and their effects in the file | |
317 `etc/compilation.txt' (linked below if you are customizing this). | |
318 | |
319 Each elt has the form (REGEXP FILE [LINE COLUMN TYPE HYPERLINK | |
320 HIGHLIGHT...]). If REGEXP matches, the FILE'th subexpression | |
321 gives the file name, and the LINE'th subexpression gives the line | |
322 number. The COLUMN'th subexpression gives the column number on | |
323 that line. | |
324 | |
325 If FILE, LINE or COLUMN are nil or that index didn't match, that | |
326 information is not present on the matched line. In that case the | |
327 file name is assumed to be the same as the previous one in the | |
328 buffer, line number defaults to 1 and column defaults to | |
329 beginning of line's indentation. | |
71 | 330 |
88155 | 331 FILE can also have the form (FILE FORMAT...), where the FORMATs |
332 \(e.g. \"%s.c\") will be applied in turn to the recognized file | |
333 name, until a file of that name is found. Or FILE can also be a | |
334 function that returns (FILENAME) or (RELATIVE-FILENAME . DIRNAME). | |
335 In the former case, FILENAME may be relative or absolute. | |
336 | |
337 LINE can also be of the form (LINE . END-LINE) meaning a range | |
338 of lines. COLUMN can also be of the form (COLUMN . END-COLUMN) | |
339 meaning a range of columns starting on LINE and ending on | |
340 END-LINE, if that matched. | |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
341 |
88155 | 342 TYPE is 2 or nil for a real error or 1 for warning or 0 for info. |
343 TYPE can also be of the form (WARNING . INFO). In that case this | |
344 will be equivalent to 1 if the WARNING'th subexpression matched | |
345 or else equivalent to 0 if the INFO'th subexpression matched. | |
346 See `compilation-error-face', `compilation-warning-face', | |
347 `compilation-info-face' and `compilation-skip-threshold'. | |
348 | |
349 What matched the HYPERLINK'th subexpression has `mouse-face' and | |
350 `compilation-message-face' applied. If this is nil, the text | |
351 matched by the whole REGEXP becomes the hyperlink. | |
352 | |
353 Additional HIGHLIGHTs as described under `font-lock-keywords' can | |
354 be added." | |
355 :type `(set :menu-tag "Pick" | |
356 ,@(mapcar (lambda (elt) | |
357 (list 'const (car elt))) | |
358 compilation-error-regexp-alist-alist)) | |
359 :link `(file-link :tag "example file" | |
360 ,(expand-file-name "compilation.txt" data-directory)) | |
361 :group 'compilation) | |
362 | |
363 (defvar compilation-directory nil | |
364 "Directory to restore to when doing `recompile'.") | |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
365 |
88155 | 366 (defvar compilation-directory-matcher |
367 '("\\(?:Entering\\|Leavin\\(g\\)\\) directory `\\(.+\\)'$" (2 . 1)) | |
368 "A list for tracking when directories are entered or left. | |
369 Nil means not to track directories, e.g. if all file names are absolute. The | |
370 first element is the REGEXP matching these messages. It can match any number | |
371 of variants, e.g. different languages. The remaining elements are all of the | |
372 form (DIR . LEAVE). If for any one of these the DIR'th subexpression | |
373 matches, that is a directory name. If LEAVE is nil or the corresponding | |
374 LEAVE'th subexpression doesn't match, this message is about going into another | |
375 directory. If it does match anything, this message is about going back to the | |
376 directory we were in before the last entering message. If you change this, | |
377 you may also want to change `compilation-page-delimiter'.") | |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
378 |
88155 | 379 (defvar compilation-page-delimiter |
380 "^\\(?:\f\\|.*\\(?:Entering\\|Leaving\\) directory `.+'\n\\)+" | |
381 "Value of `page-delimiter' in Compilation mode.") | |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
382 |
88155 | 383 (defvar compilation-mode-font-lock-keywords |
384 '(;; configure output lines. | |
385 ("^[Cc]hecking \\(?:[Ff]or \\|[Ii]f \\|[Ww]hether \\(?:to \\)?\\)?\\(.+\\)\\.\\.\\. *\\(?:(cached) *\\)?\\(\\(yes\\(?: .+\\)?\\)\\|no\\|\\(.*\\)\\)$" | |
386 (1 font-lock-variable-name-face) | |
387 (2 (compilation-face '(4 . 3)))) | |
388 ;; Command output lines. Recognize `make[n]:' lines too. | |
389 ("^\\([[:alnum:]_/.+-]+\\)\\(\\[\\([0-9]+\\)\\]\\)?[ \t]*:" | |
390 (1 font-lock-function-name-face) (3 compilation-line-face nil t)) | |
391 (" --?o\\(?:utfile\\|utput\\)?[= ]?\\(\\S +\\)" . 1) | |
392 ("^Compilation \\(finished\\)" | |
393 (1 compilation-info-face)) | |
394 ("^Compilation \\(exited abnormally\\|interrupt\\|killed\\|terminated\\)\\(?:.*with code \\([0-9]+\\)\\)?" | |
395 (1 compilation-error-face) | |
396 (2 compilation-error-face nil t))) | |
397 "Additional things to highlight in Compilation mode. | |
398 This gets tacked on the end of the generated expressions.") | |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
399 |
88155 | 400 (defvar compilation-highlight-regexp t |
401 "Regexp matching part of visited source lines to highlight temporarily. | |
402 Highlight entire line if t; don't highlight source lines if nil.") | |
403 | |
404 (defvar compilation-highlight-overlay nil | |
405 "Overlay used to temporarily highlight compilation matches.") | |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
406 |
23263
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
407 (defcustom compilation-error-screen-columns t |
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
408 "*If non-nil, column numbers in error messages are screen columns. |
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
409 Otherwise they are interpreted as character positions, with |
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
410 each character occupying one column. |
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
411 The default is to use screen columns, which requires that the compilation |
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
412 program and Emacs agree about the display width of the characters, |
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
413 especially the TAB character." |
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
414 :type 'boolean |
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
415 :group 'compilation |
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
416 :version "20.4") |
03626baa368a
(compilation-error-screen-columns): New
Andreas Schwab <schwab@suse.de>
parents:
23228
diff
changeset
|
417 |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
418 (defcustom compilation-read-command t |
26222 | 419 "*Non-nil means \\[compile] reads the compilation command to use. |
420 Otherwise, \\[compile] just uses the value of `compile-command'." | |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
421 :type 'boolean |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
422 :group 'compilation) |
5406
d9a58377567c
(compilation-read-command, compilation-ask-about-save): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
5260
diff
changeset
|
423 |
19766
0790c7dab24d
(compilation-ask-about-save): Add autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents:
19616
diff
changeset
|
424 ;;;###autoload |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
425 (defcustom compilation-ask-about-save t |
26222 | 426 "*Non-nil means \\[compile] asks which buffers to save before compiling. |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
427 Otherwise, it saves all modified buffers without asking." |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
428 :type 'boolean |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
429 :group 'compilation) |
5406
d9a58377567c
(compilation-read-command, compilation-ask-about-save): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
5260
diff
changeset
|
430 |
569 | 431 ;;;###autoload |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
432 (defcustom compilation-search-path '(nil) |
569 | 433 "*List of directories to search for source files named in error messages. |
418 | 434 Elements should be directory names, not file names of directories. |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
435 nil as an element means to try the default directory." |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
436 :type '(repeat (choice (const :tag "Default" nil) |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
437 (string :tag "Directory"))) |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
438 :group 'compilation) |
71 | 439 |
88155 | 440 ;;;###autoload |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
441 (defcustom compile-command "make -k " |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
442 "*Last shell command used to do a compilation; default for next compilation. |
71 | 443 |
444 Sometimes it is useful for files to supply local values for this variable. | |
445 You might also use mode hooks to specify it in certain modes, like this: | |
446 | |
19007
1606d5205bbc
(compile-command): More doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18987
diff
changeset
|
447 (add-hook 'c-mode-hook |
1606d5205bbc
(compile-command): More doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18987
diff
changeset
|
448 (lambda () |
1606d5205bbc
(compile-command): More doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18987
diff
changeset
|
449 (unless (or (file-exists-p \"makefile\") |
1606d5205bbc
(compile-command): More doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18987
diff
changeset
|
450 (file-exists-p \"Makefile\")) |
38493
864c2b4076f8
(compilation-parse-errors): `linenum' might return a this-error using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38412
diff
changeset
|
451 (set (make-local-variable 'compile-command) |
864c2b4076f8
(compilation-parse-errors): `linenum' might return a this-error using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38412
diff
changeset
|
452 (concat \"make -k \" |
88155 | 453 (file-name-sans-extension buffer-file-name))))))" |
17639
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
454 :type 'string |
5339baa0a334
Use defgroup and defcustom.
Richard M. Stallman <rms@gnu.org>
parents:
17623
diff
changeset
|
455 :group 'compilation) |
71 | 456 |
88155 | 457 ;;;###autoload |
458 (defcustom compilation-disable-input nil | |
459 "*If non-nil, send end-of-file as compilation process input. | |
460 This only affects platforms that support asynchronous processes (see | |
461 `start-process'); synchronous compilation processes never accept input." | |
462 :type 'boolean | |
463 :group 'compilation | |
464 :version "22.1") | |
465 | |
466 ;; A weak per-compilation-buffer hash indexed by (FILENAME . DIRECTORY). Each | |
467 ;; value is a FILE-STRUCTURE as described above, with the car eq to the hash | |
468 ;; key. This holds the tree seen from root, for storing new nodes. | |
469 (defvar compilation-locs ()) | |
470 | |
471 (defvar compilation-debug nil | |
472 "*Set this to t before creating a *compilation* buffer. | |
473 Then every error line will have a debug text property with the matcher that | |
474 fit this line and the match data. Use `describe-text-properties'.") | |
418 | 475 |
12920
905444ab8d92
(compilation-exit-message-function): New variable.
Roland McGrath <roland@gnu.org>
parents:
12767
diff
changeset
|
476 (defvar compilation-exit-message-function nil "\ |
905444ab8d92
(compilation-exit-message-function): New variable.
Roland McGrath <roland@gnu.org>
parents:
12767
diff
changeset
|
477 If non-nil, called when a compilation process dies to return a status message. |
14045
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
478 This should be a function of three arguments: process status, exit status, |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
479 and exit message; it returns a cons (MESSAGE . MODELINE) of the strings to |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
480 write into the compilation buffer, and to put in its mode line.") |
12920
905444ab8d92
(compilation-exit-message-function): New variable.
Roland McGrath <roland@gnu.org>
parents:
12767
diff
changeset
|
481 |
88155 | 482 (defvar compilation-environment nil |
483 "*List of environment variables for compilation to inherit. | |
484 Each element should be a string of the form ENVVARNAME=VALUE. | |
485 This list is temporarily prepended to `process-environment' prior to | |
486 starting the compilation process.") | |
487 | |
864
fe5f6b7c9727
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
488 ;; History of compile commands. |
fe5f6b7c9727
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
489 (defvar compile-history nil) |
88155 | 490 |
491 (defface compilation-error | |
492 '((t :inherit font-lock-warning-face)) | |
493 "Face used to highlight compiler errors." | |
494 :group 'compilation | |
495 :version "22.1") | |
496 | |
497 (defface compilation-warning | |
498 '((((class color) (min-colors 16)) (:foreground "Orange" :weight bold)) | |
499 (((class color)) (:foreground "cyan" :weight bold)) | |
500 (t (:weight bold))) | |
501 "Face used to highlight compiler warnings." | |
502 :group 'compilation | |
503 :version "22.1") | |
504 | |
505 (defface compilation-info | |
506 '((((class color) (min-colors 16) (background light)) | |
507 (:foreground "Green3" :weight bold)) | |
508 (((class color) (min-colors 88) (background dark)) | |
509 (:foreground "Green1" :weight bold)) | |
510 (((class color) (min-colors 16) (background dark)) | |
511 (:foreground "Green" :weight bold)) | |
512 (((class color)) (:foreground "green" :weight bold)) | |
513 (t (:weight bold))) | |
514 "Face used to highlight compiler information." | |
515 :group 'compilation | |
516 :version "22.1") | |
517 | |
518 (defface compilation-line-number | |
519 '((t :inherit font-lock-variable-name-face)) | |
520 "Face for displaying line numbers in compiler messages." | |
521 :group 'compilation | |
522 :version "22.1") | |
523 | |
524 (defface compilation-column-number | |
525 '((t :inherit font-lock-type-face)) | |
526 "Face for displaying column numbers in compiler messages." | |
527 :group 'compilation | |
528 :version "22.1") | |
529 | |
530 (defvar compilation-message-face 'underline | |
531 "Face name to use for whole messages. | |
532 Faces `compilation-error-face', `compilation-warning-face', | |
533 `compilation-info-face', `compilation-line-face' and | |
534 `compilation-column-face' get prepended to this, when applicable.") | |
535 | |
536 (defvar compilation-error-face 'compilation-error | |
537 "Face name to use for file name in error messages.") | |
538 | |
539 (defvar compilation-warning-face 'compilation-warning | |
540 "Face name to use for file name in warning messages.") | |
541 | |
542 (defvar compilation-info-face 'compilation-info | |
543 "Face name to use for file name in informational messages.") | |
544 | |
545 (defvar compilation-line-face 'compilation-line-number | |
546 "Face name to use for line numbers in compiler messages.") | |
547 | |
548 (defvar compilation-column-face 'compilation-column-number | |
549 "Face name to use for column numbers in compiler messages.") | |
550 | |
551 ;; same faces as dired uses | |
552 (defvar compilation-enter-directory-face 'font-lock-function-name-face | |
553 "Face name to use for entering directory messages.") | |
554 | |
555 (defvar compilation-leave-directory-face 'font-lock-type-face | |
556 "Face name to use for leaving directory messages.") | |
557 | |
558 | |
559 | |
560 ;; Used for compatibility with the old compile.el. | |
561 (defvaralias 'compilation-last-buffer 'next-error-last-buffer) | |
562 (defvar compilation-parsing-end (make-marker)) | |
563 (defvar compilation-parse-errors-function nil) | |
564 (defvar compilation-error-list nil) | |
565 (defvar compilation-old-error-list nil) | |
566 | |
567 (defun compilation-face (type) | |
568 (or (and (car type) (match-end (car type)) compilation-warning-face) | |
569 (and (cdr type) (match-end (cdr type)) compilation-info-face) | |
570 compilation-error-face)) | |
571 | |
572 ;; Internal function for calculating the text properties of a directory | |
573 ;; change message. The directory property is important, because it is | |
574 ;; the stack of nested enter-messages. Relative filenames on the following | |
575 ;; lines are relative to the top of the stack. | |
576 (defun compilation-directory-properties (idx leave) | |
577 (if leave (setq leave (match-end leave))) | |
578 ;; find previous stack, and push onto it, or if `leave' pop it | |
579 (let ((dir (previous-single-property-change (point) 'directory))) | |
580 (setq dir (if dir (or (get-text-property (1- dir) 'directory) | |
581 (get-text-property dir 'directory)))) | |
582 `(face ,(if leave | |
583 compilation-leave-directory-face | |
584 compilation-enter-directory-face) | |
585 directory ,(if leave | |
586 (or (cdr dir) | |
587 '(nil)) ; nil only isn't a property-change | |
588 (cons (match-string-no-properties idx) dir)) | |
589 mouse-face highlight | |
590 keymap compilation-button-map | |
591 help-echo "mouse-2: visit current directory"))) | |
592 | |
593 ;; Data type `reverse-ordered-alist' retriever. This function retrieves the | |
594 ;; KEY element from the ALIST, creating it in the right position if not already | |
595 ;; present. ALIST structure is | |
596 ;; '(ANCHOR (KEY1 ...) (KEY2 ...)... (KEYn ALIST ...)) | |
597 ;; ANCHOR is ignored, but necessary so that elements can be inserted. KEY1 | |
598 ;; may be nil. The other KEYs are ordered backwards so that growing line | |
599 ;; numbers can be inserted in front and searching can abort after half the | |
600 ;; list on average. | |
601 (eval-when-compile ;Don't keep it at runtime if not needed. | |
602 (defmacro compilation-assq (key alist) | |
603 `(let* ((l1 ,alist) | |
604 (l2 (cdr l1))) | |
605 (car (if (if (null ,key) | |
606 (if l2 (null (caar l2))) | |
607 (while (if l2 (if (caar l2) (< ,key (caar l2)) t)) | |
608 (setq l1 l2 | |
609 l2 (cdr l1))) | |
610 (if l2 (eq ,key (caar l2)))) | |
611 l2 | |
612 (setcdr l1 (cons (list ,key) l2))))))) | |
613 | |
614 | |
615 ;; This function is the central driver, called when font-locking to gather | |
616 ;; all information needed to later jump to corresponding source code. | |
617 ;; Return a property list with all meta information on this error location. | |
618 | |
619 (defun compilation-error-properties (file line end-line col end-col type fmt) | |
620 (unless (< (next-single-property-change (match-beginning 0) 'directory nil (point)) | |
621 (point)) | |
622 (if file | |
623 (if (functionp file) | |
624 (setq file (funcall file)) | |
625 (let (dir) | |
626 (setq file (match-string-no-properties file)) | |
627 (unless (file-name-absolute-p file) | |
628 (setq dir (previous-single-property-change (point) 'directory) | |
629 dir (if dir (or (get-text-property (1- dir) 'directory) | |
630 (get-text-property dir 'directory))))) | |
631 (setq file (cons file (car dir))))) | |
632 ;; This message didn't mention one, get it from previous | |
633 (let ((prev-pos | |
634 ;; Find the previous message. | |
635 (previous-single-property-change (point) 'message))) | |
636 (if prev-pos | |
637 ;; Get the file structure that belongs to it. | |
638 (let* ((prev | |
639 (or (get-text-property (1- prev-pos) 'message) | |
640 (get-text-property prev-pos 'message))) | |
641 (prev-struct | |
642 (car (nth 2 (car prev))))) | |
643 ;; Construct FILE . DIR from that. | |
644 (if prev-struct | |
645 (setq file (cons (car prev-struct) | |
646 (cadr prev-struct)))))) | |
647 (unless file | |
648 (setq file '("*unknown*"))))) | |
649 ;; All of these fields are optional, get them only if we have an index, and | |
650 ;; it matched some part of the message. | |
651 (and line | |
652 (setq line (match-string-no-properties line)) | |
653 (setq line (string-to-number line))) | |
654 (and end-line | |
655 (setq end-line (match-string-no-properties end-line)) | |
656 (setq end-line (string-to-number end-line))) | |
657 (if col | |
658 (if (functionp col) | |
659 (setq col (funcall col)) | |
660 (and | |
661 (setq col (match-string-no-properties col)) | |
662 (setq col (- (string-to-number col) compilation-first-column))))) | |
663 (if (and end-col (functionp end-col)) | |
664 (setq end-col (funcall end-col)) | |
665 (if (and end-col (setq end-col (match-string-no-properties end-col))) | |
666 (setq end-col (- (string-to-number end-col) compilation-first-column -1)) | |
667 (if end-line (setq end-col -1)))) | |
668 (if (consp type) ; not a static type, check what it is. | |
669 (setq type (or (and (car type) (match-end (car type)) 1) | |
670 (and (cdr type) (match-end (cdr type)) 0) | |
671 2))) | |
672 (compilation-internal-error-properties file line end-line col end-col type fmt))) | |
673 | |
674 (defun compilation-move-to-column (col screen) | |
675 "Go to column COL on the current line. | |
676 If SCREEN is non-nil, columns are screen columns, otherwise, they are | |
677 just char-counts." | |
678 (if screen | |
679 (move-to-column col) | |
680 (goto-char (min (+ (line-beginning-position) col) (line-end-position))))) | |
681 | |
682 (defun compilation-internal-error-properties (file line end-line col end-col type fmts) | |
683 "Get the meta-info that will be added as text-properties. | |
684 LINE, END-LINE, COL, END-COL are integers or nil. | |
685 TYPE can be 0, 1, or 2, meaning error, warning, or just info. | |
686 FILE should be (FILENAME) or (RELATIVE-FILENAME . DIRNAME) or nil. | |
687 FMTS is a list of format specs for transforming the file name. | |
688 (See `compilation-error-regexp-alist'.)" | |
689 (unless file (setq file '("*unknown*"))) | |
690 (let* ((file-struct (compilation-get-file-structure file fmts)) | |
691 ;; Get first already existing marker (if any has one, all have one). | |
692 ;; Do this first, as the compilation-assq`s may create new nodes. | |
693 (marker-line (car (cddr file-struct))) ; a line structure | |
694 (marker (nth 3 (cadr marker-line))) ; its marker | |
695 (compilation-error-screen-columns compilation-error-screen-columns) | |
696 end-marker loc end-loc) | |
697 (if (not (and marker (marker-buffer marker))) | |
698 (setq marker nil) ; no valid marker for this file | |
699 (setq loc (or line 1)) ; normalize no linenumber to line 1 | |
700 (catch 'marker ; find nearest loc, at least one exists | |
701 (dolist (x (nthcdr 3 file-struct)) ; loop over remaining lines | |
702 (if (> (car x) loc) ; still bigger | |
703 (setq marker-line x) | |
704 (if (> (- (or (car marker-line) 1) loc) | |
705 (- loc (car x))) ; current line is nearer | |
706 (setq marker-line x)) | |
707 (throw 'marker t)))) | |
708 (setq marker (nth 3 (cadr marker-line)) | |
709 marker-line (or (car marker-line) 1)) | |
710 (with-current-buffer (marker-buffer marker) | |
711 (save-excursion | |
712 (save-restriction | |
713 (widen) | |
714 (goto-char (marker-position marker)) | |
715 (when (or end-col end-line) | |
716 (beginning-of-line (- (or end-line line) marker-line -1)) | |
717 (if (or (null end-col) (< end-col 0)) | |
718 (end-of-line) | |
719 (compilation-move-to-column | |
720 end-col compilation-error-screen-columns)) | |
721 (setq end-marker (list (point-marker)))) | |
722 (beginning-of-line (if end-line | |
723 (- line end-line -1) | |
724 (- loc marker-line -1))) | |
725 (if col | |
726 (compilation-move-to-column | |
727 col compilation-error-screen-columns) | |
728 (forward-to-indentation 0)) | |
729 (setq marker (list (point-marker))))))) | |
730 | |
731 (setq loc (compilation-assq line (cdr file-struct))) | |
732 (if end-line | |
733 (setq end-loc (compilation-assq end-line (cdr file-struct)) | |
734 end-loc (compilation-assq end-col end-loc)) | |
735 (if end-col ; use same line element | |
736 (setq end-loc (compilation-assq end-col loc)))) | |
737 (setq loc (compilation-assq col loc)) | |
738 ;; If they are new, make the loc(s) reference the file they point to. | |
739 (or (cdr loc) (setcdr loc `(,line ,file-struct ,@marker))) | |
740 (if end-loc | |
741 (or (cdr end-loc) | |
742 (setcdr end-loc `(,(or end-line line) ,file-struct ,@end-marker)))) | |
743 | |
744 ;; Must start with face | |
745 `(face ,compilation-message-face | |
746 message (,loc ,type ,end-loc) | |
747 ,@(if compilation-debug | |
748 `(debug (,(assoc (with-no-warnings matcher) font-lock-keywords) | |
749 ,@(match-data)))) | |
750 help-echo ,(if col | |
751 "mouse-2: visit this file, line and column" | |
752 (if line | |
753 "mouse-2: visit this file and line" | |
754 "mouse-2: visit this file")) | |
755 keymap compilation-button-map | |
756 mouse-face highlight))) | |
864
fe5f6b7c9727
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
757 |
17056
0f7992bc968f
Rewrite Font Lock support.
Simon Marshall <simon@gnu.org>
parents:
17054
diff
changeset
|
758 (defun compilation-mode-font-lock-keywords () |
0f7992bc968f
Rewrite Font Lock support.
Simon Marshall <simon@gnu.org>
parents:
17054
diff
changeset
|
759 "Return expressions to highlight in Compilation mode." |
88155 | 760 (if compilation-parse-errors-function |
761 ;; An old package! Try the compatibility code. | |
762 '((compilation-compat-parse-errors)) | |
763 (append | |
764 ;; make directory tracking | |
765 (if compilation-directory-matcher | |
766 `((,(car compilation-directory-matcher) | |
767 ,@(mapcar (lambda (elt) | |
768 `(,(car elt) | |
769 (compilation-directory-properties | |
770 ,(car elt) ,(cdr elt)) | |
771 t t)) | |
772 (cdr compilation-directory-matcher))))) | |
773 | |
774 ;; Compiler warning/error lines. | |
775 (mapcar | |
776 (lambda (item) | |
777 (if (symbolp item) | |
778 (setq item (cdr (assq item | |
779 compilation-error-regexp-alist-alist)))) | |
780 (let ((file (nth 1 item)) | |
781 (line (nth 2 item)) | |
782 (col (nth 3 item)) | |
783 (type (nth 4 item)) | |
784 end-line end-col fmt) | |
785 (if (consp file) (setq fmt (cdr file) file (car file))) | |
786 (if (consp line) (setq end-line (cdr line) line (car line))) | |
787 (if (consp col) (setq end-col (cdr col) col (car col))) | |
788 | |
789 (if (functionp line) | |
790 ;; The old compile.el had here an undocumented hook that | |
791 ;; allowed `line' to be a function that computed the actual | |
792 ;; error location. Let's do our best. | |
793 `(,(car item) | |
794 (0 (save-match-data | |
795 (compilation-compat-error-properties | |
796 (funcall ',line (cons (match-string ,file) | |
797 (cons default-directory | |
798 ',(nthcdr 4 item))) | |
799 ,(if col `(match-string ,col)))))) | |
800 (,file compilation-error-face t)) | |
801 | |
802 (unless (or (null (nth 5 item)) (integerp (nth 5 item))) | |
803 (error "HYPERLINK should be an integer: %s" (nth 5 item))) | |
804 | |
805 `(,(nth 0 item) | |
806 | |
807 ,@(when (integerp file) | |
808 `((,file ,(if (consp type) | |
809 `(compilation-face ',type) | |
810 (aref [compilation-info-face | |
811 compilation-warning-face | |
812 compilation-error-face] | |
813 (or type 2)))))) | |
814 | |
815 ,@(when line | |
816 `((,line compilation-line-face nil t))) | |
817 ,@(when end-line | |
818 `((,end-line compilation-line-face nil t))) | |
819 | |
820 ,@(when (integerp col) | |
821 `((,col compilation-column-face nil t))) | |
822 ,@(when (integerp end-col) | |
823 `((,end-col compilation-column-face nil t))) | |
824 | |
825 ,@(nthcdr 6 item) | |
826 (,(or (nth 5 item) 0) | |
827 (compilation-error-properties ',file ,line ,end-line | |
828 ,col ,end-col ',(or type 2) | |
829 ',fmt) | |
830 append))))) ; for compilation-message-face | |
831 compilation-error-regexp-alist) | |
832 | |
833 compilation-mode-font-lock-keywords))) | |
834 | |
12920
905444ab8d92
(compilation-exit-message-function): New variable.
Roland McGrath <roland@gnu.org>
parents:
12767
diff
changeset
|
835 |
418 | 836 ;;;###autoload |
88155 | 837 (defun compile (command &optional comint) |
71 | 838 "Compile the program including the current buffer. Default: run `make'. |
839 Runs COMMAND, a shell command, in a separate process asynchronously | |
840 with output going to the buffer `*compilation*'. | |
418 | 841 |
88155 | 842 If optional second arg COMINT is t the buffer will be in Comint mode with |
843 `compilation-shell-minor-mode'. | |
844 | |
71 | 845 You can then use the command \\[next-error] to find the next error message |
846 and move to the source code that caused it. | |
847 | |
9888
9d7972f4657c
(compile): With prefix arg, prompt even if (not compilation-read-command).
Roland McGrath <roland@gnu.org>
parents:
9868
diff
changeset
|
848 Interactively, prompts for the command if `compilation-read-command' is |
9d7972f4657c
(compile): With prefix arg, prompt even if (not compilation-read-command).
Roland McGrath <roland@gnu.org>
parents:
9868
diff
changeset
|
849 non-nil; otherwise uses `compile-command'. With prefix arg, always prompts. |
88155 | 850 Additionally, with universal prefix arg, compilation buffer will be in |
851 comint mode, i.e. interactive. | |
9888
9d7972f4657c
(compile): With prefix arg, prompt even if (not compilation-read-command).
Roland McGrath <roland@gnu.org>
parents:
9868
diff
changeset
|
852 |
88155 | 853 To run more than one compilation at once, start one and rename |
854 the \`*compilation*' buffer to some other name with | |
855 \\[rename-buffer]. Then start the next one. On most systems, | |
856 termination of the main compilation process kills its | |
857 subprocesses. | |
418 | 858 |
859 The name used for the buffer is actually whatever is returned by | |
860 the function in `compilation-buffer-name-function', so you can set that | |
861 to a function that generates a unique name." | |
5406
d9a58377567c
(compilation-read-command, compilation-ask-about-save): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
5260
diff
changeset
|
862 (interactive |
88155 | 863 (list |
864 (let ((command (eval compile-command))) | |
865 (if (or compilation-read-command current-prefix-arg) | |
866 (read-from-minibuffer "Compile command: " | |
867 command nil nil | |
868 (if (equal (car compile-history) command) | |
869 '(compile-history . 1) | |
870 'compile-history)) | |
871 command)) | |
872 (consp current-prefix-arg))) | |
38493
864c2b4076f8
(compilation-parse-errors): `linenum' might return a this-error using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38412
diff
changeset
|
873 (unless (equal command (eval compile-command)) |
864c2b4076f8
(compilation-parse-errors): `linenum' might return a this-error using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38412
diff
changeset
|
874 (setq compile-command command)) |
5406
d9a58377567c
(compilation-read-command, compilation-ask-about-save): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
5260
diff
changeset
|
875 (save-some-buffers (not compilation-ask-about-save) nil) |
88155 | 876 (setq compilation-directory default-directory) |
877 (compilation-start command comint)) | |
71 | 878 |
38493
864c2b4076f8
(compilation-parse-errors): `linenum' might return a this-error using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38412
diff
changeset
|
879 ;; run compile with the default command line |
8425
8b8835f1630a
Set up a "Compile" menubar item.
Richard M. Stallman <rms@gnu.org>
parents:
8406
diff
changeset
|
880 (defun recompile () |
41037
5dd37d315c33
(recompile): Use compilation-arguments if set, so as to be able to M-x
Richard M. Stallman <rms@gnu.org>
parents:
40902
diff
changeset
|
881 "Re-compile the program including the current buffer. |
88155 | 882 If this is run in a Compilation mode buffer, re-use the arguments from the |
883 original use. Otherwise, recompile using `compile-command'." | |
8425
8b8835f1630a
Set up a "Compile" menubar item.
Richard M. Stallman <rms@gnu.org>
parents:
8406
diff
changeset
|
884 (interactive) |
8b8835f1630a
Set up a "Compile" menubar item.
Richard M. Stallman <rms@gnu.org>
parents:
8406
diff
changeset
|
885 (save-some-buffers (not compilation-ask-about-save) nil) |
88155 | 886 (let ((default-directory |
887 (or (and (not (eq major-mode (nth 1 compilation-arguments))) | |
888 compilation-directory) | |
889 default-directory))) | |
890 (apply 'compilation-start (or compilation-arguments | |
891 `(,(eval compile-command)))))) | |
45593
996be238a122
(grep-tree-command, grep-tree-files-aliases)
Kim F. Storm <storm@cua.dk>
parents:
45582
diff
changeset
|
892 |
20877
4b22b9a5bd8e
(compilation-scroll-output): New variable.
Dave Love <fx@gnu.org>
parents:
20187
diff
changeset
|
893 (defcustom compilation-scroll-output nil |
4b22b9a5bd8e
(compilation-scroll-output): New variable.
Dave Love <fx@gnu.org>
parents:
20187
diff
changeset
|
894 "*Non-nil to scroll the *compilation* buffer window as output appears. |
4b22b9a5bd8e
(compilation-scroll-output): New variable.
Dave Love <fx@gnu.org>
parents:
20187
diff
changeset
|
895 |
88155 | 896 Setting it causes the Compilation mode commands to put point at the |
20877
4b22b9a5bd8e
(compilation-scroll-output): New variable.
Dave Love <fx@gnu.org>
parents:
20187
diff
changeset
|
897 end of their output window so that the end of the output is always |
88155 | 898 visible rather than the beginning." |
20877
4b22b9a5bd8e
(compilation-scroll-output): New variable.
Dave Love <fx@gnu.org>
parents:
20187
diff
changeset
|
899 :type 'boolean |
22291
7c8d8ad75d43
(compilation-scroll-output): Correct the :version
Karl Heuer <kwzh@gnu.org>
parents:
22208
diff
changeset
|
900 :version "20.3" |
20877
4b22b9a5bd8e
(compilation-scroll-output): New variable.
Dave Love <fx@gnu.org>
parents:
20187
diff
changeset
|
901 :group 'compilation) |
4b22b9a5bd8e
(compilation-scroll-output): New variable.
Dave Love <fx@gnu.org>
parents:
20187
diff
changeset
|
902 |
39602
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
903 |
88155 | 904 (defun compilation-buffer-name (mode-name mode-command name-function) |
39602
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
905 "Return the name of a compilation buffer to use. |
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
906 If NAME-FUNCTION is non-nil, call it with one argument MODE-NAME |
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
907 to determine the buffer name. |
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
908 Likewise if `compilation-buffer-name-function' is non-nil. |
88155 | 909 If current buffer is the mode MODE-COMMAND, |
39602
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
910 return the name of the current buffer, so that it gets reused. |
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
911 Otherwise, construct a buffer name from MODE-NAME." |
48035
c27fdc870952
(grep-find-use-xargs): Fix docstring. Patch from Matt Swift
Juanma Barranquero <lekktu@gmail.com>
parents:
47787
diff
changeset
|
912 (cond (name-function |
39602
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
913 (funcall name-function mode-name)) |
48035
c27fdc870952
(grep-find-use-xargs): Fix docstring. Patch from Matt Swift
Juanma Barranquero <lekktu@gmail.com>
parents:
47787
diff
changeset
|
914 (compilation-buffer-name-function |
39602
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
915 (funcall compilation-buffer-name-function mode-name)) |
88155 | 916 ((and (eq mode-command major-mode) |
917 (eq major-mode (nth 1 compilation-arguments))) | |
39602
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
918 (buffer-name)) |
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
919 (t |
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
920 (concat "*" (downcase mode-name) "*")))) |
8c4c4c89b007
(compilation-buffer-name): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
39599
diff
changeset
|
921 |
88155 | 922 ;; This is a rough emulation of the old hack, until the transition to new |
923 ;; compile is complete. | |
71 | 924 (defun compile-internal (command error-message |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
925 &optional name-of-mode parser |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
926 error-regexp-alist name-function |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
927 enter-regexp-alist leave-regexp-alist |
47300
5128d5a8980c
(compile-internal): Add optional argument no-async.
Colin Walters <walters@gnu.org>
parents:
46344
diff
changeset
|
928 file-regexp-alist nomessage-regexp-alist |
88155 | 929 no-async highlight-regexp local-map) |
930 (if parser | |
931 (error "Compile now works very differently, see `compilation-error-regexp-alist'")) | |
932 (let ((compilation-error-regexp-alist | |
933 (append file-regexp-alist (or error-regexp-alist | |
934 compilation-error-regexp-alist))) | |
935 (compilation-error (replace-regexp-in-string "^No more \\(.+\\)s\\.?" | |
936 "\\1" error-message))) | |
937 (compilation-start command nil name-function highlight-regexp))) | |
938 (make-obsolete 'compile-internal 'compilation-start) | |
939 | |
940 ;;;###autoload | |
941 (defun compilation-start (command &optional mode name-function highlight-regexp) | |
71 | 942 "Run compilation command COMMAND (low level interface). |
88155 | 943 If COMMAND starts with a cd command, that becomes the `default-directory'. |
944 The rest of the arguments are optional; for them, nil means use the default. | |
894 | 945 |
88155 | 946 MODE is the major mode to set in the compilation buffer. Mode |
947 may also be t meaning use `compilation-shell-minor-mode' under `comint-mode'. | |
948 If NAME-FUNCTION is non-nil, call it with one argument (the mode name) | |
949 to determine the buffer name. | |
950 | |
951 If HIGHLIGHT-REGEXP is non-nil, `next-error' will temporarily highlight | |
952 the matching section of the visited source line; the default is to use the | |
953 global value of `compilation-highlight-regexp'. | |
47300
5128d5a8980c
(compile-internal): Add optional argument no-async.
Colin Walters <walters@gnu.org>
parents:
46344
diff
changeset
|
954 |
894 | 955 Returns the compilation buffer created." |
88155 | 956 (or mode (setq mode 'compilation-mode)) |
957 (let* ((name-of-mode | |
958 (if (eq mode t) | |
959 (prog1 "compilation" (require 'comint)) | |
960 (replace-regexp-in-string "-mode$" "" (symbol-name mode)))) | |
961 (thisdir default-directory) | |
962 outwin outbuf) | |
963 (with-current-buffer | |
964 (setq outbuf | |
965 (get-buffer-create | |
966 (compilation-buffer-name name-of-mode mode name-function))) | |
418 | 967 (let ((comp-proc (get-buffer-process (current-buffer)))) |
968 (if comp-proc | |
969 (if (or (not (eq (process-status comp-proc) 'run)) | |
970 (yes-or-no-p | |
1554
5af75a1a9a24
* compile.el (compile-internal): Use NAME-OF-MODE in the prompt
Jim Blandy <jimb@redhat.com>
parents:
1294
diff
changeset
|
971 (format "A %s process is running; kill it? " |
5af75a1a9a24
* compile.el (compile-internal): Use NAME-OF-MODE in the prompt
Jim Blandy <jimb@redhat.com>
parents:
1294
diff
changeset
|
972 name-of-mode))) |
418 | 973 (condition-case () |
974 (progn | |
975 (interrupt-process comp-proc) | |
976 (sit-for 1) | |
977 (delete-process comp-proc)) | |
978 (error nil)) | |
979 (error "Cannot have two processes in `%s' at once" | |
88155 | 980 (buffer-name))))) |
981 (buffer-disable-undo (current-buffer)) | |
982 ;; first transfer directory from where M-x compile was called | |
983 (setq default-directory thisdir) | |
984 ;; Make compilation buffer read-only. The filter can still write it. | |
985 ;; Clear out the compilation buffer. | |
986 (let ((inhibit-read-only t) | |
987 (default-directory thisdir)) | |
988 ;; Then evaluate a cd command if any, but don't perform it yet, else start-command | |
989 ;; would do it again through the shell: (cd "..") AND sh -c "cd ..; make" | |
990 (cd (if (string-match "^\\s *cd\\(?:\\s +\\(\\S +?\\)\\)?\\s *[;&\n]" command) | |
991 (if (match-end 1) | |
992 (substitute-env-vars (match-string 1 command)) | |
993 "~") | |
994 default-directory)) | |
418 | 995 (erase-buffer) |
88155 | 996 ;; Select the desired mode. |
997 (if (not (eq mode t)) | |
998 (funcall mode) | |
999 (setq buffer-read-only nil) | |
1000 (with-no-warnings (comint-mode)) | |
1001 (compilation-shell-minor-mode)) | |
1002 (if highlight-regexp | |
1003 (set (make-local-variable 'compilation-highlight-regexp) | |
1004 highlight-regexp)) | |
1005 ;; Output a mode setter, for saving and later reloading this buffer. | |
1006 (insert "-*- mode: " name-of-mode | |
1007 "; default-directory: " (prin1-to-string default-directory) | |
1008 " -*-\n" | |
1009 (format "%s started at %s\n\n" | |
1010 mode-name | |
1011 (substring (current-time-string) 0 19)) | |
1012 command "\n") | |
1013 (setq thisdir default-directory)) | |
1014 (set-buffer-modified-p nil)) | |
1015 ;; If we're already in the compilation buffer, go to the end | |
1016 ;; of the buffer, so point will track the compilation output. | |
1017 (if (eq outbuf (current-buffer)) | |
1018 (goto-char (point-max))) | |
1019 ;; Pop up the compilation buffer. | |
1020 (setq outwin (display-buffer outbuf nil t)) | |
1021 (with-current-buffer outbuf | |
1022 (let ((process-environment | |
1023 (append | |
1024 compilation-environment | |
1025 (if (if (boundp 'system-uses-terminfo) ; `if' for compiler warning | |
1026 system-uses-terminfo) | |
1027 (list "TERM=dumb" "TERMCAP=" | |
1028 (format "COLUMNS=%d" (window-width))) | |
1029 (list "TERM=emacs" | |
1030 (format "TERMCAP=emacs:co#%d:tc=unknown:" | |
1031 (window-width)))) | |
1032 ;; Set the EMACS variable, but | |
1033 ;; don't override users' setting of $EMACS. | |
1034 (unless (getenv "EMACS") '("EMACS=t")) | |
1035 (copy-sequence process-environment)))) | |
17866
7d458582345c
(compilation-parse-errors): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
17653
diff
changeset
|
1036 (set (make-local-variable 'compilation-arguments) |
88155 | 1037 (list command mode name-function highlight-regexp)) |
1038 (set (make-local-variable 'revert-buffer-function) | |
1039 'compilation-revert-buffer) | |
3514
7a3e241a2917
(compile-internal): Alter current buffer only temporarily.
Richard M. Stallman <rms@gnu.org>
parents:
3147
diff
changeset
|
1040 (set-window-start outwin (point-min)) |
7a3e241a2917
(compile-internal): Alter current buffer only temporarily.
Richard M. Stallman <rms@gnu.org>
parents:
3147
diff
changeset
|
1041 (or (eq outwin (selected-window)) |
88155 | 1042 (set-window-point outwin (if compilation-scroll-output |
1043 (point) | |
1044 (point-min)))) | |
1045 ;; The setup function is called before compilation-set-window-height | |
1046 ;; so it can set the compilation-window-height buffer locally. | |
16985
b0d8e7c0f906
* (compilation-process-setup-function): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
16950
diff
changeset
|
1047 (if compilation-process-setup-function |
b0d8e7c0f906
* (compilation-process-setup-function): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
16950
diff
changeset
|
1048 (funcall compilation-process-setup-function)) |
88155 | 1049 (compilation-set-window-height outwin) |
3514
7a3e241a2917
(compile-internal): Alter current buffer only temporarily.
Richard M. Stallman <rms@gnu.org>
parents:
3147
diff
changeset
|
1050 ;; Start the compilation. |
88155 | 1051 (if (fboundp 'start-process) |
1052 (let ((proc (if (eq mode t) | |
1053 (get-buffer-process | |
1054 (with-no-warnings | |
1055 (comint-exec outbuf (downcase mode-name) | |
1056 shell-file-name nil `("-c" ,command)))) | |
1057 (start-process-shell-command (downcase mode-name) | |
1058 outbuf command)))) | |
1059 ;; Make the buffer's mode line show process state. | |
1060 (setq mode-line-process '(":%s")) | |
5456
b34aaec781fc
(compile-internal): Extended to work without asynchronous subprocesses.
Richard M. Stallman <rms@gnu.org>
parents:
5406
diff
changeset
|
1061 (set-process-sentinel proc 'compilation-sentinel) |
b34aaec781fc
(compile-internal): Extended to work without asynchronous subprocesses.
Richard M. Stallman <rms@gnu.org>
parents:
5406
diff
changeset
|
1062 (set-process-filter proc 'compilation-filter) |
b34aaec781fc
(compile-internal): Extended to work without asynchronous subprocesses.
Richard M. Stallman <rms@gnu.org>
parents:
5406
diff
changeset
|
1063 (set-marker (process-mark proc) (point) outbuf) |
88155 | 1064 (when compilation-disable-input |
1065 (condition-case nil | |
1066 (process-send-eof proc) | |
1067 ;; The process may have exited already. | |
1068 (error nil))) | |
13755
5f7ea59f14b6
(compilation-mode): Add autoload cookie.
Roland McGrath <roland@gnu.org>
parents:
13540
diff
changeset
|
1069 (setq compilation-in-progress |
5456
b34aaec781fc
(compile-internal): Extended to work without asynchronous subprocesses.
Richard M. Stallman <rms@gnu.org>
parents:
5406
diff
changeset
|
1070 (cons proc compilation-in-progress))) |
14045
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1071 ;; No asynchronous processes available. |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1072 (message "Executing `%s'..." command) |
13819
57cd7ef01dc7
(compile-internal): On systems with no asynchronous
Richard M. Stallman <rms@gnu.org>
parents:
13755
diff
changeset
|
1073 ;; Fake modeline display as if `start-process' were run. |
57cd7ef01dc7
(compile-internal): On systems with no asynchronous
Richard M. Stallman <rms@gnu.org>
parents:
13755
diff
changeset
|
1074 (setq mode-line-process ":run") |
14045
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1075 (force-mode-line-update) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1076 (sit-for 0) ; Force redisplay |
88155 | 1077 (let* ((buffer-read-only nil) ; call-process needs to modify outbuf |
1078 (status (call-process shell-file-name nil outbuf nil "-c" | |
1079 command))) | |
14045
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1080 (cond ((numberp status) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1081 (compilation-handle-exit 'exit status |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1082 (if (zerop status) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1083 "finished\n" |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1084 (format "\ |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1085 exited abnormally with code %d\n" |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1086 status)))) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1087 ((stringp status) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1088 (compilation-handle-exit 'signal status |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1089 (concat status "\n"))) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1090 (t |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1091 (compilation-handle-exit 'bizarre status status)))) |
88155 | 1092 ;; Without async subprocesses, the buffer is not yet |
1093 ;; fontified, so fontify it now. | |
1094 (let ((font-lock-verbose nil)) ; shut up font-lock messages | |
1095 (font-lock-fontify-buffer)) | |
1096 (set-buffer-modified-p nil) | |
20877
4b22b9a5bd8e
(compilation-scroll-output): New variable.
Dave Love <fx@gnu.org>
parents:
20187
diff
changeset
|
1097 (message "Executing `%s'...done" command))) |
88155 | 1098 ;; Now finally cd to where the shell started make/grep/... |
1099 (setq default-directory thisdir)) | |
1100 (if (buffer-local-value 'compilation-scroll-output outbuf) | |
1101 (save-selected-window | |
1102 (select-window outwin) | |
1103 (goto-char (point-max)))) | |
418 | 1104 ;; Make it so the next C-x ` will use this buffer. |
88155 | 1105 (setq next-error-last-buffer outbuf))) |
71 | 1106 |
8483
19dbc8373bec
(compilation-set-window-height): New function,
Richard M. Stallman <rms@gnu.org>
parents:
8425
diff
changeset
|
1107 (defun compilation-set-window-height (window) |
26222 | 1108 "Set the height of WINDOW according to `compilation-window-height'." |
88155 | 1109 (let ((height (buffer-local-value 'compilation-window-height (window-buffer window)))) |
1110 (and height | |
1111 (= (window-width window) (frame-width (window-frame window))) | |
1112 ;; If window is alone in its frame, aside from a minibuffer, | |
1113 ;; don't change its height. | |
1114 (not (eq window (frame-root-window (window-frame window)))) | |
1115 ;; Stef said that doing the saves in this order is safer: | |
1116 (save-excursion | |
1117 (save-selected-window | |
1118 (select-window window) | |
1119 (enlarge-window (- height (window-height)))))))) | |
8483
19dbc8373bec
(compilation-set-window-height): New function,
Richard M. Stallman <rms@gnu.org>
parents:
8425
diff
changeset
|
1120 |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1121 (defvar compilation-menu-map |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1122 (let ((map (make-sparse-keymap "Errors"))) |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1123 (define-key map [stop-subjob] |
48835
750e9e67d3e9
(compilation-menu-map): Use `kill-compilation' to stop compilation.
Markus Rost <rost@math.uni-bielefeld.de>
parents:
48721
diff
changeset
|
1124 '("Stop Compilation" . kill-compilation)) |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1125 (define-key map [compilation-mode-separator2] |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1126 '("----" . nil)) |
88155 | 1127 (define-key map [compilation-first-error] |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1128 '("First Error" . first-error)) |
88155 | 1129 (define-key map [compilation-previous-error] |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1130 '("Previous Error" . previous-error)) |
88155 | 1131 (define-key map [compilation-next-error] |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1132 '("Next Error" . next-error)) |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1133 map)) |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1134 |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1135 (defvar compilation-minor-mode-map |
71 | 1136 (let ((map (make-sparse-keymap))) |
88155 | 1137 (define-key map [mouse-2] 'compile-goto-error) |
1138 (define-key map [follow-link] 'mouse-face) | |
71 | 1139 (define-key map "\C-c\C-c" 'compile-goto-error) |
10268
84777124c262
(compilation-minor-mode-map): Bind C-m to compilation-goto-error.
Richard M. Stallman <rms@gnu.org>
parents:
10096
diff
changeset
|
1140 (define-key map "\C-m" 'compile-goto-error) |
418 | 1141 (define-key map "\C-c\C-k" 'kill-compilation) |
894 | 1142 (define-key map "\M-n" 'compilation-next-error) |
1143 (define-key map "\M-p" 'compilation-previous-error) | |
946 | 1144 (define-key map "\M-{" 'compilation-previous-file) |
1145 (define-key map "\M-}" 'compilation-next-file) | |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1146 ;; Set up the menu-bar |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1147 (define-key map [menu-bar compilation] |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1148 (cons "Errors" compilation-menu-map)) |
71 | 1149 map) |
2760
1c7595e3089b
(Setting minor-mode-map-alist):
Richard M. Stallman <rms@gnu.org>
parents:
2603
diff
changeset
|
1150 "Keymap for `compilation-minor-mode'.") |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1151 |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1152 (defvar compilation-shell-minor-mode-map |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1153 (let ((map (make-sparse-keymap))) |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1154 (define-key map "\M-\C-m" 'compile-goto-error) |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1155 (define-key map "\M-\C-n" 'compilation-next-error) |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1156 (define-key map "\M-\C-p" 'compilation-previous-error) |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1157 (define-key map "\M-{" 'compilation-previous-file) |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1158 (define-key map "\M-}" 'compilation-next-file) |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1159 ;; Set up the menu-bar |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1160 (define-key map [menu-bar compilation] |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1161 (cons "Errors" compilation-menu-map)) |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1162 map) |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1163 "Keymap for `compilation-shell-minor-mode'.") |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1164 |
88155 | 1165 (defvar compilation-button-map |
1166 (let ((map (make-sparse-keymap))) | |
1167 (define-key map [mouse-2] 'compile-goto-error) | |
1168 (define-key map [follow-link] 'mouse-face) | |
1169 (define-key map "\C-m" 'compile-goto-error) | |
1170 map) | |
1171 "Keymap for compilation-message buttons.") | |
1172 (fset 'compilation-button-map compilation-button-map) | |
1173 | |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1174 (defvar compilation-mode-map |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1175 (let ((map (make-sparse-keymap))) |
88155 | 1176 ;; Don't inherit from compilation-minor-mode-map, |
1177 ;; because that introduces a menu bar item we don't want. | |
1178 ;; That confuses C-down-mouse-3. | |
1179 (define-key map [mouse-2] 'compile-goto-error) | |
1180 (define-key map [follow-link] 'mouse-face) | |
1181 (define-key map "\C-c\C-c" 'compile-goto-error) | |
1182 (define-key map "\C-m" 'compile-goto-error) | |
1183 (define-key map "\C-c\C-k" 'kill-compilation) | |
1184 (define-key map "\M-n" 'compilation-next-error) | |
1185 (define-key map "\M-p" 'compilation-previous-error) | |
1186 (define-key map "\M-{" 'compilation-previous-file) | |
1187 (define-key map "\M-}" 'compilation-next-file) | |
1188 (define-key map "\t" 'compilation-next-error) | |
1189 (define-key map [backtab] 'compilation-previous-error) | |
1190 | |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1191 (define-key map " " 'scroll-up) |
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1192 (define-key map "\^?" 'scroll-down) |
88155 | 1193 (define-key map "\C-c\C-f" 'next-error-follow-minor-mode) |
1194 | |
8425
8b8835f1630a
Set up a "Compile" menubar item.
Richard M. Stallman <rms@gnu.org>
parents:
8406
diff
changeset
|
1195 ;; Set up the menu-bar |
88155 | 1196 (let ((submap (make-sparse-keymap "Compile"))) |
1197 (define-key map [menu-bar compilation] | |
1198 (cons "Compile" submap)) | |
1199 (set-keymap-parent submap compilation-menu-map)) | |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1200 (define-key map [menu-bar compilation compilation-separator2] |
8425
8b8835f1630a
Set up a "Compile" menubar item.
Richard M. Stallman <rms@gnu.org>
parents:
8406
diff
changeset
|
1201 '("----" . nil)) |
88155 | 1202 (define-key map [menu-bar compilation compilation-grep] |
1203 '("Search Files (grep)..." . grep)) | |
1204 (define-key map [menu-bar compilation compilation-recompile] | |
8425
8b8835f1630a
Set up a "Compile" menubar item.
Richard M. Stallman <rms@gnu.org>
parents:
8406
diff
changeset
|
1205 '("Recompile" . recompile)) |
88155 | 1206 (define-key map [menu-bar compilation compilation-compile] |
17057
e54588a6cea9
Add ... to relevant menu entries.
Simon Marshall <simon@gnu.org>
parents:
17056
diff
changeset
|
1207 '("Compile..." . compile)) |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1208 map) |
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1209 "Keymap for compilation log buffers. |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1210 `compilation-minor-mode-map' is a parent of this.") |
71 | 1211 |
17653
b7810d4fb620
(compilation-mode): Add a mode-class property.
Richard M. Stallman <rms@gnu.org>
parents:
17639
diff
changeset
|
1212 (put 'compilation-mode 'mode-class 'special) |
b7810d4fb620
(compilation-mode): Add a mode-class property.
Richard M. Stallman <rms@gnu.org>
parents:
17639
diff
changeset
|
1213 |
88155 | 1214 (defvar compilation-skip-to-next-location t |
1215 "*If non-nil, skip multiple error messages for the same source location.") | |
1216 | |
1217 (defcustom compilation-skip-threshold 1 | |
1218 "*Compilation motion commands skip less important messages. | |
1219 The value can be either 2 -- skip anything less than error, 1 -- | |
1220 skip anything less than warning or 0 -- don't skip any messages. | |
1221 Note that all messages not positively identified as warning or | |
1222 info, are considered errors." | |
1223 :type '(choice (const :tag "Warnings and info" 2) | |
1224 (const :tag "Info" 1) | |
1225 (const :tag "None" 0)) | |
1226 :group 'compilation | |
1227 :version "22.1") | |
1228 | |
1229 (defcustom compilation-skip-visited nil | |
1230 "*Compilation motion commands skip visited messages if this is t. | |
1231 Visited messages are ones for which the file, line and column have been jumped | |
1232 to from the current content in the current compilation buffer, even if it was | |
1233 from a different message." | |
1234 :type 'boolean | |
1235 :group 'compilation | |
1236 :version "22.1") | |
1237 | |
13755
5f7ea59f14b6
(compilation-mode): Add autoload cookie.
Roland McGrath <roland@gnu.org>
parents:
13540
diff
changeset
|
1238 ;;;###autoload |
21930
b84bfe98263d
* progmodes/compile.el (compilation-directory-stack): Doc fix.
Andreas Schwab <schwab@suse.de>
parents:
21224
diff
changeset
|
1239 (defun compilation-mode (&optional name-of-mode) |
71 | 1240 "Major mode for compilation log buffers. |
1241 \\<compilation-mode-map>To visit the source for a line-numbered error, | |
418 | 1242 move point to the error message line and type \\[compile-goto-error]. |
569 | 1243 To kill the compilation, type \\[kill-compilation]. |
1244 | |
88155 | 1245 Runs `compilation-mode-hook' with `run-mode-hooks' (which see). |
1246 | |
1247 \\{compilation-mode-map}" | |
71 | 1248 (interactive) |
9376
f0ac347309e2
(compilation-mode-font-lock-keywords): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
8976
diff
changeset
|
1249 (kill-all-local-variables) |
71 | 1250 (use-local-map compilation-mode-map) |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1251 (setq major-mode 'compilation-mode |
21930
b84bfe98263d
* progmodes/compile.el (compilation-directory-stack): Doc fix.
Andreas Schwab <schwab@suse.de>
parents:
21224
diff
changeset
|
1252 mode-name (or name-of-mode "Compilation")) |
88155 | 1253 (set (make-local-variable 'page-delimiter) |
1254 compilation-page-delimiter) | |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1255 (compilation-setup) |
88155 | 1256 (setq buffer-read-only t) |
1257 (run-mode-hooks 'compilation-mode-hook)) | |
1258 | |
1259 (defmacro define-compilation-mode (mode name doc &rest body) | |
1260 "This is like `define-derived-mode' without the PARENT argument. | |
1261 The parent is always `compilation-mode' and the customizable `compilation-...' | |
1262 variables are also set from the name of the mode you have chosen, | |
1263 by replacing the first word, e.g `compilation-scroll-output' from | |
1264 `grep-scroll-output' if that variable exists." | |
1265 (let ((mode-name (replace-regexp-in-string "-mode\\'" "" (symbol-name mode)))) | |
1266 `(define-derived-mode ,mode compilation-mode ,name | |
1267 ,doc | |
1268 ,@(mapcar (lambda (v) | |
1269 (setq v (cons v | |
1270 (intern-soft (replace-regexp-in-string | |
1271 "^compilation" mode-name | |
1272 (symbol-name v))))) | |
1273 (and (cdr v) | |
1274 (or (boundp (cdr v)) | |
1275 (if (boundp 'byte-compile-bound-variables) | |
1276 (memq (cdr v) byte-compile-bound-variables))) | |
1277 `(set (make-local-variable ',(car v)) ,(cdr v)))) | |
1278 '(compilation-buffer-name-function | |
1279 compilation-directory-matcher | |
1280 compilation-error | |
1281 compilation-error-regexp-alist | |
1282 compilation-error-regexp-alist-alist | |
1283 compilation-error-screen-columns | |
1284 compilation-finish-function | |
1285 compilation-finish-functions | |
1286 compilation-first-column | |
1287 compilation-mode-font-lock-keywords | |
1288 compilation-page-delimiter | |
1289 compilation-parse-errors-filename-function | |
1290 compilation-process-setup-function | |
1291 compilation-scroll-output | |
1292 compilation-search-path | |
1293 compilation-skip-threshold | |
1294 compilation-window-height)) | |
1295 ,@body))) | |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1296 |
17866
7d458582345c
(compilation-parse-errors): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
17653
diff
changeset
|
1297 (defun compilation-revert-buffer (ignore-auto noconfirm) |
49186
ce4ad428dcab
(compilation-revert-buffer): If buffer has a file, revert it in the normal way.
Richard M. Stallman <rms@gnu.org>
parents:
48844
diff
changeset
|
1298 (if buffer-file-name |
ce4ad428dcab
(compilation-revert-buffer): If buffer has a file, revert it in the normal way.
Richard M. Stallman <rms@gnu.org>
parents:
48844
diff
changeset
|
1299 (let (revert-buffer-function) |
88155 | 1300 (revert-buffer ignore-auto noconfirm)) |
49186
ce4ad428dcab
(compilation-revert-buffer): If buffer has a file, revert it in the normal way.
Richard M. Stallman <rms@gnu.org>
parents:
48844
diff
changeset
|
1301 (if (or noconfirm (yes-or-no-p (format "Restart compilation? "))) |
88155 | 1302 (apply 'compilation-start compilation-arguments)))) |
1303 | |
1304 (defvar compilation-current-error nil | |
1305 "Marker to the location from where the next error will be found. | |
1306 The global commands next/previous/first-error/goto-error use this.") | |
1307 | |
1308 (defvar compilation-messages-start nil | |
1309 "Buffer position of the beginning of the compilation messages. | |
1310 If nil, use the beginning of buffer.") | |
1311 | |
1312 ;; A function name can't be a hook, must be something with a value. | |
1313 (defconst compilation-turn-on-font-lock 'turn-on-font-lock) | |
17866
7d458582345c
(compilation-parse-errors): Fix paren error.
Richard M. Stallman <rms@gnu.org>
parents:
17653
diff
changeset
|
1314 |
88155 | 1315 (defun compilation-setup (&optional minor) |
1316 "Prepare the buffer for the compilation parsing commands to work. | |
1317 Optional argument MINOR indicates this is called from | |
1318 `compilation-minor-mode'." | |
1319 (make-local-variable 'compilation-current-error) | |
1320 (make-local-variable 'compilation-messages-start) | |
30688
f0a91dd9685b
(compilation-setup): Make variable
Gerd Moellmann <gerd@gnu.org>
parents:
29121
diff
changeset
|
1321 (make-local-variable 'compilation-error-screen-columns) |
88155 | 1322 (make-local-variable 'overlay-arrow-position) |
1323 (set (make-local-variable 'overlay-arrow-string) "") | |
1324 (setq next-error-overlay-arrow-position nil) | |
1325 (add-hook 'kill-buffer-hook | |
1326 (lambda () (setq next-error-overlay-arrow-position nil)) nil t) | |
1327 ;; Note that compilation-next-error-function is for interfacing | |
1328 ;; with the next-error function in simple.el, and it's only | |
1329 ;; coincidentally named similarly to compilation-next-error. | |
1330 (setq next-error-function 'compilation-next-error-function) | |
1331 (set (make-local-variable 'font-lock-extra-managed-props) | |
1332 '(directory message help-echo mouse-face debug)) | |
1333 (set (make-local-variable 'compilation-locs) | |
1334 (make-hash-table :test 'equal :weakness 'value)) | |
1335 ;; lazy-lock would never find the message unless it's scrolled to. | |
1336 ;; jit-lock might fontify some things too late. | |
1337 (set (make-local-variable 'font-lock-support-mode) nil) | |
1338 (set (make-local-variable 'font-lock-maximum-size) nil) | |
1339 (if minor | |
1340 (let ((fld font-lock-defaults)) | |
1341 (font-lock-add-keywords nil (compilation-mode-font-lock-keywords)) | |
1342 (if font-lock-mode | |
1343 (if fld | |
1344 (font-lock-fontify-buffer) | |
1345 (font-lock-change-mode) | |
1346 (turn-on-font-lock)) | |
1347 (turn-on-font-lock))) | |
1348 (setq font-lock-defaults '(compilation-mode-font-lock-keywords t)) | |
1349 ;; maybe defer font-lock till after derived mode is set up | |
1350 (run-mode-hooks 'compilation-turn-on-font-lock))) | |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1351 |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1352 ;;;###autoload |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1353 (define-minor-mode compilation-shell-minor-mode |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1354 "Toggle compilation shell minor mode. |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1355 With arg, turn compilation mode on if and only if arg is positive. |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1356 In this minor mode, all the error-parsing commands of the |
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1357 Compilation major mode are available but bound to keys that don't |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1358 collide with Shell mode. See `compilation-mode'. |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1359 Turning the mode on runs the normal hook `compilation-shell-minor-mode-hook'." |
88155 | 1360 nil " Shell-Compile" |
48400
e57b9088b4a1
(compilation-shell-minor-mode): Add group.
Markus Rost <rost@math.uni-bielefeld.de>
parents:
48279
diff
changeset
|
1361 :group 'compilation |
88155 | 1362 (if compilation-shell-minor-mode |
1363 (compilation-setup t) | |
1364 (font-lock-remove-keywords nil (compilation-mode-font-lock-keywords)) | |
1365 (font-lock-fontify-buffer))) | |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1366 |
4445
a1e412873732
(compilation-minor-mode): Make variable buffer-local.
Roland McGrath <roland@gnu.org>
parents:
4350
diff
changeset
|
1367 ;;;###autoload |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1368 (define-minor-mode compilation-minor-mode |
2603
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1369 "Toggle compilation minor mode. |
f80a342fd945
Add compilation-minor-mode to minor-mode-alist and minor-mode-map-alist.
Roland McGrath <roland@gnu.org>
parents:
2478
diff
changeset
|
1370 With arg, turn compilation mode on if and only if arg is positive. |
48204
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1371 In this minor mode, all the error-parsing commands of the |
1ee4b312fef0
(grep-default-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48197
diff
changeset
|
1372 Compilation major mode are available. See `compilation-mode'. |
14607
3c86ac6a871a
(compilation-minor-mode): Run compilation-minor-mode-hook.
Roland McGrath <roland@gnu.org>
parents:
14562
diff
changeset
|
1373 Turning the mode on runs the normal hook `compilation-minor-mode-hook'." |
88155 | 1374 nil " Compilation" |
48400
e57b9088b4a1
(compilation-shell-minor-mode): Add group.
Markus Rost <rost@math.uni-bielefeld.de>
parents:
48279
diff
changeset
|
1375 :group 'compilation |
88155 | 1376 (if compilation-minor-mode |
1377 (compilation-setup t) | |
1378 (font-lock-remove-keywords nil (compilation-mode-font-lock-keywords)) | |
1379 (font-lock-fontify-buffer))) | |
71 | 1380 |
14045
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1381 (defun compilation-handle-exit (process-status exit-status msg) |
88155 | 1382 "Write MSG in the current buffer and hack its mode-line-process." |
1383 (let ((inhibit-read-only t) | |
14045
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1384 (status (if compilation-exit-message-function |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1385 (funcall compilation-exit-message-function |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1386 process-status exit-status msg) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1387 (cons msg exit-status))) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1388 (omax (point-max)) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1389 (opoint (point))) |
88155 | 1390 ;; Record where we put the message, so we can ignore it later on. |
14045
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1391 (goto-char omax) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1392 (insert ?\n mode-name " " (car status)) |
44209
9501986a69c8
(compilation-handle-exit):
Richard M. Stallman <rms@gnu.org>
parents:
44139
diff
changeset
|
1393 (if (and (numberp compilation-window-height) |
88155 | 1394 (zerop compilation-window-height)) |
1395 (message "%s" (cdr status))) | |
24558
ea8a9509b52f
(compilation-handle-exit): Do right thing
Richard M. Stallman <rms@gnu.org>
parents:
24326
diff
changeset
|
1396 (if (bolp) |
ea8a9509b52f
(compilation-handle-exit): Do right thing
Richard M. Stallman <rms@gnu.org>
parents:
24326
diff
changeset
|
1397 (forward-char -1)) |
14045
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1398 (insert " at " (substring (current-time-string) 0 19)) |
24558
ea8a9509b52f
(compilation-handle-exit): Do right thing
Richard M. Stallman <rms@gnu.org>
parents:
24326
diff
changeset
|
1399 (goto-char (point-max)) |
42939
0786ea38f9fd
(compilation-handle-exit):
Richard M. Stallman <rms@gnu.org>
parents:
42408
diff
changeset
|
1400 ;; Prevent that message from being recognized as a compilation error. |
0786ea38f9fd
(compilation-handle-exit):
Richard M. Stallman <rms@gnu.org>
parents:
42408
diff
changeset
|
1401 (add-text-properties omax (point) |
0786ea38f9fd
(compilation-handle-exit):
Richard M. Stallman <rms@gnu.org>
parents:
42408
diff
changeset
|
1402 (append '(compilation-handle-exit t) nil)) |
14260
4577848d3ef2
(compilation-handle-exit): Undo previous change.
Karl Heuer <kwzh@gnu.org>
parents:
14250
diff
changeset
|
1403 (setq mode-line-process (format ":%s [%s]" process-status (cdr status))) |
14045
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1404 ;; Force mode line redisplay soon. |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1405 (force-mode-line-update) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1406 (if (and opoint (< opoint omax)) |
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1407 (goto-char opoint)) |
88155 | 1408 (with-no-warnings |
1409 (if compilation-finish-function | |
1410 (funcall compilation-finish-function (current-buffer) msg))) | |
16042
18414e324084
(compilation-finish-functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15084
diff
changeset
|
1411 (let ((functions compilation-finish-functions)) |
18414e324084
(compilation-finish-functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15084
diff
changeset
|
1412 (while functions |
18414e324084
(compilation-finish-functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15084
diff
changeset
|
1413 (funcall (car functions) (current-buffer) msg) |
18414e324084
(compilation-finish-functions): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15084
diff
changeset
|
1414 (setq functions (cdr functions)))))) |
14045
1300c7703f67
(compilation-handle-exit): New function, broken out of compilation-sentinel.
Roland McGrath <roland@gnu.org>
parents:
13972
diff
changeset
|
1415 |
71 | 1416 ;; Called when compilation process changes state. |
1417 (defun compilation-sentinel (proc msg) | |
418 | 1418 "Sentinel for compilation buffers." |
88155 | 1419 (if (memq (process-status proc) '(exit signal)) |
1420 (let ((buffer (process-buffer proc))) | |
1421 (if (null (buffer-name buffer)) | |
1422 ;; buffer killed | |
1423 (set-process-buffer proc nil) | |
1424 (with-current-buffer buffer | |
1425 ;; Write something in the compilation buffer | |
1426 ;; and hack its mode line. | |
1427 (compilation-handle-exit (process-status proc) | |
1428 (process-exit-status proc) | |
1429 msg) | |
1430 ;; Since the buffer and mode line will show that the | |
1431 ;; process is dead, we can delete it now. Otherwise it | |
1432 ;; will stay around until M-x list-processes. | |
1433 (delete-process proc))) | |
1434 (setq compilation-in-progress (delq proc compilation-in-progress))))) | |
71 | 1435 |
2472
f911936cec3f
(compilation-filter): New function.
Roland McGrath <roland@gnu.org>
parents:
2471
diff
changeset
|
1436 (defun compilation-filter (proc string) |
f911936cec3f
(compilation-filter): New function.
Roland McGrath <roland@gnu.org>
parents:
2471
diff
changeset
|
1437 "Process filter for compilation buffers. |
2760
1c7595e3089b
(Setting minor-mode-map-alist):
Richard M. Stallman <rms@gnu.org>
parents:
2603
diff
changeset
|
1438 Just inserts the text, but uses `insert-before-markers'." |
9511
3b5dbd9c44f5
(compilation-filter): Do nothing if buffer is dead.
Richard M. Stallman <rms@gnu.org>
parents:
9473
diff
changeset
|
1439 (if (buffer-name (process-buffer proc)) |
88155 | 1440 (with-current-buffer (process-buffer proc) |
1441 (let ((inhibit-read-only t)) | |
9511
3b5dbd9c44f5
(compilation-filter): Do nothing if buffer is dead.
Richard M. Stallman <rms@gnu.org>
parents:
9473
diff
changeset
|
1442 (save-excursion |
3b5dbd9c44f5
(compilation-filter): Do nothing if buffer is dead.
Richard M. Stallman <rms@gnu.org>
parents:
9473
diff
changeset
|
1443 (goto-char (process-mark proc)) |
3b5dbd9c44f5
(compilation-filter): Do nothing if buffer is dead.
Richard M. Stallman <rms@gnu.org>
parents:
9473
diff
changeset
|
1444 (insert-before-markers string) |
88155 | 1445 (run-hooks 'compilation-filter-hook)))))) |
1446 | |
1447 ;;; test if a buffer is a compilation buffer, assuming we're in the buffer | |
1448 (defsubst compilation-buffer-internal-p () | |
1449 "Test if inside a compilation buffer." | |
1450 (local-variable-p 'compilation-locs)) | |
1451 | |
1452 ;;; test if a buffer is a compilation buffer, using compilation-buffer-internal-p | |
1453 (defsubst compilation-buffer-p (buffer) | |
1454 "Test if BUFFER is a compilation buffer." | |
1455 (with-current-buffer buffer | |
1456 (compilation-buffer-internal-p))) | |
2472
f911936cec3f
(compilation-filter): New function.
Roland McGrath <roland@gnu.org>
parents:
2471
diff
changeset
|
1457 |
88155 | 1458 (defmacro compilation-loop (< property-change 1+ error) |
1459 `(while (,< n 0) | |
1460 (or (setq pt (,property-change pt 'message)) | |
1461 (error ,error compilation-error)) | |
1462 ;; prop 'message usually has 2 changes, on and off, so re-search if off | |
1463 (or (setq msg (get-text-property pt 'message)) | |
1464 (if (setq pt (,property-change pt 'message)) | |
1465 (setq msg (get-text-property pt 'message))) | |
1466 (error ,error compilation-error)) | |
1467 (or (< (cadr msg) compilation-skip-threshold) | |
1468 (if different-file | |
1469 (eq (prog1 last (setq last (nth 2 (car msg)))) | |
1470 last)) | |
1471 (if compilation-skip-visited | |
1472 (nthcdr 4 (car msg))) | |
1473 (if compilation-skip-to-next-location | |
1474 (eq (car msg) loc)) | |
1475 ;; count this message only if none of the above are true | |
1476 (setq n (,1+ n))))) | |
920 | 1477 |
88155 | 1478 (defun compilation-next-error (n &optional different-file pt) |
894 | 1479 "Move point to the next error in the compilation buffer. |
26222 | 1480 Prefix arg N says how many error messages to move forwards (or |
1481 backwards, if negative). | |
894 | 1482 Does NOT find the source line like \\[next-error]." |
1483 (interactive "p") | |
1484 (or (compilation-buffer-p (current-buffer)) | |
26222 | 1485 (error "Not in a compilation buffer")) |
88155 | 1486 (or pt (setq pt (point))) |
1487 (let* ((msg (get-text-property pt 'message)) | |
1488 (loc (car msg)) | |
1489 last) | |
1490 (if (zerop n) | |
1491 (unless (or msg ; find message near here | |
1492 (setq msg (get-text-property (max (1- pt) (point-min)) | |
1493 'message))) | |
1494 (setq pt (previous-single-property-change pt 'message nil | |
1495 (line-beginning-position))) | |
1496 (unless (setq msg (get-text-property (max (1- pt) (point-min)) 'message)) | |
1497 (setq pt (next-single-property-change pt 'message nil | |
1498 (line-end-position))) | |
1499 (or (setq msg (get-text-property pt 'message)) | |
1500 (setq pt (point))))) | |
1501 (setq last (nth 2 (car msg))) | |
1502 (if (>= n 0) | |
1503 (compilation-loop > next-single-property-change 1- | |
1504 (if (get-buffer-process (current-buffer)) | |
1505 "No more %ss yet" | |
1506 "Moved past last %s")) | |
1507 ;; Don't move "back" to message at or before point. | |
1508 ;; Pass an explicit (point-min) to make sure pt is non-nil. | |
1509 (setq pt (previous-single-property-change pt 'message nil (point-min))) | |
1510 (compilation-loop < previous-single-property-change 1+ | |
1511 "Moved back before first %s"))) | |
1512 (goto-char pt) | |
1513 (or msg | |
1514 (error "No %s here" compilation-error)))) | |
894 | 1515 |
1516 (defun compilation-previous-error (n) | |
1517 "Move point to the previous error in the compilation buffer. | |
26222 | 1518 Prefix arg N says how many error messages to move backwards (or |
1519 forwards, if negative). | |
88155 | 1520 Does NOT find the source line like \\[previous-error]." |
894 | 1521 (interactive "p") |
1522 (compilation-next-error (- n))) | |
1523 | |
920 | 1524 (defun compilation-next-file (n) |
88155 | 1525 "Move point to the next error for a different file than the current one. |
1526 Prefix arg N says how many files to move forwards (or backwards, if negative)." | |
920 | 1527 (interactive "p") |
88155 | 1528 (compilation-next-error n t)) |
920 | 1529 |
1530 (defun compilation-previous-file (n) | |
88155 | 1531 "Move point to the previous error for a different file than the current one. |
1532 Prefix arg N says how many files to move backwards (or forwards, if negative)." | |
920 | 1533 (interactive "p") |
1534 (compilation-next-file (- n))) | |
1535 | |
71 | 1536 (defun kill-compilation () |
45582
08fe4d419957
Modified doc string to say that the kill-compilation function also
Robert J. Chassell <bob@rattlesnake.com>
parents:
45215
diff
changeset
|
1537 "Kill the process made by the \\[compile] or \\[grep] commands." |
71 | 1538 (interactive) |
418 | 1539 (let ((buffer (compilation-find-buffer))) |
71 | 1540 (if (get-buffer-process buffer) |
418 | 1541 (interrupt-process (get-buffer-process buffer)) |
88155 | 1542 (error "The %s process is not running" (downcase mode-name))))) |
71 | 1543 |
88155 | 1544 (defalias 'compile-mouse-goto-error 'compile-goto-error) |
418 | 1545 |
88155 | 1546 (defun compile-goto-error (&optional event) |
1547 "Visit the source for the error message at point. | |
1548 Use this command in a compilation log buffer. Sets the mark at point there." | |
1549 (interactive (list last-input-event)) | |
1550 (if event (posn-set-point (event-end event))) | |
418 | 1551 (or (compilation-buffer-p (current-buffer)) |
26222 | 1552 (error "Not in a compilation buffer")) |
88155 | 1553 (if (get-text-property (point) 'directory) |
1554 (dired-other-window (car (get-text-property (point) 'directory))) | |
1555 (push-mark) | |
1556 (setq compilation-current-error (point)) | |
1557 (next-error-internal))) | |
71 | 1558 |
418 | 1559 ;; Return a compilation buffer. |
1560 ;; If the current buffer is a compilation buffer, return it. | |
1561 ;; Otherwise, look for a compilation buffer and signal an error | |
1562 ;; if there are none. | |
88155 | 1563 (defun compilation-find-buffer (&optional avoid-current) |
1564 (next-error-find-buffer avoid-current 'compilation-buffer-internal-p)) | |
418 | 1565 |
1566 ;;;###autoload | |
88155 | 1567 (defun compilation-next-error-function (n &optional reset) |
1568 "Advance to the next error message and visit the file where the error was. | |
1569 This is the value of `next-error-function' in Compilation buffers." | |
1570 (interactive "p") | |
1571 (when reset | |
1572 (setq compilation-current-error nil)) | |
1573 (let* ((columns compilation-error-screen-columns) ; buffer's local value | |
1574 (last 1) | |
1575 (loc (compilation-next-error (or n 1) nil | |
1576 (or compilation-current-error | |
1577 compilation-messages-start | |
1578 (point-min)))) | |
1579 (end-loc (nth 2 loc)) | |
1580 (marker (point-marker))) | |
1581 (setq compilation-current-error (point-marker) | |
1582 overlay-arrow-position | |
1583 (if (bolp) | |
1584 compilation-current-error | |
1585 (copy-marker (line-beginning-position))) | |
1586 loc (car loc)) | |
1587 ;; If loc contains no marker, no error in that file has been visited. If | |
1588 ;; the marker is invalid the buffer has been killed. So, recalculate all | |
1589 ;; markers for that file. | |
1590 (unless (and (nth 3 loc) (marker-buffer (nth 3 loc))) | |
1591 (with-current-buffer (compilation-find-file marker (caar (nth 2 loc)) | |
1592 (cadr (car (nth 2 loc)))) | |
1593 (save-restriction | |
1594 (widen) | |
1595 (goto-char (point-min)) | |
1596 ;; Treat file's found lines in forward order, 1 by 1. | |
1597 (dolist (line (reverse (cddr (nth 2 loc)))) | |
1598 (when (car line) ; else this is a filename w/o a line# | |
1599 (beginning-of-line (- (car line) last -1)) | |
1600 (setq last (car line))) | |
1601 ;; Treat line's found columns and store/update a marker for each. | |
1602 (dolist (col (cdr line)) | |
1603 (if (car col) | |
1604 (if (eq (car col) -1) ; special case for range end | |
1605 (end-of-line) | |
1606 (compilation-move-to-column (car col) columns)) | |
1607 (beginning-of-line) | |
1608 (skip-chars-forward " \t")) | |
1609 (if (nth 3 col) | |
1610 (set-marker (nth 3 col) (point)) | |
1611 (setcdr (nthcdr 2 col) `(,(point-marker))))))))) | |
1612 (compilation-goto-locus marker (nth 3 loc) (nth 3 end-loc)) | |
1613 (setcdr (nthcdr 3 loc) t))) ; Set this one as visited. | |
71 | 1614 |
88155 | 1615 (defvar compilation-gcpro nil |
1616 "Internal variable used to keep some values from being GC'd.") | |
1617 (make-variable-buffer-local 'compilation-gcpro) | |
1618 | |
1619 (defun compilation-fake-loc (marker file &optional line col) | |
1620 "Preassociate MARKER with FILE. | |
1621 FILE should be ABSOLUTE-FILENAME or (RELATIVE-FILENAME . DIRNAME). | |
1622 This is useful when you compile temporary files, but want | |
1623 automatic translation of the messages to the real buffer from | |
1624 which the temporary file came. This only works if done before a | |
1625 message about FILE appears! | |
1626 | |
1627 Optional args LINE and COL default to 1 and beginning of | |
1628 indentation respectively. The marker is expected to reflect | |
1629 this. In the simplest case the marker points to the first line | |
1630 of the region that was saved to the temp file. | |
71 | 1631 |
88155 | 1632 If you concatenate several regions into the temp file (e.g. a |
1633 header with variable assignments and a code region), you must | |
1634 call this several times, once each for the last line of one | |
1635 region and the first line of the next region." | |
1636 (or (consp file) (setq file (list file))) | |
1637 (setq file (compilation-get-file-structure file)) | |
1638 ;; Between the current call to compilation-fake-loc and the first occurrence | |
1639 ;; of an error message referring to `file', the data is only kept is the | |
1640 ;; weak hash-table compilation-locs, so we need to prevent this entry | |
1641 ;; in compilation-locs from being GC'd away. --Stef | |
1642 (push file compilation-gcpro) | |
1643 (let ((loc (compilation-assq (or line 1) (cdr file)))) | |
1644 (setq loc (compilation-assq col loc)) | |
1645 (if (cdr loc) | |
1646 (setcdr (cddr loc) (list marker)) | |
1647 (setcdr loc (list line file marker))) | |
1648 loc)) | |
8425
8b8835f1630a
Set up a "Compile" menubar item.
Richard M. Stallman <rms@gnu.org>
parents:
8406
diff
changeset
|
1649 |
88155 | 1650 (defcustom compilation-context-lines nil |
1651 "Display this many lines of leading context before the current message. | |
1652 If nil and the left fringe is displayed, don't scroll the | |
1653 compilation output window; an arrow in the left fringe points to | |
1654 the current message. If nil and there is no left fringe, the message | |
1655 displays at the top of the window; there is no arrow." | |
1656 :type '(choice integer (const :tag "No window scrolling" nil)) | |
1657 :group 'compilation | |
1658 :version "22.1") | |
16448
39556b6d7c6e
(compilation-skip-to-next-location): Defined.
Karl Heuer <kwzh@gnu.org>
parents:
16042
diff
changeset
|
1659 |
88155 | 1660 (defsubst compilation-set-window (w mk) |
1661 "Align the compilation output window W with marker MK near top." | |
1662 (if (integerp compilation-context-lines) | |
1663 (set-window-start w (save-excursion | |
1664 (goto-char mk) | |
1665 (beginning-of-line | |
1666 (- 1 compilation-context-lines)) | |
1667 (point))) | |
1668 ;; If there is no left fringe. | |
1669 (if (equal (car (window-fringes)) 0) | |
1670 (set-window-start w (save-excursion | |
1671 (goto-char mk) | |
1672 (beginning-of-line 1) | |
1673 (point))))) | |
1674 (set-window-point w mk)) | |
6240
5ce2192f76e1
(compile-reinitialize-errors): Rename first arg from ARGP to REPARSE.
Roland McGrath <roland@gnu.org>
parents:
6197
diff
changeset
|
1675 |
88155 | 1676 (defvar next-error-highlight-timer) |
6240
5ce2192f76e1
(compile-reinitialize-errors): Rename first arg from ARGP to REPARSE.
Roland McGrath <roland@gnu.org>
parents:
6197
diff
changeset
|
1677 |
88155 | 1678 (defun compilation-goto-locus (msg mk end-mk) |
1679 "Jump to an error corresponding to MSG at MK. | |
1680 All arguments are markers. If END-MK is non-nil, mark is set there | |
1681 and overlay is highlighted between MK and END-MK." | |
1682 ;; Show compilation buffer in other window, scrolled to this error. | |
1683 (let* ((from-compilation-buffer (eq (window-buffer (selected-window)) | |
1684 (marker-buffer msg))) | |
1685 ;; Use an existing window if it is in a visible frame. | |
1686 (pre-existing (get-buffer-window (marker-buffer msg) 0)) | |
1687 (w (if (and from-compilation-buffer pre-existing) | |
1688 ;; Calling display-buffer here may end up (partly) hiding | |
1689 ;; the error location if the two buffers are in two | |
1690 ;; different frames. So don't do it if it's not necessary. | |
1691 pre-existing | |
1692 (let ((display-buffer-reuse-frames t) | |
1693 (pop-up-windows t)) | |
1694 ;; Pop up a window. | |
1695 (display-buffer (marker-buffer msg))))) | |
1696 (highlight-regexp (with-current-buffer (marker-buffer msg) | |
1697 ;; also do this while we change buffer | |
1698 (compilation-set-window w msg) | |
1699 compilation-highlight-regexp))) | |
1700 ;; Ideally, the window-size should be passed to `display-buffer' (via | |
1701 ;; something like special-display-buffer) so it's only used when | |
1702 ;; creating a new window. | |
1703 (unless pre-existing (compilation-set-window-height w)) | |
1704 | |
1705 (if from-compilation-buffer | |
1706 ;; If the compilation buffer window was selected, | |
1707 ;; keep the compilation buffer in this window; | |
1708 ;; display the source in another window. | |
1709 (let ((pop-up-windows t)) | |
1710 (pop-to-buffer (marker-buffer mk) 'other-window)) | |
1711 (if (window-dedicated-p (selected-window)) | |
1712 (pop-to-buffer (marker-buffer mk)) | |
1713 (switch-to-buffer (marker-buffer mk)))) | |
1714 ;; If narrowing gets in the way of going to the right place, widen. | |
1715 (unless (eq (goto-char mk) (point)) | |
1716 (widen) | |
1717 (goto-char mk)) | |
1718 (if end-mk | |
1719 (push-mark end-mk t) | |
1720 (if mark-active (setq mark-active))) | |
1721 ;; If hideshow got in the way of | |
1722 ;; seeing the right place, open permanently. | |
1723 (dolist (ov (overlays-at (point))) | |
1724 (when (eq 'hs (overlay-get ov 'invisible)) | |
1725 (delete-overlay ov) | |
1726 (goto-char mk))) | |
1727 | |
1728 (when highlight-regexp | |
1729 (if (timerp next-error-highlight-timer) | |
1730 (cancel-timer next-error-highlight-timer)) | |
1731 (unless compilation-highlight-overlay | |
1732 (setq compilation-highlight-overlay | |
1733 (make-overlay (point-min) (point-min))) | |
1734 (overlay-put compilation-highlight-overlay 'face 'next-error)) | |
1735 (with-current-buffer (marker-buffer mk) | |
1736 (save-excursion | |
1737 (if end-mk (goto-char end-mk) (end-of-line)) | |
1738 (let ((end (point))) | |
1739 (if mk (goto-char mk) (beginning-of-line)) | |
1740 (if (and (stringp highlight-regexp) | |
1741 (re-search-forward highlight-regexp end t)) | |
8351
bbd2d410ab94
Finish installing previous change.
Richard M. Stallman <rms@gnu.org>
parents:
8342
diff
changeset
|
1742 (progn |
88155 | 1743 (goto-char (match-beginning 0)) |
1744 (move-overlay compilation-highlight-overlay | |
1745 (match-beginning 0) (match-end 0) | |
1746 (current-buffer))) | |
1747 (move-overlay compilation-highlight-overlay | |
1748 (point) end (current-buffer))) | |
1749 (if (numberp next-error-highlight) | |
1750 (setq next-error-highlight-timer | |
1751 (run-at-time next-error-highlight nil 'delete-overlay | |
1752 compilation-highlight-overlay))) | |
1753 (if (not (or (eq next-error-highlight t) | |
1754 (numberp next-error-highlight))) | |
1755 (delete-overlay compilation-highlight-overlay)))))) | |
1756 (when (and (eq next-error-highlight 'fringe-arrow)) | |
1757 (setq next-error-overlay-arrow-position | |
1758 (copy-marker (line-beginning-position)))))) | |
418 | 1759 |
6240
5ce2192f76e1
(compile-reinitialize-errors): Rename first arg from ARGP to REPARSE.
Roland McGrath <roland@gnu.org>
parents:
6197
diff
changeset
|
1760 |
88155 | 1761 (defun compilation-find-file (marker filename directory &rest formats) |
26222 | 1762 "Find a buffer for file FILENAME. |
30878
13a1a0ec31e5
(grep): Provide a default set of files.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30688
diff
changeset
|
1763 Search the directories in `compilation-search-path'. |
13a1a0ec31e5
(grep): Provide a default set of files.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30688
diff
changeset
|
1764 A nil in `compilation-search-path' means to try the |
88155 | 1765 \"current\" directory, which is passed in DIRECTORY. |
1766 If DIRECTORY. is relative, it is combined with `default-directory'. | |
1767 If DIRECTORY. is nil, that means use `default-directory'. | |
26222 | 1768 If FILENAME is not found at all, ask the user where to find it. |
1769 Pop up the buffer containing MARKER and scroll to MARKER if we ask the user." | |
10928
a008a9d8966a
(compilation-buffer-p): Fix braino in last change: switch to the buffer first.
Roland McGrath <roland@gnu.org>
parents:
10842
diff
changeset
|
1770 (or formats (setq formats '("%s"))) |
26990
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1771 (save-excursion |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1772 (let ((dirs compilation-search-path) |
88155 | 1773 (spec-dir (if directory |
1774 (expand-file-name directory) | |
1775 default-directory)) | |
26990
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1776 buffer thisdir fmts name) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1777 (if (file-name-absolute-p filename) |
38493
864c2b4076f8
(compilation-parse-errors): `linenum' might return a this-error using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38412
diff
changeset
|
1778 ;; The file name is absolute. Use its explicit directory as |
864c2b4076f8
(compilation-parse-errors): `linenum' might return a this-error using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38412
diff
changeset
|
1779 ;; the first in the search path, and strip it from FILENAME. |
864c2b4076f8
(compilation-parse-errors): `linenum' might return a this-error using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38412
diff
changeset
|
1780 (setq filename (abbreviate-file-name (expand-file-name filename)) |
864c2b4076f8
(compilation-parse-errors): `linenum' might return a this-error using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38412
diff
changeset
|
1781 dirs (cons (file-name-directory filename) dirs) |
864c2b4076f8
(compilation-parse-errors): `linenum' might return a this-error using
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
38412
diff
changeset
|
1782 filename (file-name-nondirectory filename))) |
26990
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1783 ;; Now search the path. |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1784 (while (and dirs (null buffer)) |
88155 | 1785 (setq thisdir (or (car dirs) spec-dir) |
26990
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1786 fmts formats) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1787 ;; For each directory, try each format string. |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1788 (while (and fmts (null buffer)) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1789 (setq name (expand-file-name (format (car fmts) filename) thisdir) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1790 buffer (and (file-exists-p name) |
30878
13a1a0ec31e5
(grep): Provide a default set of files.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30688
diff
changeset
|
1791 (find-file-noselect name)) |
26990
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1792 fmts (cdr fmts))) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1793 (setq dirs (cdr dirs))) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1794 (or buffer |
88155 | 1795 ;; The file doesn't exist. Ask the user where to find it. |
1796 (let ((pop-up-windows t)) | |
1797 (compilation-set-window (display-buffer (marker-buffer marker)) | |
1798 marker) | |
26990
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1799 (let ((name (expand-file-name |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1800 (read-file-name |
88155 | 1801 (format "Find this %s in (default %s): " |
1802 compilation-error filename) | |
1803 spec-dir filename t)))) | |
26990
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1804 (if (file-directory-p name) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1805 (setq name (expand-file-name filename name))) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1806 (setq buffer (and (file-exists-p name) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1807 (find-file name)))))) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1808 ;; Make intangible overlays tangible. |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1809 (mapcar (function (lambda (ov) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1810 (when (overlay-get ov 'intangible) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1811 (overlay-put ov 'intangible nil)))) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1812 (overlays-in (point-min) (point-max))) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1813 buffer))) |
5d153e0fe112
(compilation-goto-locus): Delete hideshow overlays if they interfere.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
26488
diff
changeset
|
1814 |
88155 | 1815 (defun compilation-get-file-structure (file &optional fmt) |
1816 "Retrieve FILE's file-structure or create a new one. | |
1817 FILE should be (FILENAME) or (RELATIVE-FILENAME . DIRNAME). | |
1818 In the former case, FILENAME may be relative or absolute. | |
418 | 1819 |
88155 | 1820 The file-structure looks like this: |
1821 (list (list FILENAME [DIR-FROM-PREV-MSG]) FMT LINE-STRUCT...) | |
1822 " | |
1823 (or (gethash file compilation-locs) | |
1824 ;; File was not previously encountered, at least not in the form passed. | |
1825 ;; Let's normalize it and look again. | |
1826 (let ((filename (car file)) | |
1827 ;; Get the specified directory from FILE. | |
1828 (spec-directory (if (cdr file) | |
1829 (file-truename (cdr file))))) | |
418 | 1830 |
88155 | 1831 ;; Check for a comint-file-name-prefix and prepend it if appropriate. |
1832 ;; (This is very useful for compilation-minor-mode in an rlogin-mode | |
1833 ;; buffer.) | |
1834 (when (and (boundp 'comint-file-name-prefix) | |
1835 (not (equal comint-file-name-prefix ""))) | |
1836 (if (file-name-absolute-p filename) | |
1837 (setq filename | |
1838 (concat comint-file-name-prefix filename)) | |
1839 (if spec-directory | |
1840 (setq spec-directory | |
1841 (file-truename | |
1842 (concat comint-file-name-prefix spec-directory)))))) | |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1843 |
88155 | 1844 ;; If compilation-parse-errors-filename-function is |
1845 ;; defined, use it to process the filename. | |
1846 (when compilation-parse-errors-filename-function | |
1847 (setq filename | |
1848 (funcall compilation-parse-errors-filename-function | |
1849 filename))) | |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1850 |
88155 | 1851 ;; Some compilers (e.g. Sun's java compiler, reportedly) produce bogus |
1852 ;; file names like "./bar//foo.c" for file "bar/foo.c"; | |
1853 ;; expand-file-name will collapse these into "/foo.c" and fail to find | |
1854 ;; the appropriate file. So we look for doubled slashes in the file | |
1855 ;; name and fix them. | |
1856 (setq filename (command-line-normalize-file-name filename)) | |
418 | 1857 |
88155 | 1858 ;; Store it for the possibly unnormalized name |
1859 (puthash file | |
1860 ;; Retrieve or create file-structure for normalized name | |
1861 (or (gethash (list filename) compilation-locs) | |
1862 (puthash (list filename) | |
1863 (list (list filename spec-directory) fmt) | |
1864 compilation-locs)) | |
1865 compilation-locs)))) | |
935 | 1866 |
88155 | 1867 (add-to-list 'debug-ignored-errors "^No more [-a-z ]+s yet$") |
5472
ed690a728e13
(compilation-buffer-p): Move defsubst before all callers.
Roland McGrath <roland@gnu.org>
parents:
5456
diff
changeset
|
1868 |
88155 | 1869 ;;; Compatibility with the old compile.el. |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1870 |
88155 | 1871 (defun compile-buffer-substring (n) (if n (match-string n))) |
5472
ed690a728e13
(compilation-buffer-p): Move defsubst before all callers.
Roland McGrath <roland@gnu.org>
parents:
5456
diff
changeset
|
1872 |
88155 | 1873 (defun compilation-compat-error-properties (err) |
1874 "Map old-style error ERR to new-style message." | |
1875 ;; Old-style structure is (MARKER (FILE DIR) LINE COL) or | |
1876 ;; (MARKER . MARKER). | |
1877 (let ((dst (cdr err))) | |
1878 (if (markerp dst) | |
1879 ;; Must start with a face, for font-lock. | |
1880 `(face nil | |
1881 message ,(list (list nil nil nil dst) 2) | |
1882 help-echo "mouse-2: visit the source location" | |
1883 keymap compilation-button-map | |
1884 mouse-face highlight) | |
1885 ;; Too difficult to do it by hand: dispatch to the normal code. | |
1886 (let* ((file (pop dst)) | |
1887 (line (pop dst)) | |
1888 (col (pop dst)) | |
1889 (filename (pop file)) | |
1890 (dirname (pop file)) | |
1891 (fmt (pop file))) | |
1892 (compilation-internal-error-properties | |
1893 (cons filename dirname) line nil col nil 2 fmt))))) | |
5475
e723f6be6239
(compilation-parse-errors): Prepend comint-file-name-prefix (if boundp) to
Roland McGrath <roland@gnu.org>
parents:
5472
diff
changeset
|
1894 |
88155 | 1895 (defun compilation-compat-parse-errors (limit) |
1896 (when compilation-parse-errors-function | |
1897 ;; FIXME: We should remove the rest of the compilation keywords | |
1898 ;; but we can't do that from here because font-lock is using | |
1899 ;; the value right now. --stef | |
1900 (save-excursion | |
1901 (setq compilation-error-list nil) | |
1902 ;; Reset compilation-parsing-end each time because font-lock | |
1903 ;; might force us the re-parse many times (typically because | |
1904 ;; some code adds some text-property to the output that we | |
1905 ;; already parsed). You might say "why reparse", well: | |
1906 ;; because font-lock has just removed the `message' property so | |
1907 ;; have to do it all over again. | |
1908 (if compilation-parsing-end | |
1909 (set-marker compilation-parsing-end (point)) | |
1910 (setq compilation-parsing-end (point-marker))) | |
1911 (condition-case nil | |
1912 ;; Ignore any error: we're calling this function earlier than | |
1913 ;; in the old compile.el so things might not all be setup yet. | |
1914 (funcall compilation-parse-errors-function limit nil) | |
1915 (error nil)) | |
1916 (dolist (err (if (listp compilation-error-list) compilation-error-list)) | |
1917 (let* ((src (car err)) | |
1918 (dst (cdr err)) | |
1919 (loc (cond ((markerp dst) (list nil nil nil dst)) | |
1920 ((consp dst) | |
1921 (list (nth 2 dst) (nth 1 dst) | |
1922 (cons (cdar dst) (caar dst))))))) | |
1923 (when loc | |
1924 (goto-char src) | |
1925 ;; (put-text-property src (line-end-position) 'font-lock-face 'font-lock-warning-face) | |
1926 (put-text-property src (line-end-position) | |
1927 'message (list loc 2))))))) | |
1928 (goto-char limit) | |
1929 nil) | |
17623
a09fd9348b0d
Support compilers that give a message each time the file being
Richard M. Stallman <rms@gnu.org>
parents:
17582
diff
changeset
|
1930 |
88155 | 1931 ;; Beware: this is not only compatiblity code. New code stil uses it. --Stef |
1932 (defun compilation-forget-errors () | |
1933 ;; In case we hit the same file/line specs, we want to recompute a new | |
1934 ;; marker for them, so flush our cache. | |
1935 (setq compilation-locs (make-hash-table :test 'equal :weakness 'value)) | |
1936 (setq compilation-gcpro nil) | |
1937 ;; FIXME: the old code reset the directory-stack, so maybe we should | |
1938 ;; put a `directory change' marker of some sort, but where? -stef | |
1939 ;; | |
1940 ;; FIXME: The old code moved compilation-current-error (which was | |
1941 ;; virtually represented by a mix of compilation-parsing-end and | |
1942 ;; compilation-error-list) to point-min, but that was only meaningful for | |
1943 ;; the internal uses of compilation-forget-errors: all calls from external | |
1944 ;; packages seem to be followed by a move of compilation-parsing-end to | |
1945 ;; something equivalent to point-max. So we speculatively move | |
1946 ;; compilation-current-error to point-max (since the external package | |
1947 ;; won't know that it should do it). --stef | |
1948 (setq compilation-current-error nil) | |
1949 (let* ((proc (get-buffer-process (current-buffer))) | |
1950 (mark (if proc (process-mark proc))) | |
1951 (pos (or mark (point-max)))) | |
1952 (setq compilation-messages-start | |
1953 ;; In the future, ignore the text already present in the buffer. | |
1954 ;; Since many process filter functions insert before markers, | |
1955 ;; we need to put ours just before the insertion point rather | |
1956 ;; than at the insertion point. If that's not possible, then | |
1957 ;; don't use a marker. --Stef | |
1958 (if (> pos (point-min)) (copy-marker (1- pos)) pos)))) | |
71 | 1959 |
88155 | 1960 ;;;###autoload |
1961 (add-to-list 'auto-mode-alist '("\\.gcov\\'" . compilation-mode)) | |
29078 | 1962 |
621 | 1963 (provide 'compile) |
712
16823e891d56
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
621
diff
changeset
|
1964 |
88155 | 1965 ;; arch-tag: 12465727-7382-4f72-b234-79855a00dd8c |
712
16823e891d56
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
621
diff
changeset
|
1966 ;;; compile.el ends here |