From 984ddcbcef9ca63d62eeec38f8609b75723ff122 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 21 Apr 2008 21:01:38 +0000 Subject: [PATCH] (ffap-read-file-or-url): Do not abuse completing-read's `predicate' argument to pass non-predicate data. (ffap-read-url-internal, ffap-read-file-or-url-internal): Use second arg as proper predicate. --- lisp/ChangeLog | 5 +++++ lisp/ffap.el | 45 ++++++++++++++++++++++----------------------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 5bfdcd1a1d..00cddb6f17 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,10 @@ 2008-04-21 Stefan Monnier + * ffap.el (ffap-read-file-or-url): Do not abuse completing-read's + `predicate' argument to pass non-predicate data. + (ffap-read-url-internal, ffap-read-file-or-url-internal): + Use second arg as proper predicate. + * vc-bzr.el (vc-bzr-complete-with-prefix): Remove. (vc-bzr-revision-completion-table): Use completion-table-with-context instead. diff --git a/lisp/ffap.el b/lisp/ffap.el index d1dc36b3e9..eaa7e3a3f1 100644 --- a/lisp/ffap.el +++ b/lisp/ffap.el @@ -922,7 +922,7 @@ If t, `ffap-tex-init' will initialize this when needed.") (ffap-locate-file name t ffap-bib-path)) (defun ffap-dired (name) - (let ((pt (point)) dir try) + (let ((pt (point)) try) (save-excursion (and (progn (beginning-of-line) @@ -1279,15 +1279,17 @@ which may actually result in an url rather than a filename." (push fnh-elem file-name-handler-alist) (unwind-protect (setq guess - (completing-read - prompt - 'ffap-read-file-or-url-internal - dir - nil - (if dir (cons guess (length dir)) guess) - (list 'file-name-history) - (and buffer-file-name - (abbreviate-file-name buffer-file-name)))) + (let ((default-directory (if dir (expand-file-name dir) + default-directory))) + (completing-read + prompt + 'ffap-read-file-or-url-internal + nil + nil + (if dir (cons guess (length dir)) guess) + (list 'file-name-history) + (and buffer-file-name + (abbreviate-file-name buffer-file-name))))) ;; Remove the special handler manually. We used to just let-bind ;; file-name-handler-alist to preserve its value, but that caused ;; other modifications to be lost (e.g. when Tramp gets loaded @@ -1299,26 +1301,24 @@ which may actually result in an url rather than a filename." ;; Note: upcoming url.el package ought to handle this automatically. guess)) -(defun ffap-read-url-internal (string dir action) +(defun ffap-read-url-internal (string pred action) "Complete url's from history, treating given string as valid." (let ((hist (ffap-soft-value "url-global-history-hash-table"))) (cond ((not action) - (or (try-completion string hist) string)) + (or (try-completion string hist pred) string)) ((eq action t) - (or (all-completions string hist) (list string))) + (or (all-completions string hist pred) (list string))) ;; action == lambda, documented where? Tests whether string is a ;; valid "match". Let us always say yes. (t t)))) -(defun ffap-read-file-or-url-internal (string dir action) - (unless dir - (setq dir default-directory)) - (unless string +(defun ffap-read-file-or-url-internal (string pred action) + (unless string ;Why would this ever happen? (setq string default-directory)) (if (ffap-url-p string) - (ffap-read-url-internal string dir action) - (read-file-name-internal string dir action))) + (ffap-read-url-internal string pred action) + (read-file-name-internal string pred action))) ;; The rest of this page is just to work with package complete.el. ;; This code assumes that you load ffap.el after complete.el. @@ -1523,7 +1523,7 @@ Function CONT is applied to the entry chosen by the user." (x-popup-menu t (list "" (cons title - (mapcar (function (lambda (i) (cons (car i) i))) + (mapcar (lambda (i) (cons (car i) i)) alist)))))) ;; minibuffer with completion buffer: (t @@ -1537,8 +1537,7 @@ Function CONT is applied to the entry chosen by the user." nil))) (sit-for 0) ; redraw original screen ;; Convert string to its entry, or else the default: - (setq choice (or (assoc choice alist) (car alist)))) - ) + (setq choice (or (assoc choice alist) (car alist))))) (if choice (funcall cont choice) (message "No choice made!") ; possible with menus @@ -1569,7 +1568,7 @@ Applies `ffap-menu-text-plist' text properties at all matches." ffap-menu-text-plist) (message "Scanning...%2d%% <%s>" (/ (* 100 (- (point) (point-min))) range) item))) - (or mod (set-buffer-modified-p nil)))) + (or mod (restore-buffer-modified-p nil)))) (message "Scanning...done") ;; Remove duplicates. (setq ffap-menu-alist ; sort by item -- 2.39.2