emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 730e7da 3/3: New icomplete-tidy-shadowed-file-names variable


From: João Távora
Subject: master 730e7da 3/3: New icomplete-tidy-shadowed-file-names variable
Date: Fri, 1 Nov 2019 22:39:35 -0400 (EDT)

branch: master
commit 730e7da7ba6a4b545176ea246653928edb10cff4
Author: João Távora <address@hidden>
Commit: João Távora <address@hidden>

    New icomplete-tidy-shadowed-file-names variable
    
    * lisp/icomplete.el (rfn-eshadow): Require it.
    (icomplete-tidy-shadowed-file-names): New variable.
    (icomplete-exhibit): Use icomplete-tidy-shadowed-file-names.
---
 lisp/icomplete.el | 105 ++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 66 insertions(+), 39 deletions(-)

diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index 47e47f8..8357fd9 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -49,6 +49,8 @@
 
 ;;; Code:
 
+(require 'rfn-eshadow) ; rfn-eshadow-overlay
+
 (defgroup icomplete nil
   "Show completions dynamically in minibuffer."
   :prefix "icomplete-"
@@ -66,6 +68,12 @@ When nil, show candidates in full."
   :type 'boolean
   :version "24.4")
 
+(defvar icomplete-tidy-shadowed-file-names nil
+  "If non-nil, delete superflous parts of input file names.
+For example, if the user types ~/ after a long path name,
+everything preceding the ~/ is discarded so the interactive
+selection process starts again from the user's $HOME.")
+
 (defcustom icomplete-show-matches-on-no-input nil
   "When non-nil, show completions when first prompting for input."
   :type 'boolean
@@ -226,7 +234,11 @@ Last entry becomes the first and can be selected with
 ;;;   (define-key imap (kbd "C-d") 'icomplete-magic-ido-delete-char)
 ;;;   (define-key imap (kbd "RET") 'icomplete-magic-ido-ret)
 ;;;   (define-key imap (kbd "DEL") 'icomplete-magic-ido-backward-updir))
-
+;;;
+;;; For more ido behaviour, you'll probably like this too:
+;;;
+;;;   (setq icomplete-tidy-shadowed-file-names t)
+;;;
 (defun icomplete-magic-ido-kill ()
   "Kill line or current completion, like `ido-mode'.
 If killing to the end of line make sense, call `kill-line',
@@ -422,44 +434,59 @@ See `icomplete-mode' and `minibuffer-setup-hook'."
     (save-excursion
       (goto-char (point-max))
                                         ; Insert the match-status information:
-      (if (and (or icomplete-show-matches-on-no-input
-                   (> (icomplete--field-end) (icomplete--field-beg)))
-               (or
-                ;; Don't bother with delay after certain number of chars:
-                (> (- (point) (icomplete--field-beg))
-                   icomplete-max-delay-chars)
-                ;; Don't delay if the completions are known.
-                completion-all-sorted-completions
-                ;; Don't delay if alternatives number is small enough:
-                (and (sequencep (icomplete--completion-table))
-                     (< (length (icomplete--completion-table))
-                        icomplete-delay-completions-threshold))
-                ;; Delay - give some grace time for next keystroke, before
-               ;; embarking on computing completions:
-               (sit-for icomplete-compute-delay)))
-         (let* ((field-string (icomplete--field-string))
-                 ;; Not sure why, but such requests seem to come
-                 ;; every once in a while.  It's not fully
-                 ;; deterministic but `C-x C-f M-DEL M-DEL ...'
-                 ;; seems to trigger it fairly often!
-                 (while-no-input-ignore-events '(selection-request))
-                 (text (while-no-input
-                         (icomplete-completions
-                          field-string
-                          (icomplete--completion-table)
-                          (icomplete--completion-predicate)
-                          (if (window-minibuffer-p)
-                              (not minibuffer-completion-confirm)))))
-                 (buffer-undo-list t)
-                 deactivate-mark)
-           ;; Do nothing if while-no-input was aborted.
-            (when (stringp text)
-              (move-overlay icomplete-overlay (point) (point) (current-buffer))
-              ;; The current C cursor code doesn't know to use the overlay's
-              ;; marker's stickiness to figure out whether to place the cursor
-              ;; before or after the string, so let's spoon-feed it the pos.
-              (put-text-property 0 1 'cursor t text)
-              (overlay-put icomplete-overlay 'after-string text)))))))
+      (when (and (or icomplete-show-matches-on-no-input
+                     (> (icomplete--field-end) (icomplete--field-beg)))
+                 (or
+                  ;; Don't bother with delay after certain number of chars:
+                  (> (- (point) (icomplete--field-beg))
+                     icomplete-max-delay-chars)
+                  ;; Don't delay if the completions are known.
+                  completion-all-sorted-completions
+                  ;; Don't delay if alternatives number is small enough:
+             ;; Not sure why, but such requests seem to come
+               ;; every once in a while.  It's not fully
+               ;; deterministic but `C-x C-f M-DEL M-DEL ...'
+               ;; seems to trigger it fairly often!
+               (while-no-input-ignore-events '(selection-request))     (and 
(sequencep (icomplete--completion-table))
+                       (< (length (icomplete--completion-table))
+                          icomplete-delay-completions-threshold))
+                  ;; Delay - give some grace time for next keystroke, before
+                 ;; embarking on computing completions:
+                 (sit-for icomplete-compute-delay)))
+        (when (and
+               icomplete-tidy-shadowed-file-names
+               (eq (alist-get 'category
+                              (cdr (completion--field-metadata
+                                    (icomplete--field-beg))))
+                   'file)
+               rfn-eshadow-overlay (overlay-buffer rfn-eshadow-overlay)
+               (or (>= (- (point) (overlay-end rfn-eshadow-overlay)) 2)
+                   (eq ?/ (char-before (- (point) 2)))))
+          (delete-region (overlay-start rfn-eshadow-overlay)
+                         (overlay-end rfn-eshadow-overlay)) )
+       (let* ((field-string (icomplete--field-string))
+               ;; Not sure why, but such requests seem to come
+               ;; every once in a while.  It's not fully
+               ;; deterministic but `C-x C-f M-DEL M-DEL ...'
+               ;; seems to trigger it fairly often!
+               (while-no-input-ignore-events '(selection-request))
+               (text (while-no-input
+                       (icomplete-completions
+                        field-string
+                        (icomplete--completion-table)
+                        (icomplete--completion-predicate)
+                        (if (window-minibuffer-p)
+                            (not minibuffer-completion-confirm)))))
+               (buffer-undo-list t)
+               deactivate-mark)
+         ;; Do nothing if while-no-input was aborted.
+          (when (stringp text)
+            (move-overlay icomplete-overlay (point) (point) (current-buffer))
+            ;; The current C cursor code doesn't know to use the overlay's
+            ;; marker's stickiness to figure out whether to place the cursor
+            ;; before or after the string, so let's spoon-feed it the pos.
+            (put-text-property 0 1 'cursor t text)
+            (overlay-put icomplete-overlay 'after-string text)))))))
 
 ;;;_ > icomplete-completions (name candidates predicate require-match)
 (defun icomplete-completions (name candidates predicate require-match)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]