aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland McGrath1994-03-07 22:31:48 +0000
committerRoland McGrath1994-03-07 22:31:48 +0000
commiteaa3cac5f42205c9703d9f509c69c107e754dfc2 (patch)
treeed40da0e64c7c558a033a5da792a651fa6d2a78c
parentacdf173af7cb390d26ecdf7b469300025eaacf10 (diff)
downloademacs-eaa3cac5f42205c9703d9f509c69c107e754dfc2.tar.gz
emacs-eaa3cac5f42205c9703d9f509c69c107e754dfc2.zip
(compile-reinitialize-errors): Rename first arg from ARGP to REPARSE.
Test only its nilness. (compile-goto-error): Pass (consp ARGP) to compile-reinitialize-errors instead of ARGP itself. (next-error): Code broken out into two new functions; call them. (compilation-next-error-locus): New function; bulk of code from next-error. Silently skip errors whose source loci are markers in killed buffers. (compilation-goto-locus): New function, final code from next-error.
-rw-r--r--lisp/progmodes/compile.el262
1 files changed, 141 insertions, 121 deletions
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index f72b0b6eb07..44e11bfbb60 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -633,13 +633,14 @@ Does NOT find the source line like \\[next-error]."
633 633
634;; Parse any new errors in the compilation buffer, 634;; Parse any new errors in the compilation buffer,
635;; or reparse from the beginning if the user has asked for that. 635;; or reparse from the beginning if the user has asked for that.
636(defun compile-reinitialize-errors (argp &optional limit-search find-at-least) 636(defun compile-reinitialize-errors (reparse
637 &optional limit-search find-at-least)
637 (save-excursion 638 (save-excursion
638 (set-buffer compilation-last-buffer) 639 (set-buffer compilation-last-buffer)
639 ;; If we are out of errors, or if user says "reparse", 640 ;; If we are out of errors, or if user says "reparse",
640 ;; discard the info we have, to force reparsing. 641 ;; discard the info we have, to force reparsing.
641 (if (or (eq compilation-error-list t) 642 (if (or (eq compilation-error-list t)
642 (consp argp)) 643 reparse)
643 (compilation-forget-errors)) 644 (compilation-forget-errors))
644 (if (and compilation-error-list 645 (if (and compilation-error-list
645 (or (not limit-search) 646 (or (not limit-search)
@@ -686,7 +687,7 @@ other kinds of prefix arguments are ignored."
686 (or (compilation-buffer-p (current-buffer)) 687 (or (compilation-buffer-p (current-buffer))
687 (error "Not in a compilation buffer.")) 688 (error "Not in a compilation buffer."))
688 (setq compilation-last-buffer (current-buffer)) 689 (setq compilation-last-buffer (current-buffer))
689 (compile-reinitialize-errors argp (point)) 690 (compile-reinitialize-errors (consp argp) (point))
690 691
691 ;; Move to bol; the marker for the error on this line will point there. 692 ;; Move to bol; the marker for the error on this line will point there.
692 (beginning-of-line) 693 (beginning-of-line)
@@ -763,29 +764,43 @@ See variables `compilation-parse-errors-function' and
763\`compilation-error-regexp-alist' for customization ideas." 764\`compilation-error-regexp-alist' for customization ideas."
764 (interactive "P") 765 (interactive "P")
765 (setq compilation-last-buffer (compilation-find-buffer)) 766 (setq compilation-last-buffer (compilation-find-buffer))
766 (compile-reinitialize-errors argp nil 767 (compilation-goto-locus (compilation-next-error-locus
767 ;; We want to pass a number here only if 768 ;; We want to pass a number here only if
768 ;; we got a numeric prefix arg, not just C-u. 769 ;; we got a numeric prefix arg, not just C-u.
769 (and (not (consp argp)) 770 (and (not (consp argp))
770 (if (< (prefix-numeric-value argp) 1) 771 (prefix-numeric-value argp))
771 0 772 (consp argp))))
772 (1- (prefix-numeric-value argp))))) 773;;;###autoload (define-key ctl-x-map "`" 'next-error)
773 ;; Make ARGP nil if the prefix arg was just C-u, 774
774 ;; since that means to reparse the errors, which the 775(defun compilation-next-error-locus (&optional move reparse)
775 ;; compile-reinitialize-errors call just did. 776 "Visit next compilation error and return locus in corresponding source code.
776 ;; Now we are only interested in a numeric prefix arg. 777This operates on the output from the \\[compile] command.
777 (if (consp argp) 778If all preparsed error messages have been processed,
778 (setq argp nil)) 779the error message buffer is checked for new ones.
780
781Returns a cons (ERROR . SOURCE) of two markers: ERROR is a marker at the
782location of the error message in the compilation buffer, and SOURCE is a
783marker at the location in the source code indicated by the error message.
784
785Optional first arg MOVE says how many error messages to move forwards (or
786backwards, if negative); default is 1. Optional second arg REPARSE, if
787non-nil, says to reparse the error message buffer and reset to the first
788error (plus MOVE - 1).
789
790The current buffer should be the desired compilation output buffer."
791 (or move (setq move 1))
792 (compile-reinitialize-errors reparse nil (and (not reparse)
793 (if (< move 1) 0 (1- move))))
779 (let (next-errors next-error) 794 (let (next-errors next-error)
780 (save-excursion 795 (save-excursion
781 (set-buffer compilation-last-buffer) 796 (set-buffer compilation-last-buffer)
782 ;; compilation-error-list points to the "current" error. 797 ;; compilation-error-list points to the "current" error.
783 (setq next-errors 798 (setq next-errors
784 (if (> (prefix-numeric-value argp) 0) 799 (if (> move 0)
785 (nthcdr (1- (prefix-numeric-value argp)) 800 (nthcdr (1- move)
786 compilation-error-list) 801 compilation-error-list)
787 ;; Zero or negative arg; we need to move back in the list. 802 ;; Zero or negative arg; we need to move back in the list.
788 (let ((n (1- (prefix-numeric-value argp))) 803 (let ((n (1- move))
789 (i 0) 804 (i 0)
790 (e compilation-old-error-list)) 805 (e compilation-old-error-list))
791 ;; See how many cdrs away the current error is from the start. 806 ;; See how many cdrs away the current error is from the start.
@@ -797,90 +812,90 @@ See variables `compilation-parse-errors-function' and
797 (nthcdr (+ i n) compilation-old-error-list)))) 812 (nthcdr (+ i n) compilation-old-error-list))))
798 next-error (car next-errors)) 813 next-error (car next-errors))
799 (while 814 (while
800 (progn 815 (if (null next-error)
801 (if (null next-error) 816 (progn
802 (progn 817 (if move (if (> move 0)
803 (if argp (if (> (prefix-numeric-value argp) 0) 818 (error "Moved past last error")
804 (error "Moved past last error") 819 (error "Moved back past first error")))
805 (error "Moved back past first error"))) 820 (compilation-forget-errors)
806 (compilation-forget-errors) 821 (error (concat compilation-error-message
807 (error (concat compilation-error-message 822 (and (get-buffer-process (current-buffer))
808 (and (get-buffer-process (current-buffer)) 823 (eq (process-status
809 (eq (process-status 824 (get-buffer-process
810 (get-buffer-process 825 (current-buffer)))
811 (current-buffer))) 826 'run)
812 'run) 827 " yet"))))
813 " yet")))) 828 (setq compilation-error-list (cdr next-errors))
814 (setq compilation-error-list (cdr next-errors)) 829 (if (null (cdr next-error))
815 (if (null (cdr next-error)) 830 ;; This error is boring. Go to the next.
816 ;; This error is boring. Go to the next. 831 t
817 t 832 (or (markerp (cdr next-error))
818 (or (markerp (cdr next-error)) 833 ;; This error has a filename/lineno pair.
819 ;; This error has a filename/lineno pair. 834 ;; Find the file and turn it into a marker.
820 ;; Find the file and turn it into a marker. 835 (let* ((fileinfo (car (cdr next-error)))
821 (let* ((fileinfo (car (cdr next-error))) 836 (buffer (compilation-find-file (cdr fileinfo)
822 (buffer (compilation-find-file (cdr fileinfo) 837 (car fileinfo)
823 (car fileinfo) 838 (car next-error))))
824 (car next-error)))) 839 (if (null buffer)
825 (if (null buffer) 840 ;; We can't find this error's file.
826 ;; We can't find this error's file. 841 ;; Remove all errors in the same file.
827 ;; Remove all errors in the same file. 842 (progn
828 (progn 843 (setq next-errors compilation-old-error-list)
829 (setq next-errors compilation-old-error-list) 844 (while next-errors
830 (while next-errors 845 (and (consp (cdr (car next-errors)))
831 (and (consp (cdr (car next-errors))) 846 (equal (car (cdr (car next-errors)))
832 (equal (car (cdr (car next-errors))) 847 fileinfo)
833 fileinfo) 848 (progn
834 (progn 849 (set-marker (car (car next-errors)) nil)
835 (set-marker (car (car next-errors)) nil) 850 (setcdr (car next-errors) nil)))
836 (setcdr (car next-errors) nil))) 851 (setq next-errors (cdr next-errors)))
837 (setq next-errors (cdr next-errors))) 852 ;; Look for the next error.
838 ;; Look for the next error. 853 t)
839 t) 854 ;; We found the file. Get a marker for this error.
840 ;; We found the file. Get a marker for this error. 855 ;; compilation-old-error-list is a buffer-local
841 ;; compilation-old-error-list is a buffer-local 856 ;; variable, so we must be careful to extract its value
842 ;; variable, so we must be careful to extract its value 857 ;; before switching to the source file buffer.
843 ;; before switching to the source file buffer. 858 (let ((errors compilation-old-error-list)
844 (let ((errors compilation-old-error-list) 859 (last-line (nth 1 (cdr next-error)))
845 (last-line (nth 1 (cdr next-error))) 860 (column (nth 2 (cdr next-error))))
846 (column (nth 2 (cdr next-error)))) 861 (set-buffer buffer)
847 (set-buffer buffer) 862 (save-excursion
848 (save-excursion 863 (save-restriction
849 (save-restriction 864 (widen)
850 (widen) 865 (goto-line last-line)
851 (goto-line last-line) 866 (if column
852 (if column 867 (move-to-column column)
853 (move-to-column column) 868 (beginning-of-line))
854 (beginning-of-line)) 869 (setcdr next-error (point-marker))
855 (setcdr next-error (point-marker)) 870 ;; Make all the other error messages referring
856 ;; Make all the other error messages referring 871 ;; to the same file have markers into the buffer.
857 ;; to the same file have markers into the buffer. 872 (while errors
858 (while errors 873 (and (consp (cdr (car errors)))
859 (and (consp (cdr (car errors))) 874 (equal (car (cdr (car errors))) fileinfo)
860 (equal (car (cdr (car errors))) fileinfo) 875 (let* ((this (nth 1 (cdr (car errors))))
861 (let* ((this (nth 1 (cdr (car errors)))) 876 (column (nth 2 (cdr (car errors))))
862 (column (nth 2 (cdr (car errors)))) 877 (lines (- this last-line)))
863 (lines (- this last-line))) 878 (if (eq selective-display t)
864 (if (eq selective-display t) 879 ;; When selective-display is t,
865 ;; When selective-display is t, 880 ;; each C-m is a line boundary,
866 ;; each C-m is a line boundary, 881 ;; as well as each newline.
867 ;; as well as each newline. 882 (if (< lines 0)
868 (if (< lines 0) 883 (re-search-backward "[\n\C-m]"
869 (re-search-backward "[\n\C-m]" 884 nil 'end
870 nil 'end 885 (- lines))
871 (- lines)) 886 (re-search-forward "[\n\C-m]"
872 (re-search-forward "[\n\C-m]" 887 nil 'end
873 nil 'end 888 lines))
874 lines)) 889 (forward-line lines))
875 (forward-line lines)) 890 (if column
876 (if column 891 (move-to-column column))
877 (move-to-column column)) 892 (setq last-line this)
878 (setq last-line this) 893 (setcdr (car errors) (point-marker))))
879 (setcdr (car errors) (point-marker)))) 894 (setq errors (cdr errors)))))))))
880 (setq errors (cdr errors))))))))) 895 ;; If we didn't get a marker for this error, or this
881 ;; If we didn't get a marker for this error, 896 ;; marker's buffer was killed, go on to the next one.
882 ;; go on to the next one. 897 (or (not (markerp (cdr next-error)))
883 (not (markerp (cdr next-error)))))) 898 (not (marker-buffer (cdr next-error))))))
884 (setq next-errors compilation-error-list 899 (setq next-errors compilation-error-list
885 next-error (car next-errors)))) 900 next-error (car next-errors))))
886 901
@@ -890,24 +905,29 @@ See variables `compilation-parse-errors-function' and
890 (equal (cdr (car compilation-error-list)) (cdr next-error))) 905 (equal (cdr (car compilation-error-list)) (cdr next-error)))
891 (setq compilation-error-list (cdr compilation-error-list))) 906 (setq compilation-error-list (cdr compilation-error-list)))
892 907
893 ;; We now have a marker for the position of the error. 908 ;; We now have a marker for the position of the error source code.
894 (switch-to-buffer (marker-buffer (cdr next-error))) 909 ;; NEXT-ERROR is a cons (ERROR . SOURCE) of two markers.
895 (goto-char (cdr next-error)) 910 next-error))
896 ;; If narrowing got in the way of 911
897 ;; going to the right place, widen. 912(defun compilation-goto-locus (next-error)
898 (or (= (point) (marker-position (cdr next-error))) 913 "Jump to an error locus returned by `compilation-next-error-locus'.
899 (progn 914Takes one argument, a cons (ERROR . SOURCE) of two markers.
900 (widen) 915Selects a window with point at SOURCE, with another window displaying ERROR."
901 (goto-char (cdr next-error)))) 916 (switch-to-buffer (marker-buffer (cdr next-error)))
902 917 (goto-char (cdr next-error))
903 ;; Show compilation buffer in other window, scrolled to this error. 918 ;; If narrowing got in the way of
904 (let* ((pop-up-windows t) 919 ;; going to the right place, widen.
905 (w (display-buffer (marker-buffer (car next-error))))) 920 (or (= (point) (marker-position (cdr next-error)))
906 (set-window-point w (car next-error)) 921 (progn
907 (set-window-start w (car next-error))))) 922 (widen)
908 923 (goto-char (cdr next-error))))
909;;;###autoload (define-key ctl-x-map "`" 'next-error) 924
910 925 ;; Show compilation buffer in other window, scrolled to this error.
926 (let* ((pop-up-windows t)
927 (w (display-buffer (marker-buffer (car next-error)))))
928 (set-window-point w (car next-error))
929 (set-window-start w (car next-error))))
930
911;; Find a buffer for file FILENAME. 931;; Find a buffer for file FILENAME.
912;; Search the directories in compilation-search-path. 932;; Search the directories in compilation-search-path.
913;; A nil in compilation-search-path means to try the 933;; A nil in compilation-search-path means to try the