summaryrefslogblamecommitdiffstats
path: root/2022/talks/eshell.md
blob: def188e80205b79e74e22a429361b067e61afdd6 (plain) (tree)
1
                       



















                                                                                                     
                                                                        

                                                        

                                                                                                                                                    
















                                                                         
                                                                    


                                                                                                     







                                                                    
                                                                   
                    






                                                                    








                                                                        
                                                                  
             
                                                                    


                                                                    
                                                                 








                                                                       
                                                                 
                                 

                                                                    










                                                                                               
                                                                     

                                                                      


                                                                    

                                                                                      
                                                                  




                                                                        

                                                                      






                                                                       

                                                                       




















                                                                                                                                                                                                                                                                     





                                                              
[[!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 &#x2026; 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"]]