lupton@uhccux.uhcc.hawaii.edu (Robert Lupton) (02/02/90)
When you have source scattered down a directory hierarchy next-error
will only find the errors in the directory that you ran compile in.
Here is a patch to compile.el that provides a search path.
The only new function is compilation-make-dir-list which prompts you for
the path to use (the variable compilation-dir-list with default value
"."). If you don't specify a path (i.e. just hit <CR>) it'll create a
path consisting of all the subdirectories (and sub-subdirectories and so
on) of your current directory.
Robert
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
*** /usr/local/emacs.18.51/emacs/lisp/compile.el Sun Dec 6 01:27:59 1987
--- compile.el Fri Dec 15 11:46:07 1989
***************
*** 17,22
;; can know your rights and responsibilities. It should be in a
;; file named COPYING. Among other things, the copyright notice
;; and this notice must be preserved on all copies.
(provide 'compile)
--- 17,25 -----
;; can know your rights and responsibilities. It should be in a
;; file named COPYING. Among other things, the copyright notice
;; and this notice must be preserved on all copies.
+ ;;
+ ;; Added support for files spread over several directories
+ ;; December 1989, Robert Lupton (lupton@uhifa.ifa.hawaii.edu)
(provide 'compile)
***************
*** 45,50
"\\([^ \n]+\\(: *\\|, line \\|(\\)[0-9]+\\)\\|\\([0-9]+ *of *[^ \n]+\\)"
"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
--- 48,56 -----
"\\([^ \n]+\\(: *\\|, line \\|(\\)[0-9]+\\)\\|\\([0-9]+ *of *[^ \n]+\\)"
"Regular expression for filename/linenumber in error in compilation log.")
+ (defvar compilation-dir-list (list ".")
+ "list of directories to search for files with errors")
+
(defun compile (command)
"Compile the program including the current buffer. Default: run make.
Runs COMMAND, a shell command, in a separate process asynchronously
***************
*** 167,173
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")
(if (or (eq compilation-error-list t)
argp)
--- 173,182 -----
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.
! The variable compilation-dir-list gives a list of directories to
! search for files; by default it only includes the current directory. The
! list may be set using compilation-make-dir-list"
(interactive "P")
(if (or (eq compilation-error-list t)
argp)
***************
*** 270,277
;; text-buffer gets the buffer containing this error's file.
(if (not (equal filename last-filename))
(setq text-buffer
! (and (file-exists-p (setq last-filename filename))
! (find-file-noselect filename))
last-linenum 0))
(if text-buffer
;; Go to that buffer and find the erring line.
--- 279,297 -----
;; text-buffer gets the buffer containing this error's file.
(if (not (equal filename last-filename))
(setq text-buffer
! ;; Look for the file in compilation-dir-list directories
! (let ((dir compilation-dir-list) dir-filename)
! (and
! (progn
! (while (and dir
! (not (file-exists-p
! (setq dir-filename
! (concat (car dir) "/" filename)))))
! (setq dir (cdr dir)))
! dir-filename)
! (setq last-filename filename)
! (and (file-exists-p dir-filename)
! (find-file-noselect dir-filename))))
last-linenum 0))
(if text-buffer
;; Go to that buffer and find the erring line.
***************
*** 305,309
(progn
(skip-chars-forward "^ :,\n\t(")
(point)))))
(define-key ctl-x-map "`" 'next-error)
--- 325,372 -----
(progn
(skip-chars-forward "^ :,\n\t(")
(point)))))
+
+ (defun compilation-make-dir-list (str)
+
+ "Make a list of directories for next-error to search (. is added
+ automatically if you omit it). If you specify an empty string, all the
+ subdirectories of the current directory will be used."
+
+ (interactive "sDirectories: ")
+ (setq compilation-dir-list
+ (if (string= str "")
+ (append (list ".") (sub-dirs "."))
+ (string-to-list
+ (if (not (string-match "\\(^\\|[ \t]\\)\\.[ \t]" str))
+ (setq str (concat ". " str)))))))
+
+ (defun string-to-list (str)
+ "Take a string of white-space separated words, and return them as a list"
+ (let ( str-list (start 0) end)
+ (while
+ (progn
+ (setq str-list
+ (append str-list
+ (list (substring str start
+ (setq end (string-match "[ \t\n]" str start))))))
+ (setq start (and end (+ end 1)))))
+ str-list))
+
+ (defun sub-dirs (dir)
+ "Return a list of all subdirectories of DIR"
+ (interactive "DInitial directory? ")
+ (setq dir (concat (expand-file-name dir) "/"))
+ (let ( (dir-list)
+ (file-list (directory-files dir))
+ (file) )
+ (while (setq file (car file-list))
+ (if (and (not (or (string= file ".") (string= file "..")))
+ (file-directory-p (concat dir file)))
+ (let* ( (dir-name (concat dir file))
+ (subs (sub-dirs dir-name)) )
+ (setq dir-list (append dir-list
+ (if subs subs (list dir-name))))))
+ (setq file-list (cdr file-list)))
+ dir-list))
(define-key ctl-x-map "`" 'next-error)lupton@uhccux.uhcc.hawaii.edu (Robert Lupton) (02/10/90)
Hmm, there's a small bug in my extended compile.el. The code to
automatically use all subdirectories was only finding leaf directories,
here's a patch (i.e. apply my other stuff first, then this patch)
Robert
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
*** compile.el.1 Fri Dec 15 11:46:07 1989
--- compile.el Fri Feb 9 08:04:39 1990
***************
*** 364,371
(file-directory-p (concat dir file)))
(let* ( (dir-name (concat dir file))
(subs (sub-dirs dir-name)) )
! (setq dir-list (append dir-list
! (if subs subs (list dir-name))))))
(setq file-list (cdr file-list)))
dir-list))
--- 364,371 -----
(file-directory-p (concat dir file)))
(let* ( (dir-name (concat dir file))
(subs (sub-dirs dir-name)) )
! (setq dir-list (append dir-list (list dir-name)))
! (if subs (setq dir-list (append dir-list subs)))))
(setq file-list (cdr file-list)))
dir-list))