Make eshell tab completion behave like Bash
Asked Answered
S

3

14

How can I make eshell autocomplete behave like Bash and Emacs in general i.e. it offers a list of choices rather than arbitrary selects one for you?

For example, if I have two directories "Download" and "Downloads", when I type "Down" and hit TAB, I expect another buffer pops up and shows me the choices. But eshell just completes it for me, i.e. if I press TAB, it completes to "Download"; hit TAB again, it changes to "Downloads".

Steatite answered 7/11, 2013 at 8:38 Comment(2)
You're probably getting some interference from your custom code. Try emacs -q: it works.Respond
I tried emacs -q and it didn't work. For example, if I have two directories "Download" and "Downloads", when I type "Down" and hit TAB, I expect another buffer pops up and shows me the choices. But eshell just complete it for me, i.e. if I press TAB, it complete to "Download"; hit TAB again, it changes to "Downloads".Steatite
R
6

Use this:

(add-hook
 'eshell-mode-hook
 (lambda ()
   (setq pcomplete-cycle-completions nil)))
Respond answered 7/11, 2013 at 11:6 Comment(5)
It didn't work as well. I tried adding it to my init file as well as manually modified in my running Emacs then start a new eshell. Still not produced my desire behaviour.Steatite
You need to set the value of the variable in eshell-mode-hook (or use setq-default)Snoopy
Normally it would be possible to customize the variable. But EShell seems to change the variable, which makes it necessary to update it in the hook.Underworld
Probably should use setq-local rather than setq?Birnbaum
@xuhdev: or do as proposed in the other answers and (setq eshell-cmpl-cycle-completions nil)Pissarro
F
6
(add-hook
 'eshell-mode-hook
 (lambda ()
   (setq pcomplete-cycle-completions nil)))

and

(setq eshell-cmpl-cycle-completions nil)

Both do as you ask and show a buffer listing the completions when I run my emacs as 'emacs -q' to avoid my own customizations. This is with emacs 23.3, are you running a much older version?

Also see http://www.emacswiki.org/emacs/EshellCompletion which is where I first went to check this out.

Steps to try this out:

  1. Start emacs using 'emacs -q' as the command -- no other arguments.
  2. Change to the *scratch* buffer
  3. Paste or type in one of the above code snippets
  4. Put your cursor at the end of the snippet and press 'C-e' to execute the code.
  5. Start eshell
  6. test
  7. if neither one works, report back here with your version info and any other relevant details
Firstling answered 7/11, 2013 at 15:47 Comment(1)
Thanks. I didn't know that I have to attach to eshell-mode-hook. Things work as expected. I am using the latest Emacs.Steatite
B
2

You only need to have the following line:

(setq eshell-cmpl-cycle-completions nil)

eshell-mode automatically set pcomplete-cycle-completions to the value of eshell-cmpl-cycle-completions locally.

Birnbaum answered 29/11, 2016 at 21:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.