diff --git a/lisp/comint.el b/lisp/comint.el index 6423e695430..9b8ea6869c2 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -543,6 +543,7 @@ comint-mode-map (define-key map "\er" 'comint-history-isearch-backward-regexp) (define-key map [?\C-c ?\M-r] 'comint-previous-matching-input-from-input) (define-key map [?\C-c ?\M-s] 'comint-next-matching-input-from-input) + (define-key map [?\C-x up] 'comint-complete-input-ring) (define-key map "\e\C-l" 'comint-show-output) (define-key map "\C-m" 'comint-send-input) (define-key map "\C-d" 'comint-delchar-or-maybe-eof) @@ -1180,6 +1181,26 @@ comint-dynamic-list-input-ring (set-window-configuration conf) (push ch unread-command-events)))))) +(defun comint-complete-input-ring () + "Complete a list of recent inputs entered into the current buffer. +Like `minibuffer-complete-defaults' but completes on comint inputs. +This function makes `comint-dynamic-list-input-ring' obsolete." + (interactive) + (let ((completions + (if (and (ring-p comint-input-ring) + (not (ring-empty-p comint-input-ring))) + (ring-elements comint-input-ring) + (user-error "No history available"))) + (completion-in-region-mode-predicate + (lambda () (get-buffer-window "*Completions*" 0)))) + (completion-in-region + (comint-line-beginning-position) (point-max) + (lambda (string pred action) + (if (eq action 'metadata) + '(metadata (category . comint-input) + (display-sort-function . identity) + (cycle-sort-function . identity)) + (complete-with-action action completions string pred)))))) (defun comint-regexp-arg (prompt) "Return list of regexp and prefix arg using PROMPT."