# HG changeset patch # User Stefan Monnier # Date 1153233629 0 # Node ID adaad9cef32621c79f2da1a7c24249ce16709a4f # Parent 8c5ba642d479f28b6e6a849dd81a43e487828251 (compilation-find-file): Handle the cases where the user selects a non-existent file. diff -r 8c5ba642d479 -r adaad9cef326 lisp/ChangeLog --- a/lisp/ChangeLog Tue Jul 18 14:39:57 2006 +0000 +++ b/lisp/ChangeLog Tue Jul 18 14:40:29 2006 +0000 @@ -1,3 +1,12 @@ +2006-07-18 Stefan Monnier + + * progmodes/compile.el (compilation-find-file): Handle the + cases where the user selects a non-existent file. + +2006-07-18 Stefan Monnier + + * bindings.el (minibuffer-local-map): Rebind TAB so it inserts a \t. + 2006-07-17 Chong Yidong * subr.el (sit-for): Just sleep-for if noninteractive. diff -r 8c5ba642d479 -r adaad9cef326 lisp/progmodes/compile.el --- a/lisp/progmodes/compile.el Tue Jul 18 14:39:57 2006 +0000 +++ b/lisp/progmodes/compile.el Tue Jul 18 14:40:29 2006 +0000 @@ -1825,28 +1825,44 @@ (find-file-noselect name)) fmts (cdr fmts))) (setq dirs (cdr dirs))) - (or buffer - ;; The file doesn't exist. Ask the user where to find it. - (save-excursion ;This save-excursion is probably not right. - (let ((pop-up-windows t)) - (compilation-set-window (display-buffer (marker-buffer marker)) - marker) - (let ((name (expand-file-name - (read-file-name - (format "Find this %s in (default %s): " - compilation-error filename) - spec-dir filename t)))) - (if (file-directory-p name) - (setq name (expand-file-name filename name))) - (setq buffer (and (file-exists-p name) - (find-file-noselect name))))))) + (while (null buffer) ;Repeat until the user selects an existing file. + ;; The file doesn't exist. Ask the user where to find it. + (save-excursion ;This save-excursion is probably not right. + (let ((pop-up-windows t)) + (compilation-set-window (display-buffer (marker-buffer marker)) + marker) + (let* ((name (read-file-name + (format "Find this %s in (default %s): " + compilation-error filename) + spec-dir filename t nil + ;; Try to make sure the user can only select + ;; a valid answer. This predicate may be ignored, + ;; tho, so we still have to double-check afterwards. + ;; TODO: We should probably fix read-file-name so + ;; that it never ignores this predicate, even when + ;; using popup dialog boxes. + (lambda (name) + (if (file-directory-p name) + (setq name (expand-file-name filename name))) + (file-exists-p name)))) + (origname name)) + (cond + ((not (file-exists-p name)) + (message "Cannot find file `%s'" name) + (ding) (sit-for 2)) + ((and (file-directory-p name) + (not (file-exists-p + (setq name (expand-file-name filename name))))) + (message "No `%s' in directory %s" filename origname) + (ding) (sit-for 2)) + (t + (setq buffer (find-file-noselect name)))))))) ;; Make intangible overlays tangible. - ;; This is very weird: it's not even clear which is the current buffer, - ;; so the code below can't be expected to DTRT here. --Stef - (mapcar (function (lambda (ov) - (when (overlay-get ov 'intangible) - (overlay-put ov 'intangible nil)))) - (overlays-in (point-min) (point-max))) + ;; This is weird: it's not even clear which is the current buffer, + ;; so the code below can't be expected to DTRT here. -- Stef + (dolist (ov (overlays-in (point-min) (point-max))) + (when (overlay-get ov 'intangible) + (overlay-put ov 'intangible nil))) buffer)) (defun compilation-get-file-structure (file &optional fmt)