branch: elpa/vcomplete commit 12def7b143950332d10bd324b4b4320736799b84 Author: Daniel Semyonov <cm...@dsemy.com> Commit: Daniel Semyonov <cm...@dsemy.com>
Highlight the completion at point in the completion list buffer This is different from previous behavior since the completion at point is highlighted even when navigated to manually. Note that this doesn't work when completing in-region, although this doesn't really matter since switching buffers exits 'completion-in-region-mode'. * vcomplete.el (vcomplete-next-completion, vcomplete-prev-completion): Don't set 'this-command' to 'vcomplete--no-update'. (vcomplete--last-string): New variable to hold the last pending completion string. (vcomplete--last-string-in-minibuffer): New function which sets 'vcomplete--last-string' (when completing in a minibuffer). (vcomplete--last-string-in-region): New function which sets 'vcomplete--last-string' (when completing in-region). (vcomplete--update-in-minibuffer, vcomplete--update-in-region): Modify to update when the current completion string is different to 'vcomplete--last-string'. (vcomplete--reset-vars): Add steps to reset 'vcomplete--last-string' and remove 'vcomplete--highlight-completion-at-point' from the local 'post-command-hook'. (vcomplete--setup-completions): New function which sets up the completion list buffer for highlighting at point. (vcomplete--setup-current): Rename from 'vcomplete--setup'. Restructure and add steps to add the "last-string" functions added to the local 'pre-command-hook'. (vcomplete-mode): Rename references to 'vcomplete--setup' and add steps to add/remove 'vcomplete--setup-completions' to 'completions-list-mode-hook'. --- README | 7 ++--- vcomplete.el | 91 ++++++++++++++++++++++++++++++++++++++++------------------ vcomplete.texi | 20 ++++++++----- 3 files changed, 79 insertions(+), 39 deletions(-) diff --git a/README b/README index bbd37d51dd..a243f997a7 100644 --- a/README +++ b/README @@ -1,8 +1,7 @@ Vcomplete - Visual completions Vcomplete provides a minor mode enhancing the default completion -list buffer, providing visual aids for selecting completions and -performing other actions. +list buffer, providing visual aids for selecting completions. Installation: @@ -44,8 +43,8 @@ When vcomplete-mode is active: - The completion list buffer can be controlled through the minibuffer (during minibuffer completion) or the current buffer (during in-buffer completion), if it's visible. -- The current completion is highlighted in the completion list - buffer. +- The currently selected completion is highlighted in the completion + list buffer. C-n moves point to the next completion. diff --git a/vcomplete.el b/vcomplete.el index 9078c5d55d..f61903139f 100644 --- a/vcomplete.el +++ b/vcomplete.el @@ -27,8 +27,7 @@ ;;; Commentary: ;; Vcomplete provides a minor mode enhancing the default completion -;; list buffer, providing visual aids for selecting completions and -;; performing other actions. +;; list buffer, providing visual aids for selecting completions. ;; ;; Usage: ;; @@ -48,8 +47,8 @@ ;; - The completion list buffer can be controlled through the ;; minibuffer (during minibuffer completion) or the current buffer ;; (during in-buffer completion), if it's visible. -;; - The current completion is highlighted in the completion list -;; buffer. +;; - The currently selected completion is highlighted in the +;; completion list buffer. ;; ;; C-n moves point to the next completion. ;; @@ -155,15 +154,13 @@ If no completion is found, return nil." "Move to the next item in the ‘*Completions*’ buffer. With prefix argument N, move N items (negative N means move backward)." (interactive "p") - (vcomplete--move-n-completions (or n 1)) - (setq this-command 'vcomplete--no-update)) + (vcomplete--move-n-completions (or n 1))) (defun vcomplete-prev-completion (&optional n) "Move to the previous item in the ‘*Completions*’ buffer. With prefix argument N, move N items (negative N means move forward)." (interactive "p") - (vcomplete--move-n-completions (- (or n 1))) - (setq this-command 'vcomplete--no-update)) + (vcomplete--move-n-completions (- (or n 1)))) (defun vcomplete-choose-completion () "Choose the completion at point in the ‘*Completions*’ buffer." @@ -182,45 +179,81 @@ With prefix argument N, move N items (negative N means move forward)." ;;;; Visual completion mode: +(defvar vcomplete--last-string nil + "Last pending completion string.") + +(defun vcomplete--last-string-in-minibuffer-1 () + "Return the minibuffer substring after the prompt." + (buffer-substring-no-properties (minibuffer-prompt-end) + (point-max))) + +(defun vcomplete--last-string-in-minibuffer () + "Set ‘vcomplete--last-string’ in a minibuffer." + (setq vcomplete--last-string (vcomplete--last-string-in-minibuffer-1))) + +(defun vcomplete--last-string-in-region-1 () + "Return a substring according to the markers in ‘completion-in-region--data’." + (when completion-in-region--data + (buffer-substring-no-properties + (car completion-in-region--data) + (cadr completion-in-region--data)))) + +(defun vcomplete--last-string-in-region () + "Set ‘vcomplete--last-string’ in-region." + (setq vcomplete--last-string + (vcomplete--last-string-in-region-1))) + (defun vcomplete--update-in-minibuffer () "Update the completion list when completing in a minibuffer." (while-no-input (redisplay) - (unless (eq this-command 'vcomplete--no-update) + (unless (string= (vcomplete--last-string-in-minibuffer-1) + vcomplete--last-string) (minibuffer-completion-help)))) (defun vcomplete--update-in-region () "Update the completion list when completing in-region." (while-no-input (redisplay) - (unless (or (eq this-command 'vcomplete--no-update) - (eq this-command 'completion-at-point) - (null completion-in-region-mode)) + (unless (string= (vcomplete--last-string-in-region-1) + vcomplete--last-string) (completion-help-at-point)))) (defun vcomplete--reset-vars () "Reset variables used by Vcomplete to their default values." - (setq vcomplete--last-completion-overlay nil) + (setq vcomplete--last-completion-overlay nil + vcomplete--last-string nil) + (remove-hook 'pre-command-hook #'vcomplete--last-string-in-minibuffer t) + (remove-hook 'pre-command-hook #'vcomplete--last-string-in-region t) (remove-hook 'post-command-hook #'vcomplete--update-in-region t) - (remove-hook 'post-command-hook #'vcomplete--update-in-minibuffer t)) + (remove-hook 'post-command-hook #'vcomplete--update-in-minibuffer t) + (remove-hook 'post-command-hook #'vcomplete--highlight-completion-at-point t)) + +(defun vcomplete--setup-completions () + "Setup ‘vcomplete-mode’ for the ‘*Completions*’ buffer." + (add-hook 'post-command-hook + #'vcomplete--highlight-completion-at-point nil t)) -(defun vcomplete--setup () - "Setup ‘vcomplete-mode’." +(defun vcomplete--setup-current () + "Setup ‘vcomplete-mode’ for the current buffer." + (vcomplete--reset-vars) (if (minibufferp) (progn (when (and vcomplete-auto-update minibuffer-completion-table) + (add-hook 'pre-command-hook + #'vcomplete--last-string-in-minibuffer nil t) (add-hook 'post-command-hook #'vcomplete--update-in-minibuffer nil t)) (use-local-map (make-composed-keymap vcomplete-command-map (current-local-map)))) - (if completion-in-region-mode - (when-let ((map (assq #'completion-in-region-mode - minor-mode-overriding-map-alist))) - (when vcomplete-auto-update - (add-hook 'post-command-hook - #'vcomplete--update-in-region nil t)) - (setcdr map vcomplete-command-map)) - (vcomplete--reset-vars)))) + (when-let ((map (assq #'completion-in-region-mode + minor-mode-overriding-map-alist))) + (when vcomplete-auto-update + (add-hook 'pre-command-hook + #'vcomplete--last-string-in-region nil t) + (add-hook 'post-command-hook + #'vcomplete--update-in-region nil t)) + (setcdr map vcomplete-command-map)))) ;;;###autoload (define-minor-mode vcomplete-mode @@ -235,13 +268,15 @@ completion: (if vcomplete-mode (progn (vcomplete--reset-vars) - (add-hook 'minibuffer-setup-hook #'vcomplete--setup) + (add-hook 'completion-list-mode-hook #'vcomplete--setup-completions) + (add-hook 'minibuffer-setup-hook #'vcomplete--setup-current) (add-hook 'minibuffer-exit-hook #'vcomplete--reset-vars) - (add-hook 'completion-in-region-mode-hook #'vcomplete--setup)) + (add-hook 'completion-in-region-mode-hook #'vcomplete--setup-current)) (vcomplete--reset-vars) - (remove-hook 'minibuffer-setup-hook #'vcomplete--setup) + (remove-hook 'completion-list-mode-hook #'vcomplete--setup-completions) + (remove-hook 'minibuffer-setup-hook #'vcomplete--setup-current) (remove-hook 'minibuffer-exit-hook #'vcomplete--reset-vars) - (remove-hook 'completion-in-region-mode-hook #'vcomplete--setup))) + (remove-hook 'completion-in-region-mode-hook #'vcomplete--setup-current))) (provide 'vcomplete) diff --git a/vcomplete.texi b/vcomplete.texi index fe3d8eb6be..d8078b7dcc 100644 --- a/vcomplete.texi +++ b/vcomplete.texi @@ -42,8 +42,7 @@ General Public License for more details. @top Vcomplete User Manual Vcomplete provides a minor mode enhancing the default completion list -buffer, providing visual aids for selecting completions and performing -other actions. +buffer, providing visual aids for selecting completions. @noindent This manual is for Vcomplete version 0.1. @@ -80,10 +79,10 @@ Customization @chapter Introduction Vcomplete provides a minor mode enhancing the default completion list -buffer, providing visual aids for selecting completions and performing -other actions. It's designed to build upon the default completion -system, instead of replacing it. As such, it works both when -completing in a minibuffer and in normal buffers. +buffer, providing visual aids for selecting completions. It's designed +to build upon the default completion system, instead of replacing +it. As such, it works both when completing in a minibuffer and in +normal buffers. @node Installation @chapter Installation @@ -136,7 +135,14 @@ be enabled: You can also add @code{(vcomplete-mode)} to your init file, instead. @end table -The following commands assume completion is in progress. +When @code{vcomplete-mode} is enabled, the @code{*Completions*} buffer +appears and updates automatically (by default), and the completion at +point is highlighted. Note that the completion at point isn't +highlighted when completing in-region, however switching to the +@code{*Completions*} buffer stops completion in this case (this is +default Emacs behavior). + +The following commands are available when completion is in progress: @kindex C-n @cindex vcomplete-next-completion