From 047c1b19353ff58d8cd45935c7b44c911b70e312 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 19 Mar 2019 23:41:20 -0400 Subject: [PATCH] * lisp/eshell/em-cmpl.el: Use completion-at-point i.s.o pcomplete (eshell-cmpl-initialize): Refrain from binding to the `tab` key, which prevents the tab -> TAB remapping. Use completion-at-point and completion-help-at-point. (eshell-complete-commands-list): Use `fboundp` test instead of ugly gymnastics to try and hide the function call from the compiler. (eshell-pcomplete): Make it an alias of completion-at-point. * doc/misc/eshell.texi (Completion): Change wording to reflect different default behavior. --- doc/misc/eshell.texi | 17 ++++++++--------- etc/NEWS | 5 +++++ lisp/eshell/em-cmpl.el | 38 ++++++++++++++------------------------ 3 files changed, 27 insertions(+), 33 deletions(-) diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi index ce3a30c3a9e..716b4b7a50d 100644 --- a/doc/misc/eshell.texi +++ b/doc/misc/eshell.texi @@ -499,15 +499,14 @@ be directories @emph{and} files. Eshell provides predefined completions for the built-in functions and some common external commands, and you can define your own for any command. -Eshell completion also works for lisp forms and glob patterns. If the -point is on a lisp form, then @key{TAB} will behave similarly to completion -in @code{elisp-mode} and @code{lisp-interaction-mode}. For glob -patterns, If there are few enough possible completions of the patterns, -they will be cycled when @key{TAB} is pressed, otherwise it will be removed -from the input line and the possible completions will be listed. - -If you want to see the entire list of possible completions when it's -below the cycling threshold, press @kbd{M-?}. +Eshell completion also works for lisp forms and glob patterns. If the point is +on a lisp form, then @key{TAB} will behave similarly to completion in +@code{elisp-mode} and @code{lisp-interaction-mode}. For glob patterns, the +pattern will be removed from the input line, and replaced by the +completion. + +If you want to see the entire list of possible completions (e.g. when it's +below the @code{completion-cycle-threshold}), press @kbd{M-?}. @subsection pcomplete Pcomplete, short for programmable completion, is the completion diff --git a/etc/NEWS b/etc/NEWS index f955308ebe5..6b132eb41d7 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -985,6 +985,11 @@ default, and not just the opening element. ** Eshell +*** TAB completion uses the standard completion-at-point rather than pcomplete +Its UI is slightly different but can be customized to behave similarly, +e.g. Pcomplete's default cycling can be obtained with +(setq completion-cycle-threshold 5). + --- *** Expansion of history event designators is disabled by default. To restore the old behavior, use diff --git a/lisp/eshell/em-cmpl.el b/lisp/eshell/em-cmpl.el index cd5c14afbe6..25a6e88c8e6 100644 --- a/lisp/eshell/em-cmpl.el +++ b/lisp/eshell/em-cmpl.el @@ -288,9 +288,10 @@ to writing a completion function." (function (lambda () (set (make-local-variable 'comint-file-name-quote-list) - eshell-special-chars-outside-quoting))) nil t) - (add-hook 'pcomplete-quote-arg-hook 'eshell-quote-backslash nil t) - (define-key eshell-mode-map [(meta tab)] 'eshell-complete-lisp-symbol) + eshell-special-chars-outside-quoting))) + nil t) + (add-hook 'pcomplete-quote-arg-hook #'eshell-quote-backslash nil t) + ;;(define-key eshell-mode-map [(meta tab)] 'eshell-complete-lisp-symbol) ; Redundant (define-key eshell-mode-map [(meta control ?i)] 'eshell-complete-lisp-symbol) (define-key eshell-command-map [(meta ?h)] 'eshell-completion-help) (define-key eshell-command-map [tab] 'pcomplete-expand-and-complete) @@ -298,15 +299,14 @@ to writing a completion function." 'pcomplete-expand-and-complete) (define-key eshell-command-map [space] 'pcomplete-expand) (define-key eshell-command-map [? ] 'pcomplete-expand) - (define-key eshell-mode-map [tab] 'eshell-pcomplete) - (define-key eshell-mode-map [(control ?i)] 'eshell-pcomplete) + ;;(define-key eshell-mode-map [tab] 'completion-at-point) ;Redundant! + (define-key eshell-mode-map [(control ?i)] 'completion-at-point) (add-hook 'completion-at-point-functions #'pcomplete-completions-at-point nil t) ;; jww (1999-10-19): Will this work on anything but X? - (if (featurep 'xemacs) - (define-key eshell-mode-map [iso-left-tab] 'pcomplete-reverse) - (define-key eshell-mode-map [backtab] 'pcomplete-reverse)) - (define-key eshell-mode-map [(meta ??)] 'pcomplete-list)) + (define-key eshell-mode-map + (if (featurep 'xemacs) [iso-left-tab] [backtab]) 'pcomplete-reverse) + (define-key eshell-mode-map [(meta ??)] 'completion-help-at-point)) (defun eshell-completion-command-name () "Return the command name, possibly sans globbing." @@ -442,34 +442,24 @@ to writing a completion function." (if glob-name completions (setq completions - (append (and (eshell-using-module 'eshell-alias) - (funcall (symbol-function 'eshell-alias-completions) - filename)) + (append (if (fboundp 'eshell-alias-completions) + (eshell-alias-completions filename)) (eshell-winnow-list (mapcar (function (lambda (name) (substring name 7))) (all-completions (concat "eshell/" filename) - obarray 'functionp)) + obarray #'functionp)) nil '(eshell-find-alias-function)) completions)) (append (and (or eshell-show-lisp-completions (and eshell-show-lisp-alternatives (null completions))) - (all-completions filename obarray 'functionp)) + (all-completions filename obarray #'functionp)) completions))))))) -(defun eshell-pcomplete (&optional interactively) - "Eshell wrapper for `pcomplete'." - (interactive "p") - ;; Pretend to be pcomplete so that cycling works (bug#13293). - (setq this-command 'pcomplete) - (condition-case nil - (if interactively - (call-interactively 'pcomplete) - (pcomplete)) - (text-read-only (completion-at-point)))) ; Workaround for bug#12838. +(define-obsolete-function-alias 'eshell-pcomplete #'completion-at-point "27.1") (provide 'em-cmpl) -- 2.39.2