
Eschewing Zshell for Emacs - pmoriarty
http://www.howardism.org/Technical/Emacs/eshell-fun.html
======
spain
One thing I _really_ like about Eshell is how you can make the whole buffer
editable. Printed too many lines by accident? Just mark the whole region and
do M-x delete-non-matching lines. Other fun things to do include using output
redirection to insert text straight into buffers! One last cool thing is that
Eshell comes with it's own little pseudo-devices like /dev/kill and /dev/clip,
you can probably guess what they're for.

Although as awesome as it is, there are still some places where I have no
choice but to use a real terminal. This is mostly curses-like interfaces and
stuff.

I find it funny that the author omitted one of the biggest missing features in
Eshell: input redirection, you just can't do it.

Here's further reading for anyone interested in Eshell, I think this is the
most comprehensive little guide out there:

[http://www.masteringemacs.org/article/complete-guide-
masteri...](http://www.masteringemacs.org/article/complete-guide-mastering-
eshell)

~~~
username223
I have tried to like it, but the lack of input redirection is just pathetic.
Worse, rather than just calling a real shell when it detects attempted input
redirection, it chastises you and refuses to do anything.

Plus, while Emacs' "M-x command" completion is great, Eshell was still about
as good as mid-90s Bash the last time I tried it. And then there's the cost of
learning yet another slightly-different shell syntax. While this could
probably be done right, it hasn't been in the 10+ years of Eshell's existence,
so I'm not holding my breath.

------
GeoffWozniak
I have tried. And I can't. It's just too slow when working with tons of output
(which is common in my work). (term-mode is no better.)

Emacs is one of my favourite tools on a computer. I love Lisp (even Elisp,
which is getting closer to Common Lisp as time goes on) and I love the
interaction, but Emacs is not good for serious terminal/shell work and it,
sadly, is pretty annoying as a tiling "window" manager.

Maybe with multi-threading it will get better, but until then, I can't see a
compelling reason to work exclusively in Eshell.

~~~
hollerith
>Emacs is not good for serious terminal/shell work

I am interested in this aspect of Emacs (since there're very few things
traditionally done by Emacs that Emacs is too slow at), but confused by your
comment.

My first guess was that the tons of output take longer to get inserted into an
Emacs buffer than they take to get inserted into the buffer of a good
terminal-emulation application.

But surely you realize that multi-threading wouldn't help with that, hence my
confusion.

Can you give an example of a program that produces too much output for Emacs
to keep up with?

Does the program generating the tons of output do a lot of cursor addressing
(like, e.g., the progress bar of homebrew or curl does)?

Have you tried shell mode as well as eshell mode?

~~~
warfangle
I've run into similar issues. It seems to be the draw speed that is very slow.
Each 80char line takes a good 10ms to render, which when working with a fast
command that outputs a lot of text... The command will have been done for
thirty seconds while eshell is still sputtering along showing output.

This is especially noticible with my on-modified-run-tests script - if there
is a long stack trace, often times it's faster to kill the task and start it
again rather than letting it finish.

~~~
chriswarbo
If the output is getting parsed in some way then it can get _really_ slow. For
example, automatic highlighting of matching-parenthesis is great 99% of the
time, but can hang the process for several minutes on large outputs (eg. a
MySQL dump of serialised PHP objects).

On a related note, the "clear" function at
[http://www.khngai.com/emacs/eshell.php](http://www.khngai.com/emacs/eshell.php)
can help speed things up when your buffer gets large; it's basically like
"reset" in bash. The reason it's useful is that the shell prompts in an eshell
buffer are marked as read-only, so trying to clear a region containing prompts
will fail. I'm sure there are other workaround for this, but running a "clear"
command is easy enough :)

~~~
warfangle
Nah, no automatic highlighting or anything of that sort - just the raw,
default, eshell.

------
gcv
Eshell works, but it does not use term.el, and so has terminal compatibility
problems with many utilities (the progress indication of curl or homebrew, for
example). I have found it much more practical to stick with zsh, but use ansi-
term or multi-term to launch the shell from inside Emacs windows. Performance
in situations when the terminal wants to spit out a lot of output leaves much
to be desired, but the convenience of staying inside Emacs outweighs the
drawbacks.

~~~
michaelsbradley
Another option is to run Emacs as a daemon, and then "live inside" tmux while
moving between terminal-mode emacsclient , zsh/bash, etc. running in tmux
sessions, windows and panes.

My personal workflow moved that direction about a year ago and I've never
looked back.

------
mronge
I've tried living in eshell but zsch auto complete is just too damn good. Is
there really good auto completion for eshell?

~~~
wging
I seem to be getting some good completions for files just from Company-mode. I
typed "/us" and got a list including /usr/, /usr/bin, /usr/lib, etc.

Also, tab-completion seems somewhat good. I typed /u and TABbed, and got
/usr/.

/usr/bin/l _v_ gives me /usr/bin/leave on first TAB, then cycles through
/usr/bin/llvm-g++, etc. on subsequent tabs.

Globbing: ls __/ *.js did what you'd want within a directory whose
subdirectories contain a lot of .js files.

It looks like someone added completions for git (and bzr, hg, if you care):
[http://tsdh.wordpress.com/2013/05/31/eshell-completion-
for-g...](http://tsdh.wordpress.com/2013/05/31/eshell-completion-for-git-bzr-
and-hg/) Works pretty well.

I wonder if there's a way to provide a bridge with zsh's completions, such
that if you have completions for zsh, you have them for eshell.

~~~
wyclif
I have all kinds of extended globbing turned on in my ~/.zshrc like so:

    
    
        #Superglobs
        setopt extendedglob
        unsetopt caseglob
    

I haven't used eshell, and I see no need to with zsh. This lets me glob 'ls
*/.txt', etc.

------
smenko
Oh, please! Not another one!.....

