Subject: [PATCH] Improved ffap-completable

From: E Sabof <[email-masked]>
Date: Wed, 05 Feb 2014 07:14:28 +0000

Assuming that point is at the word "The", and the complete filename follows. The current version will work when the default-directory contains one file "The first file.txt". But it won't if there is another file "The second file.txt", since file-name-completion will only give a partial completion.

Evgeni

diff --git a/lisp/ffap.el b/lisp/ffap.el
index bb0f61d..4655639 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -819,8 +819,28 @@ URL, or nil.  If nil, search the alist for further matches.")

 (defun ffap-completable (name)
   (let* ((dir (or (file-name-directory name) default-directory))
-	 (cmp (file-name-completion (file-name-nondirectory name) dir)))
-    (and cmp (concat dir cmp))))
+         (completions (file-name-all-completions
+                       (file-name-nondirectory name) dir))
+         (looking-at-candidate
+          (lambda (candidate)
+            (string-equal (buffer-substring
+                           (point)
+                           (min (+ (point) (length candidate))
+                                (point-max)))
+                          candidate)))
+         start)
+    (when (and completions (cdr completions))
+      (setq completions
+            (or (cl-remove-if-not looking-at-candidate
+                                  completions)
+                (and (setq start (car (bounds-of-thing-at-point 'symbol)))
+                     (/= start (point))
+                     (save-excursion
+                       (goto-char start)
+                       (cl-remove-if-not looking-at-candidate
+                                         completions))))))
+    (when completions
+      (concat dir (car completions)))))

 (defun ffap-home (name) (ffap-locate-file name t '("~")))