* 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.
This commit is contained in:
Stefan Monnier 2019-03-19 23:41:20 -04:00
parent e14c0d748e
commit 047c1b1935
3 changed files with 26 additions and 32 deletions

View file

@ -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.
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 when it's
below the cycling threshold, press @kbd{M-?}.
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

View file

@ -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

View file

@ -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)