Eschewing Zshell for Emacs
howardism.org
howardism.org
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...
Which is, of course, a great example of the reason we need to provide as much functionality as we reasonably can outside such interfaces (including GUI interfaces).
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.
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.
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?
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.
On a related note, the "clear" function at 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 :)
Correct.
> Can you give an example of a program that produces too much output for Emacs to keep up with?
Anything that produces a few hundred lines you didn't expect, e.g. a compile gone bad or an unexpectedly large diff. Unless you add something to "comint-preoutput-filter-functions" to discard output, you get to lean on C-c and wait for things to settle down.
Example: https://news.ycombinator.com/item?id=7310770
The thing that's so annoying is that it seems to process data that it really should ignore. It has nothing to do with display at all, it's a pipe.
(I wanted to update that example with using star-prefixed grep and sort since the info manual says that should avoid emacs built-ins, but after five minutes of waiting I gave up.)
And of course, ever since SICP I am still eagerly waiting to not ever having to program anything else than scheme.
My personal workflow moved that direction about a year ago and I've never looked back.
Also, tab-completion seems somewhat good. I typed /u and TABbed, and got /usr/.
/usr/bin/lv 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... 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.
#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.