emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] master 23ffa25 19/31: Bind "TAB" to do partial completion


From: Oleh Krehel
Subject: [elpa] master 23ffa25 19/31: Bind "TAB" to do partial completion
Date: Fri, 01 May 2015 14:28:57 +0000

branch: master
commit 23ffa25afc562acb8e26847802bacb4916104e07
Author: Oleh Krehel <address@hidden>
Commit: Oleh Krehel <address@hidden>

    Bind "TAB" to do partial completion
    
    * ivy.el (ivy-minibuffer-map): Update.
    (ivy-alt-done): New defun.
    (ivy--old-text): Update.
    
    Re #63.
---
 ivy.el |   23 ++++++++++++++++++++++-
 1 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/ivy.el b/ivy.el
index c686157..1b5c9b5 100644
--- a/ivy.el
+++ b/ivy.el
@@ -94,6 +94,7 @@ Only \"./\" and \"../\" apply here. They appear in reverse 
order."
   (let ((map (make-sparse-keymap)))
     (define-key map (kbd "C-m") 'ivy-done)
     (define-key map (kbd "C-j") 'ivy-alt-done)
+    (define-key map (kbd "TAB") 'ivy-partial-or-done)
     (define-key map (kbd "C-n") 'ivy-next-line)
     (define-key map (kbd "C-p") 'ivy-previous-line)
     (define-key map (kbd "<down>") 'ivy-next-line)
@@ -242,6 +243,26 @@ When ARG is t, exit with current text, ignoring the 
candidates."
             (ivy--exhibit))
         (ivy-done)))))
 
+(defun ivy-partial-or-done ()
+  "Complete the minibuffer text as much as possible.
+When called twice in a row, exit the minibuffer with the current
+candidate."
+  (interactive)
+  (if (eq this-command last-command)
+      (progn
+        (delete-minibuffer-contents)
+        (insert ivy--current)
+        (setq ivy-exit 'done)
+        (exit-minibuffer))
+    (let* ((parts (split-string ivy-text " " t))
+           (postfix (car (last parts)))
+           (new (try-completion postfix
+                                (mapcar (lambda (str) (substring str 
(string-match postfix str)))
+                                        ivy--old-cands))))
+      (delete-region (minibuffer-prompt-end) (point-max))
+      (setcar (last parts) new)
+      (insert (mapconcat #'identity parts " ") " "))))
+
 (defun ivy-immediate-done ()
   "Exit the minibuffer with the current input."
   (interactive)
@@ -723,7 +744,7 @@ Everything after \"!\" should not match."
 (defun ivy--insert-prompt ()
   "Update the prompt according to `ivy--prompt'."
   (when ivy--prompt
-    (unless (memq this-command '(ivy-done ivy-alt-done))
+    (unless (memq this-command '(ivy-done ivy-alt-done ivy-partial-or-done))
       (setq ivy--prompt-extra ""))
     (let (head tail)
       (if (string-match "\\(.*\\): $" ivy--prompt)



reply via email to

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