(provide (quote compile))

(defvar compilation-process nil "\
Process created by compile command, or nil if none exists now.
Note that the process may have been \"deleted\" and still
be the value of this variable.")

(defvar compilation-error-list nil "\
List of error message descriptors for visiting erring functions.
Each error descriptor is a list of length two.
Its car is a marker pointing to an error message.
Its cadr is a marker pointing to the text of the line the message is about,
  or nil if that is not interesting.
The value may be t instead of a list;
this means that the buffer of error messages should be reparsed
the next time the list of errors is wanted.")

(defvar compilation-parsing-end nil "\
Position of end of buffer when last error messages parsed.")

(defvar compilation-error-message nil "\
Message to print when no more matches for compilation-error-regexp are found")

(defvar compilation-error-regexp "\\([^ :
]+\\(: *\\|, line \\|(\\)[0-9]+\\)\\|\\([0-9]+ *of *[^ 
]+\\)" "Regular expression for filename/linenumber in error in compilation log.")

(defun compile (command) "\
Compile the program including the current buffer.  Default: run `make'.
Runs COMMAND, a shell command, in a separate process asynchronously
with output going to the buffer *compilation*.
You can then use the command \\[next-error] to find the next error message
and move to the source code that caused it." (interactive (byte-code "\"C" [compile-command read-string "Compile command: "] 3)) (byte-code "ˆ	\"" [compile-command command nil compile1 "No more errors"] 3))

(defun grep (command) "\
Run grep, with user-specified args, and collect output in a buffer.
While grep runs asynchronously, you can use the \\[next-error] command
to find the text that grep hits refer to." (interactive "sRun grep (with args): ") (byte-code "Q#" [command nil compile1 "grep -n " " /dev/null" "No more grep hits" "grep"] 4))

(defun compile1 (command error-message &optional name-of-mode) (byte-code "  !=?!؏ ! É
P%ސ!! ! \"	!

qe)\" =\")	 !
)," [compilation-process nil compilation-error-list t compilation-error-message error-message shell-file-name command default-directory thisdir outbuf outwin regexp compilation-error-regexp start mode-name name-of-mode mode-line-process save-some-buffers process-status run yes-or-no-p "A compilation process is running; kill it? " (byte-code "	!!!)" [comp-proc compilation-process interrupt-process sit-for 1 delete-process] 4) ((error (byte-code "" [nil] 1))) error "Cannot have two compilation processes" compilation-forget-errors start-process "compilation" "*compilation*" "-c" "exec " princ "cd " terpri set-process-sentinel compilation-sentinel process-buffer get-buffer-window buffer-flush-undo set-window-start selected-window set-window-point fundamental-mode make-local-variable "Compilation" (": %s")] 22))

(defun compilation-sentinel (proc msg) (byte-code "!!?\"g!>gpΎ!qd`db
$! O\"!!!P!)^Wcb
q+" [proc nil obuf omax opoint mode-name msg mode-line-process compilation-process buffer-name process-buffer set-process-buffer process-status (signal exit) ((byte-code " !" [compilation-process nil set-buffer-modified-p buffer-modified-p] 3)) insert 10 " " forward-char -1 " at " current-time-string 0 -5 1 ": " symbol-name delete-process] 15))

(defun kill-compilation nil "\
Kill the process made by the \\[compile] command." (interactive) (byte-code "	!" [compilation-process nil interrupt-process] 2))

(defun kill-grep nil "\
Kill the process made by the \\[grep] command." (interactive) (byte-code "	!" [compilation-process nil interrupt-process] 2))

(defun next-error (&optional argp) "\
Visit next compilation error message and corresponding source code.
This operates on the output from the \\[compile] command.
If all preparsed error messages have been processed,
the error message buffer is checked for new ones.
A non-nil argument (prefix arg, if interactive)
means reparse the error message buffer and start at the first error." (interactive "P") (byte-code "Ĉ=	
 ˉĂ&q! )@
@\")" [compilation-error-list t argp compilation-parsing-end nil next-error compilation-error-message compilation-process pop-up-windows w compilation-forget-errors 1 "*compilation*" set-buffer-modified-p compilation-parse-errors error process-status run " yet" "" switch-to-buffer marker-buffer set-marker display-buffer set-window-point set-window-start] 15))

(defun compilation-forget-errors nil (byte-code "=	‰-@@\"A@#A@\")A
" [compilation-error-list t nil next-error set-marker] 5))

(defun compilation-parse-errors nil "\
Parse the current buffer as error messages.
This makes a list of error descriptors, compilation-error-list.
For each source-file, line-number pair in the buffer,
the source file is read in, and the text location is saved in compilation-error-list.
The function next-error, assigned to \\[next-error], takes the next error off the list
and visits its location." (byte-code "!
	!!\"db!hUee T\" !!`!\"db!!xp!ebebp!db! 	)	\"U! 
	\"?	!	!Ӊ

q!bZ! 
DB)!,d+!!" [compilation-error-list nil text-buffer last-filename last-linenum compilation-parsing-end compilation-error-regexp t linenum filename error-marker text-marker message "Parsing error messages..." forward-line 2 re-search-forward narrow-to-region match-beginning 0 match-end skip-chars-backward "[0-9]" 40 buffer-size end-of-line re-search-backward "^ 	
" looking-at read compilation-grab-filename equal beginning-of-line 1 point-marker file-exists-p find-file-noselect zerop "Parsing error messages...done" nreverse] 34))

(defun compilation-grab-filename nil "\
Return a string which is a filename, starting at point.
Ignore quotes and parentheses around it, as well as trailing colons." (byte-code "g=`!`\"ebp!)\"`!`\"" [34 narrow-to-region forward-sexp 1 read buffer-substring skip-chars-forward "^ :,
	("] 7))

(define-key ctl-x-map "`" (quote next-error))