summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJSDurand <mmemmew@gmail.com>2023-01-09 15:44:19 +0800
committerJSDurand <mmemmew@gmail.com>2023-01-09 15:44:19 +0800
commit53d5d8fd235b99d20a9fade158483f4603fefc2b (patch)
treed57ef64d3711090ea40da5c3d31c3551a92155d3
parent9329125383e2329ac75432a62f5a81d50db4d78b (diff)
completion: add functions to jump between minibuffer and completions
* common.el (durand-completion-goto-minibuffer): Go to the *Completions* buffer or the minibuffer, depending on whether we are *in the minibuffer or the *Completions* buffer and the target buffer *exists. * completion-conf.el (minibuffer-local-completion-map) (completion-list-mode-map): Bind the function in the right map.
-rw-r--r--common.el34
-rw-r--r--completion-conf.el2
2 files changed, 36 insertions, 0 deletions
diff --git a/common.el b/common.el
index 7da6129..aa90a88 100644
--- a/common.el
+++ b/common.el
@@ -156,6 +156,40 @@ ARG means do this command ARG times."
((< arg 0)
(goto-char (point-max))))))))
+(defun durand-completion-goto-minibuffer ()
+ "Go to the minibuffer."
+ (interactive)
+ (let ((active-minibuffer-window (active-minibuffer-window))
+ (completion-windows
+ (delq nil
+ (mapcar
+ (lambda (w)
+ (and (consp
+ (delq nil
+ (mapcar
+ (lambda (name)
+ (string-match-p
+ name
+ (buffer-name (window-buffer w))))
+ durand-completion-buffer-names)))
+ w))
+ (window-list nil 'nomini))))
+ (in-completion-p (consp
+ (delq nil
+ (mapcar
+ (lambda (name)
+ (string-equal name (buffer-name)))
+ durand-completion-buffer-names))))
+ (in-minibuffer-p
+ (minibuffer-window-active-p (selected-window))))
+ (cond
+ ((and active-minibuffer-window
+ (not in-minibuffer-p))
+ (select-window active-minibuffer-window))
+ ((and (consp completion-windows)
+ (not in-completion-p))
+ (select-window (car completion-windows))))))
+
;; This can be optimized by not duplicating an element on the stack.
;;;###autoload
diff --git a/completion-conf.el b/completion-conf.el
index b47520d..7885943 100644
--- a/completion-conf.el
+++ b/completion-conf.el
@@ -51,11 +51,13 @@
(define-key minibuffer-local-completion-map (vector ?\C-p) #'durand-embark-scroll-up-or-go-to-completions)
(define-key minibuffer-local-completion-map (vector ?\s-v) #'durand-completion-toggle-display)
(define-key minibuffer-local-completion-map (vector 32) nil)
+(define-key minibuffer-local-completion-map (vector ?\M-o) #'durand-completion-goto-minibuffer)
(define-key minibuffer-local-must-match-map (vector 32) nil)
(define-key completion-list-mode-map (vector 'down) #'durand-completion-scroll-down-or-go-to-minibuffer)
(define-key completion-list-mode-map (vector 'up) #'durand-completion-scroll-up-or-go-to-minibuffer)
(define-key completion-list-mode-map (vector ?\C-n) #'durand-completion-scroll-down-or-go-to-minibuffer)
(define-key completion-list-mode-map (vector ?\C-p) #'durand-completion-scroll-up-or-go-to-minibuffer)
+(define-key completion-list-mode-map (vector ?\M-o) #'durand-completion-goto-minibuffer)
;;; New behaviours of emacs 29 make the default completion list more useful now