changeset 72001:adaad9cef326

(compilation-find-file): Handle the cases where the user selects a non-existent file.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 18 Jul 2006 14:40:29 +0000
parents 8c5ba642d479
children 2f62cd511de0
files lisp/ChangeLog lisp/progmodes/compile.el
diffstat 2 files changed, 46 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- 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  <monnier@iro.umontreal.ca>
+
+	* progmodes/compile.el (compilation-find-file): Handle the
+	cases where the user selects a non-existent file.
+
+2006-07-18  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* bindings.el (minibuffer-local-map): Rebind TAB so it inserts a \t.
+
 2006-07-17  Chong Yidong  <cyd@stupidchicken.com>
 
 	* subr.el (sit-for): Just sleep-for if noninteractive.
--- 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)