Eschewing Zshell for Emacs Shell (2014)
41 points by pvdebbe 5 days ago | 23 comments

pvdebbe 14 hours ago
The biggest strength of Eshell, for me, is that I can maintain some sanity in Windows environments (with or without WSL). In linuxland, it's a tougher sell. Compared to term-mode and the others, Eshell hacks better and I can fine tune my tab completions. The best thing is that my keybinds integrate better across all emacs modes when I use eshell.
reply
wging 18 hours ago
reply
m463 19 hours ago
I tried using shell mode in emacs, but my fingers use control-p and control-r on the terminal shell and I fail.

instead of searching backwards in commands, it does it in the buffer.

How do people deal with this?

reply
qazxcvbnm 19 hours ago
M-n, M-p. M-r for searching on past commands. C-c c-n/C-p for next/previous prompt. C-c C-r to scroll to focus on output.

Having switched recently to Emacs, my current issue is how to get Emacs shell history saved properly for my other shell buffers, and getting completions from shell (not Emacs) to work, planning to try MisTTY soon.

reply
MarsIronPI 17 hours ago
I've retrained muscle memory to use C-c C-l (which I rebind to `consult-history'). This gives me a fuzzy-searchable list of all my history. I find that I prefer this to a normal shell's C-r, because with my vertical completion setup I can see multiple matches for my search simultaneously.
reply
onetom 10 hours ago
a good reason for getting used to the M-n/p/r binding is that they work in the minibuffer too, even in `emacs -Q` (though without live feedback, but i think that's a fine compromise)

for the past half year i'm using emacs without any extra competition packages and it's surprisingly usable as-is.

i haven't even customized the completion styles and it's fine!

i got used to typing `M-x -forward<TAB>` if i want to find a command which contains the word "forward" and not just starts with it.

i do have karabiner elements remapping my keys under macOS and i use a tweaked version of @jeebak 's SpaceFn layout, where i've mapped Opt on holding the semicolon key, which still acts as semicolon, when tapped.

that way M-r is pretty convenient to type. M-p is less so though, because i switch to the regular opt key for that... i should really have to get used to my glove80 keyboard to avoid such quirks...

reply
onetom 11 hours ago
i also thought i can't get used to it, but i can!

otherwise, as others have mentioned it, remap the keys!

also, you can talk to some LLM about it, if you feel it would be tedious to come up with better bindings.

feed in the key bindings from `C-h m` of eshell, enumerate which bindings you want to carry over from traditional shells and instruct it to recommend you binding swapping pairs.

i was able to get great results on such niche operations already from anthropic's opus 4.5 models but even grok or deepseek was pretty helpful already last summer.

steve yegge's efrit takes this to a whole new level, by letting the LLM interrogate your running Emacs process live for documentation or function source code:

https://github.com/steveyegge/efrit

he demoed it here:

https://youtu.be/ZJUyVVFOXOc?t=246

reply
ulbu 16 hours ago
remap the keys?
reply
fhd2 16 hours ago
I never could get used to different key bindings. vterm in Emacs, with a few workarounds, works beautifully for me.
reply
fainpul 15 hours ago
> with EShell, you don’t need to bother with a pager, since if you received too much information, hit C-c C-p which jumps you to the top of the last command, and then C-v your way down. Or better yet, just search for what you want.

Cmd+Up - jumps you to the top of the last command

Cmd+F - just search for what you want

I don't need no stinkin' Emacs

reply
chocochunks 11 hours ago
Does the Mac terminal keep infinite lines? That's one place where Emacs shines. It just keeps EVERYTHING, other terminal emulators only keep like the last 10,000 or so which is really easy to hit if you cat too big a file.
reply
deafpolygon 10 hours ago
it’s a setting you can enable, just like with most terms on linux
reply
msla 13 hours ago
Ctrl-R to search for previous command, which I use more often. Pretty ergonomic if you do the normal Emacs thing and rebind Caps Lock to Ctrl, ironically.
reply
sudonem 11 hours ago
Yes to this, but also installing fzf is life changing.
reply
kkfx 19 hours ago
Personally, while living in Emacs (EXWM), I still can't live on eshell, the issue is "the terminal", too many commands are simply uncomfortable to use in eshell while run smoothly in a real terminal.

I've also tried some new shells, the one I last more is xonsh, but generally I came back to zsh even if I use in general much less the shell than before thanks to Emacs, the 2D shell.

Emacs completion also it's very nice for text, but slower than tab-cycle in zsh as well and for quick commands that's matter.

reply
MarsIronPI 17 hours ago
Have you tried Eat[0]? It's a reasonably fast terminal emulator that integrates with Eshell so that all commands run in Eshell have full terminal emulation (but they're still run in the original Eshell buffer, which makes it better than `eshell-visual-commands'). I haven't had any terminal emulation problems since switching to it.

[0]: https://codeberg.org/akib/emacs-eat

With regards to completion, I use corfu, which gives me nice inline popups. I use the bash-completion package, so I don't have issues with programs that don't provide Eshell completions (which are basically all of them).

reply
kentrado 17 hours ago
This is extremely helpful. I have never considered the possibility that there could be a better method to deal with emulation than visual commands.

You have no idea how much this helps me.

reply
karthink 17 hours ago
You have to turn on eat-eshell-mode to enable Eat's terminal emulation in eshell.

It runs full-fledged TUIs like vim and ncmpcpp in Eshell slowly, but is good enough for quick fzf uses. It's perfectly fine for "small" dynamic elements like the spinners and progress bars used by package managers.

Just remember to use system pipes (with "*|") instead of Elisp pipes (with "|") if you're piping data into an interactive TUI application like fzf in Eshell.

reply
goku12 16 hours ago
How does eat detect a visual command in eshell? I use vterm in Emacs for visual commands like nvim and htop. But it's triggered manually with a simple custom prefix command (just 'v') added to the actual command. I wonder if that trigger could be automated. It sounds from your description like vterm is faster than eat. If so, a similar automatic trigger for vterm could be very beneficial.
reply
karthink 13 hours ago
There's some miscommunication here.

> How does eat detect a visual command in eshell?

eat-eshell-mode doesn't detect visual commands and launch a separate eat buffer, like eshell-visual-commands do. It filters all process output in eshell and handles term codes. It turns the eshell buffer itself into a terminal, so that vim or whatever runs in eshell.

> It sounds from your description like vterm is faster than eat.

vterm is faster than eat, but a dedicated eat buffer is fast enough for most common TUIs. An eshell buffer with eat-eshell-mode is slower.

reply
skydhash 12 hours ago
Visual commands only differs from normal commands by the escapes code they use (like enabling the alternate buffer, clearing the screen,..). Eshell can't deal with those (and shouldn't as it's a shell, not a terminal). Eat adds a layer that does process those escape codes and that's all you need to handle visual commands.
reply
onetom 10 hours ago
i second the eat package recommendation.

there are some quirks with it though, given it has a couple of input modes.

i think everyone should read its fantastic documentation 1st to avoid frustration, instead of just falling back to the local minima of trying to use their pimped up shell inside eat as is.

e.g. i had a 2 line starship prompt enabled in my macOS zsh and inside eat it made the screen scroll back and forth by half a page randomly as i was just typing regular characters at the prompt.

M-<left>/<right> moves the Emacs point in semi-char mode, but the underlying shell is not aware of it, so the next character input will happen at an incorrect position. M-f/b works though.

There is an auto-line-mode, which might be a good compromise, but i haven't tried it yet.

reply
klodolph 19 hours ago
I agree with the assessment about eshell. I use eshell for one thing only—quick terminal sessions in the same directory as the file I'm editing.
reply