diff options
Diffstat (limited to '2022/talks/eshell.md')
-rw-r--r-- | 2022/talks/eshell.md | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/2022/talks/eshell.md b/2022/talks/eshell.md new file mode 100644 index 00000000..def188e8 --- /dev/null +++ b/2022/talks/eshell.md @@ -0,0 +1,156 @@ +[[!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"]] + + |