Does it also have job control, and jobs as first-class objects?
In schemesh, you can do things like
find / -xdev -type f | ls -l --sort=size
CTRL+Z
bg 1
and also (define j {git log})
(display j)
(display (sh-run/string j))> A command invocation followed by an ampersand (&) will be run in the background. Eshell has no job control, so you can not suspend or background the current process, or bring a background process into the foreground. That said, background processes invoked from Eshell can be controlled the same way as any other background process in Emacs.
For things like this, we would have to switch to something like M-x shell or even M-x ansi-term. In Emacs, we have an assortment of shells and terminal implementations. As a long time Emacs user, I know when to use which, so it does not bother me. However, I can imagine how this might feel cumbersome for newer Emacs users.
In fact, this is one of the reasons I think your project is fantastic. It offers some of the Eshell-like experience, and more, to non-Emacs users, which is very compelling!
I wonder why, after all these years, nobody has added it?
If someone (not me) made a patch that did, would the GNU Emacs maintainers accept it?
> That said, background processes invoked from Eshell can be controlled the same way as any other background process in Emacs
I haven't used Eshell much, but this makes a simple "command &" arguably much saner than in a traditional Unix shell.
I imagine that a new feature would be accepted only if someone can make it play nice with existing features. And in case of job control, I have a bad feeling about the complexity involved.
So if there's an "emacs" way of doing things, generally eshell delegates to that, instead of rolling its own.
I thought it was the latter (but it's been a while since I looked at it).
Tcl's exec gets it right. R Keene's pipethread extension for tcl gets it even more right.
Just perusing the schemesh docs (haven't tried it yet), it looks like he got it right, as well
I'd just like to share my joy in using the Emacs shell (Eshell), which I find to be a wonderful fusion of the Unix shell and a Lisp REPL. You can enter commands with or without parentheses. For example:
Or Eshell comes with several built-in commands implemented as Elisp functions. For example: Of course, you can still run external commands like usual: Since TRAMP is an integral part of Emacs, you can switch between the local shell and remote shells transparently with simple 'cd' commands. For example: In the second command, I redirected a file to a remote file system with the usual '>' redirection operator.Notice how, in the sixth command, I switched from my local shell to a remote shell with a simple 'cd' command. With Eshell and TRAMP, working across multiple remote systems becomes transparent, seamless, and effortless! Best of all, I still have the full power of Emacs at my fingertips, making Eshell an incredibly smooth and powerful experience!