|
|
[[!sidebar content=""]]
[[!meta title="Top 10 reasons why you should be using Eshell"]]
[[!meta copyright="Copyright © 2022 Howard Abrams"]]
[[!inline pages="internal(2022/info/eshell-nav)" raw="yes"]]
<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
<!-- You can manually edit this file to update the abstract, add links, etc. --->
# Top 10 reasons why you should be using Eshell
Howard Abrams (he/him)
[[!inline pages="internal(2022/info/eshell-before)" raw="yes"]]
While Eshell is this quick and dirty way to run external commands, its
*dirtiness* plays into the Lisp’s *malleable* big ball of mud metaphor,
and I have a number of quick hacks that will make you want to play in
this puddle.
This will be a lightning talk that I will pre-record to show off some
features in eshell I found while diving into the source code … stuff
you can’t do in another terminals. Did you know that `$$` is a special
variable that contains the output from the last command?
Update from Howard: I wrote an _expanded transcript_ with more code and functional links. See <http://howardism.org/Technical/Emacs/eshell-why.html>
Want _all_ the code? See my literate dotfiles for #emacs at <https://github.com/howardabrams/hamacs/blob/main/ha-eshell.org>
# Discussion
## Notes
- Full code:
<https://github.com/howardabrams/hamacs/blob/main/ha-eshell.org>
- Longer transcript:
<http://howardism.org/Technical/Emacs/eshell-why.html>
- Yes eshell is usefull! Please help polishing and showing this stuff
you found out.
- Alvaro Ramirez has been doing the DWIM stuff
- Regarding the not so well oiled parts of eshell. There are many
efforts doing a better shell. I have the feeling we already have
that in emacs already and it is just unfinished. But maybe that is
just a statment about emacs in general.
- Reach out to me if anyone wants to pair up and make a eshell-ext
with many of the feature improvements I mentioned in my talk, that
probably shouldn't clutter up the default eshell implementation.
- eshell is great for running top and htop (except I can't figure out how to input the function keys)
- haha yeah i don't either
- vterm isn't distracting - it has no new features to speak of
## Questions and answers
- Q: Do you fallback to vterm only when needing terminal emulation
(ncurses/etc)? Or are there use cases or contexts where you use
vterm over eshell beyond just terminal emulation needs?
- A: I do vterm mostly for SSH, but Docker builds and Ansible
commands can cause a real mess of the screen, so I often run
those commands in vterm ... but I'm not really working with
that output.
- Q: One issue I've had with eshell's TRAMP integration is that cd
is host agnostic (as you point out). This means typing `cd` on a
remote machine will cd back to $HOME on your local machine. Is
there a way to cd to $HOME on the remote machine?
- A: It just isn't the way it behaves. While Eshell, with a
Tramp-based cd command, will ssh "under the hood", it is
temporary, as all the buffer work is local. I usually don't
know what will happen, so I often need to switch to vterm for
all ssh work. Which gets me upset when I encounter something
that I would then like to use Eshell for (like piping the output
back to my local Emacs buffer).
- Q: Thank you for the missing Why eshell. Have you thought about
adding it to the eshell manual?
- A: maybe I should team up with someone and improve on it
- Q:Do you know if the eshell {} can be used from elisp? It could make
for a nice elisp shell interface.
- A: Yes. Start with `eshell-command' and some variations on
that.
- Q: How does that interplay with your "literate-devops" approach,
where things are done in an org buffer/document first instead of
directly in the shell/terminal?
- A: the 2 are different. I use as REPL to test stuff
- Q: Do you have a strategy for getting around eshell's lack of
support for input redirection? (I also miss process substitution.)
- A: I have started sending output to Emacs buffers, where I can
have more fun editing them than trying to get a pipe command
sequence working. I wrote a function to pull a buffer back into
Eshell to pipe back to something else. Pipes are problematic in
Eshell.
- Q: Can you call elisp functions as well (ie, not just commands)?
- A: Yes. Functions that start with eshell/ are called as if they
were commands. However, all functions are available in eshell
... that is what makes it more interesting than the other
comint-based term shells.
- ~~Q: Aren't buffers the superior pipes? --> that was meant as a
comment when he was asked about pipes, not a question per se -->
alright~~
- A:Howard: yes
- Q:Do you have a preferred method for getting argument completion for
shell commands in Eshell?
- A: Check out
<https://github.com/howardabrams/hamacs/blob/main/ha-eshell.org#getopts>
- Q: Similarly, is it possible to get Eldoc-based completion for Elisp
calls in Eshell?
- A: dont know. would be great, though
- Q:Do you have thoughts about
<https://www.masteringemacs.org/article/complete-guide-mastering-eshell#plan-9-smart-shell>
? Summary: it effecitly adds a "| less" to every command so you
get to see paged output if needed, except it is built into eshell.
- A: It is a cool idea, but while I tried it when Mickey first
published that idea, it didn't stay in my workflow.
- Q: Is $$ a built-in feature of eshell or did you add it?
- A: The Eshell built-in version of $$ doesn't always work, so
I wrote an updated version that seems to work better (see
<https://github.com/howardabrams/hamacs/blob/main/ha-eshell.org#last-results>)
... I'm pretty sure that if you do a command with a lot of
output, it may not work at all, not just get the last of that
output. Mine is just a better hack. :-D
- Q: Do you ever fallback to terminals/shells outside Emacs, and if so
in what circumstances?
- A: I boot up with a Terminal to mount remote file systems, as my
Emacs configuration isn't always stored locally on my machine.
I'll admit that I sometimes leave the Emacs Garden, but doing
anything interesting become frustrating when you have to leave
the keyboard for the mouse.
- Q: What are the less well-oiled parts of Eshell or edge case issues
that you encounter if any?
- A: We should make a list and start working on them.
- Q:Do you have ways to improve eshell vterm interop like sharing
command history and directory tracking?
- A: I don't. If I am going to SSH somewhere, I just start vterm,
and haven't thought about any interop.
- Q: Where can I find your eshell/do command? Probably you also have another bunch of interesting Eshell helpers.
- https://gitlab.com/howardabrams/hamacs/-/blob/main/ha-eshell.org?plain=1#L741-761
Other comments from IRC:
- Impressive. eshell is an emacs REPL! I knew I could issue some emacs commands but not this level of interactivity. Thanks!
- The real elisp REPL is ielm, but eshell is more generally useful.
- eshell is a REPL focused on the specific niche of shell. ielm's the pure elisp repl, and it rocks.
- yes. i know ielm. just hadn't realised how powerful eshell is.
- howard-abrams : every time I've watched a talk of yours over the years, Emacs/Org-mode has absorbed one more use cases of mine, and made them be in literate form. I'm down to Emacs and a web browser, so I'm looking ahead to your talk about the Web in Emacs :)
- You can also leverage org-mode source blocks tu turn outputs into inputs to other blocks so, plenty of alternatives to pipes
- Wow! Eshell is awesome! I have just learnt more tips! Thanks howard-abrams!
- I think of Eshell as my *universal* machine REPL, i.e. not just ielm for emacs/elisp nor a shell for the machine, but *both* emacs/elisp and the OS/env.. In that way it's quite neat.
- howard-abrams: thank you, very inspiring! I've always found 'normal' command line usage somewhat cumbersome and am certanly going to look at the code
- I really like eshell but I sometimes find the aliases a bit hard to write. alias f if $* {find-file $1; for i in {cdr {flatten-tree $*}} {find-file-other-window $i}} {echo "No files"} - Should probably use Elisp instead
- I think the aliases are almost completely broken, and only seem to work in the barest of cases.
- Yes, in particular the Lisp part is broken. In combination with $*
- I agree that you should write a function for that. Because as I mentioned in my talk, aliases don't accept $* at all.
- Oh, they do. This alias works. I don't recall the reason why I wrote this as an alias. I probably just wanted to use an alias where possible.
- Huh ... that works? I need to try it out. I couldn't get that working, so that is why I wrote the function that I did.
- watching your talk now; TIL /dev/kill and /devl/clip
[[!inline pages="internal(2022/info/eshell-after)" raw="yes"]]
[[!inline pages="internal(2022/info/eshell-nav)" raw="yes"]]
|