Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
####### # # E-scripts on eshell. # # Note 1: use the eev command (defined in eev.el) and the # ee alias (in my .zshrc) to execute parts of this file. # Executing this file as a whole makes no sense. # An introduction to eev can be found here: # # (find-eev-quick-intro) # http://angg.twu.net/eev-intros/find-eev-quick-intro.html # # Note 2: be VERY careful and make sure you understand what # you're doing. # # Note 3: If you use a shell other than zsh things like |& # and the for loops may not work. # # Note 4: I always run as root. # # Note 5: some parts are too old and don't work anymore. Some # never worked. # # Note 6: the definitions for the find-xxxfile commands are on my # .emacs. # # Note 7: if you see a strange command check my .zshrc -- it may # be defined there as a function or an alias. # # Note 8: the sections without dates are always older than the # sections with dates. # # This file is at <http://angg.twu.net/e/eshell.e> # or at <http://angg.twu.net/e/eshell.e.html>. # See also <http://angg.twu.net/emacs.html>, # <http://angg.twu.net/.emacs[.html]>, # <http://angg.twu.net/.zshrc[.html]>, # <http://angg.twu.net/escripts.html>, # and <http://angg.twu.net/>. # ####### # «.asking-for-examples» (to "asking-for-examples") # «.eshell/foo» (to "eshell/foo") # «.dollars-expansion» (to "dollars-expansion") # «.for-loop» (to "for-loop") # «.hacker-news» (to "hacker-news") # «.eshell-insert-buffer-name» (to "eshell-insert-buffer-name") # «.eshell-keymaps» (to "eshell-keymaps") # «.eshell-help» (to "eshell-help") # «.eshell/ls» (to "eshell/ls") # «.complex-commands» (to "complex-commands") # «.eshell/fakewget» (to "eshell/fakewget") # «.eshell/wget-emacs-devel» (to "eshell/wget-emacs-devel") # «.fakewget-unreliable» (to "fakewget-unreliable") # «.eshell/alias» (to "eshell/alias") # «.process-environment» (to "process-environment") # «.eshell-plain-echo-behavior» (to "eshell-plain-echo-behavior") # «.emacsconf2022» (to "emacsconf2022") # «.reduce-latency» (to "reduce-latency") # «.mastering-eshell» (to "mastering-eshell") https://www.emacswiki.org/emacs/CategoryEshell # (find-es "emacs" "eshell") # (find-eshellfile "") # (find-eshellfile "eshell.el") # (find-eshellnode "Aliases") # (find-eshellnode "Input/Output") # (find-eshellnode "Input/Output" "Redirection") ##### # # My message on help-gnu-emacs asking for examples and snippets # 2022aug22 # ##### # «asking-for-examples» (to ".asking-for-examples") # https://lists.gnu.org/archive/html/help-gnu-emacs/2022-08/msg00270.html # Subj: Examples of usage of Eshell (for a tutorial)? Hi all, first of all, apologies if this sounds like a lazy question... it's for a good cause, I swear! =) I would like to write a (sort of) mini-tutorial on Eshell that would be made mostly of examples that can be executed with this, http://angg.twu.net/eepitch.html with links to docs of all kinds. Here are some examples of other sort-of-tutorials written in that way: http://angg.twu.net/e/lua-intro.e.html#intro:PP http://angg.twu.net/e/python.e.html#tut-numbers Do you have any snippets, or links to pages with snippets, to suggest? I know the info manual of Eshell and I've tried to read it several times, but most of the features that it describes are "example-less" - I've tried to write snippets that demonstrate them, but failed or gave up... Thanks in advance! Eduardo Ochs http://angg.twu.net/#eev ##### # # How to define a new builtin "foo" by defun-ing eshell/foo # 2021oct06 # ##### # «eshell/foo» (to ".eshell/foo") # (find-eshellnode "Top" "an alternative to the IELM") # (find-eshellnode "Built-ins" "name starting with" "eshell/") # (find-eshellgrep "grep --color=auto -nH --null -e 'defun eshell/' *.el") * (eepitch-eshell) * (eepitch-kill) * (eepitch-eshell) (defun eshell/foo (&rest args) "hello") foo bar plic (defun eshell/foo (&rest args) (format "%S" args)) foo bar plic (defun eshell/foo (&rest args) (error "Bang")) foo bar plic (defun eshell/foo (&rest args) nil) foo bar plic (defun eshell/foo (&optional a b) (list a :: b)) foo bar plic (defun eshell/foo (&optional a b) (format "%s::%s" a b)) foo bar plic foo bar (defun eshell/foo (&optional a b) (format "%s::::%s" a b)) foo bar plic ##### # # dollars-expansion # 2022aug21 # ##### # «dollars-expansion» (to ".dollars-expansion") # (find-eshellnode "Dollars Expansion" "$VAR") # (find-eshellnode "Dollars Expansion" "$\"VAR\"") # (find-eshellnode "Dollars Expansion" "$'VAR'") # (find-eshellnode "Dollars Expansion" "$(LISP)") # (find-eshellnode "Dollars Expansion" "${COMMAND}") # (find-eshellnode "Dollars Expansion" "$<COMMAND>") # (find-eshellnode "Dollars Expansion" "$EXPR[I...]") # (find-eshellnode "Dollars Expansion" "$EXPR[REGEXP I...]") # (find-eshellnode "Dollars Expansion" "$#EXPR") # (find-eshellnode "Expansion" "${echo \"foo\"}bar") * (eepitch-eshell) * (eepitch-kill) * (eepitch-eshell) ##### # # for-loop # 2022aug21 # ##### # «for-loop» (to ".for-loop") # (find-eshellnode "for loop") # (find-man "1 seq") # (find-man "1 seq" "FIRST INCREMENT LAST") * (eepitch-eshell) * (eepitch-kill) * (eepitch-eshell) seq 10 2 20 echo ${seq 10 2 20} for i in ${seq 10 2 20} { echo :$i: } ##### # # Posts about eshell on hackernews # 2022aug21 # ##### # «hacker-news» (to ".hacker-news") # https://hn.algolia.com/?q=eshell # https://news.ycombinator.com/item?id=2668007 A nice little hack to evaluate scripts from emacs' eshell (ktuman.blogspot.com) # https://news.ycombinator.com/item?id=27884822 Best terminal – Why Eshell? series (birkey.co) # https://news.ycombinator.com/item?id=27561350 Blurring the lines between shell and editor (xenodium.com) # https://news.ycombinator.com/item?id=27567907 Blurring the lines between shell and editor (xenodium.com) # https://news.ycombinator.com/item?id=14935842 Converting Your Bash Configuration to Eshell (skyefreeman.io) # https://news.ycombinator.com/item?id=26709186 Emacs: Difference between shell, term, eshell (ergoemacs.org) # https://news.ycombinator.com/item?id=14825607 Eschewing Zshell for Emacs Shell (howardism.org) # https://news.ycombinator.com/item?id=18957875 Eschewing Zshell for Emacs Shell (howardism.org) # https://news.ycombinator.com/item?id=8649856 Eschewing Zshell for Emacs (howardism.org) # https://news.ycombinator.com/item?id=20205103 Presenting the Eshell (howardism.org) # https://news.ycombinator.com/item?id=17026490 Eshell as a main shell (ambrevar.bitbucket.io) # https://news.ycombinator.com/item?id=24547400 Eshell versus M-X Shell (ambrevar.xyz) # https://news.ycombinator.com/item?id=15913455 Eshell: things I’ve totally underestimated – X11 Must DIE (debianjoe.wordpress.com) # https://news.ycombinator.com/item?id=6673676 Finally wrapping my head around eshell (the emacs shell) (blogbyben.com) # https://news.ycombinator.com/item?id=31424521 Living the Eshell Dream: A Reduction in Latency from 70 Seconds to 3 Seconds (tdodge.consulting) # https://news.ycombinator.com/item?id=31437660 Living the Eshell Dream: A Reduction in Latency from 70 Seconds to 3 Seconds (tdodge.consulting) # https://news.ycombinator.com/item?id=2004217 Complete guide to mastering eshell, the emacs lisp shell (masteringemacs.org) # https://news.ycombinator.com/item?id=2002037 Mastering Eshell. (masteringemacs.org) # https://news.ycombinator.com/item?id=2003557 A Complete Guide to Mastering Eshell (masteringemacs.org) # https://news.ycombinator.com/item?id=15551106 Mastering Eshell (masteringemacs.org) # https://news.ycombinator.com/item?id=17135947 Mastering Eshell (masteringemacs.org) # https://news.ycombinator.com/item?id=32477938 Mastering Eshell (masteringemacs.org) # https://news.ycombinator.com/item?id=32481533 Emacs: Mastering Eshell (masteringemacs.org) # https://news.ycombinator.com/item?id=2971006 More Emacs - a better eshell (dieblinkenlights.com) # https://news.ycombinator.com/item?id=15779520 Yes Eshell Is My Main Shell (reddit-src) (reddit.com) # https://news.ycombinator.com/item?id=15186504 Yes, eshell is [his] main shell (reddit.com) ##### # # C-c M-b: eshell-insert-buffer-name # 2022aug21 # ##### # «eshell-insert-buffer-name» (to ".eshell-insert-buffer-name") # https://www.masteringemacs.org/article/complete-guide-mastering-eshell#useful-keybindings # (find-fline "~/LOGS/2022aug21.emacs" "<wgreenhouse> edrx: C-c M-b") # (find-fline "~/LOGS/2022aug21.emacs" "neofetch > #<buffer *scratch*>") # (find-eshellnode "Input/Output") # (find-eshellnode "Input/Output" "echo hello >>> #<buffer *scratch*>") # (find-eapropos "eshell.*insert") # (find-eshellgrep "grep --color=auto -nH --null -e eshell-insert *.el") # (find-efunctiondescr 'eshell-insert-buffer-name) # (find-efunction 'eshell-insert-buffer-name) # (find-hvariable 'eshell-arg-mode-map) # (find-evardescr 'eshell-arg-mode-map) # (find-evariable 'eshell-arg-mode-map) # (find-efunctiondescr 'eshell-insert-envvar) # (find-efunction 'eshell-insert-envvar) # (find-efunctiondescr 'eshell-insert-process) # (find-efunction 'eshell-insert-process) ##### # # eshell-keymaps # 2022aug21 # ##### # «eshell-keymaps» (to ".eshell-keymaps") # (find-eapropos "eshell.*map") # (find-hvariable 'eshell-arg-mode-map) # (find-hvariable 'eshell-cmpl-mode-map) # (find-hvariable 'eshell-command-map) # (find-hvariable 'eshell-command-mode-map) # (find-hvariable 'eshell-hist-mode-map) # (find-hvariable 'eshell-isearch-map) # (find-hvariable 'eshell-mode-map) # (find-hvariable 'eshell-pred-mode-map) # (find-hvariable 'eshell-proc-mode-map) # (find-hvariable 'eshell-prompt-mode-map) # (find-hvariable 'eshell-var-mode-map) (find-eshellnode "Input/Output") (find-eshellnode "Input/Output" "/dev/kill") # (find-evardescr 'eshell-mode-map) # (find-evariable 'eshell-mode-map) # (find-hvariable 'eshell-mode-map) # (find-ekeymapdescr eshell-mode-map) ##### # # eshell-help # 2021oct06 # ##### # «eshell-help» (to ".eshell-help") # (find-eshellgrep "grep --color=auto -nH --null -e help *.el") # (find-eaproposf "eshell") # (find-eaproposf "eshell.*help") # (find-efile "help.el" "(defalias 'help 'help-for-help)") * (eepitch-eshell) * (eepitch-kill) * (eepitch-eshell) help which help alias find-eshellfile find-eshellfile "" ##### # # eshell/ls # 2021oct06 # ##### # «eshell/ls» (to ".eshell/ls") * (eepitch-eshell) * (eepitch-kill) * (eepitch-eshell) which ls # eshell/ls is a compiled Lisp function in `em-ls.el' # (find-eshellfile "em-ls.el" "defsubst eshell/ls") which echo echo 'foo bar' echo foo bar # (find-node "(eshell)Top") # (find-node "(eshell)Top" "alternative to the IELM") # (find-node "(eshell)Built-ins" "eshell/ls") # (find-efunctiondescr 'eshell/ls) # (find-efunction 'eshell/ls) # (find-eshellgrep "grep --color -nH --null -e eshell/ *.el") # (find-eshellfile "em-ls.el" "(defsubst eshell/ls") # (find-efunctiondescr 'defsubst) # (find-efunction 'defsubst) # (find-eapropos "eshell/") ##### # # complex-commands # 2021oct06 # ##### # «complex-commands» (to ".complex-commands") # (find-eshellgrep "grep --color -nH --null -e eshell-complex-commands *.el") # (find-evardescr 'eshell-complex-commands) # (find-evariable 'eshell-complex-commands) ##### # # eshell/fakewget # 2021oct06 # ##### # «eshell/fakewget» (to ".eshell/fakewget") # (find-eev "eev-plinks.el" "find-urlretrieve" "eshell/fakewget") ;; Original defs: ;; (find-angg ".emacs" "eepitch.el") (defun eepitch-shell () (interactive) (eepitch-de '(shell))) (defun eepitch-shell2 () (interactive) (eepitch-de '(shell "*shell 2*"))) (fmakunbound 'eshell/wget) ;; Eshell defs: (defun eepitch-shell () (interactive) (eepitch-eshell)) (defun eepitch-shell2 () (interactive) (eepitch-eshell)) (defalias 'eshell/wget 'ee-eshell/fakewget) # (find-psne-links "http://angg.twu.net/index.html" "-nc") rm -Rfv /tmp/esh/ mkdir /tmp/esh/ cd /tmp/esh/ wget http://angg.twu.net/foo wget http://angg.twu.net/ wget http://angg.twu.net/index.html wget http://angg.twu.net/index.html foo wget ##### # # Announcing eshell/wget in emacs-devel # 2021oct06 # ##### # «eshell/wget-emacs-devel» (to ".eshell/wget-emacs-devel") # https://lists.gnu.org/archive/html/emacs-devel/2021-10/msg00491.html # https://mail.google.com/mail/ca/u/0/#sent/KtbxLthVfqpMKGGWNMhTGnrZFJbPkVkfrg eshell/wget: a minimalistic wget for eshell Hi all (and John Wiegley), I wrote a function eshell/wget - or eshell/fakewget - that uses url-retrieve-synchronously to download files from the internets. It is here (and eev is in ELPA): http://angg.twu.net/eev-current/eev-plinks.el http://angg.twu.net/eev-current/eev-plinks.el.html#find-urlretrieve I don't recommend using it for big files because it doesn't output any progress reports until it finishes. I wrote it for a workshop that will have several participants who are Windows users who have never used a terminal in their lives - see this thread: https://lists.gnu.org/archive/html/help-gnu-emacs/2021-10/msg00037.html https://lists.gnu.org/archive/html/help-gnu-emacs/2021-10/threads.html#00037 but I think that it may be useful in other situations, too. I don't know how to advertise it. I looked for an index of user-written eshell extensions and I only found this: https://www.emacswiki.org/emacs/EshellExtensions and I thought that it would be a good idea to announce it here first - and ask for advice. Cheers =), Eduardo Ochs http://angg.twu.net/#eev ##### # # fakewget corrupts files # 2021oct07 # ##### # «fakewget-unreliable» (to ".fakewget-unreliable") # (find-fline "~/2021-oficina/setup.el") # (find-estring (ee-urlretrieve0 "http://angg.twu.net/2021-oficina/setup.el")) # (ee-use-angg) * (eepitch-eshell) * (eepitch-kill) * (eepitch-eshell) rm -Rv /tmp/pdf/ mkdir /tmp/pdf/ cd /tmp/pdf/ * (ee-use-fake-wget) wget -nc https://tannerlectures.utah.edu/_resources/documents/a-to-z/c/Coetzee99.pdf mv Coetzee99.pdf Coetzee99-fake.pdf * (ee-use-real-wget) wget -nc https://tannerlectures.utah.edu/_resources/documents/a-to-z/c/Coetzee99.pdf cmp Coetzee99.pdf Coetzee99-fake.pdf # Coetzee99.pdf Coetzee99-fake.pdf differ: char 775, line 16 ##### # # eshell/alias # 2021oct08 # ##### # «eshell/alias» (to ".eshell/alias") # (find-wconfig-shell-links) # (find-wconfig-shell-links 2 "eshell/alias") # (find-eshellnode "Aliases") # (find-eshellnode "Invocation" "looks first for an alias") # (find-eshellgrep "grep --color=auto -nH --null -e alias *.el") # (find-eshellfile "em-unix.el" "aliases implemented in Lisp") # (find-eshellfile "esh-cmd.el" "is an Eshell alias") # (find-efunctiondescr 'eshell/alias) # (find-efunction 'eshell/alias) # (find-efunctiondescr 'eshell-read-aliases-list) # (find-efunction 'eshell-read-aliases-list) # (find-evardescr 'eshell-command-aliases-list) # (find-evariable 'eshell-command-aliases-list) # (find-evardescr 'eshell-aliases-file) # (find-evariable 'eshell-aliases-file) # (find-fline "~/.emacs.d/eshell/alias") # (find-fline eshell-aliases-file) (eshell/alias "wget" "~/bin/wget.exe $*") (eshell/alias "wgety" nil) * (eepitch-eshell) * (eepitch-kill) * (eepitch-eshell) alias wget '~/bin/wget.exe $*' cat ~/.emacs.d/eshell/alias alias wget cat ~/.emacs.d/eshell/alias * (eshell/alias "wget" "~/bin/wget.exe $*") cat ~/.emacs.d/eshell/alias * (eshell/alias "wget" nil) cat ~/.emacs.d/eshell/alias # eshell-read-aliases-list: Search failed: "^alias\\s-+\\(\\S-+\\)\\s-+\\(.+\\)" [2 times] # (find-eshellfile "em-alias.el" "^alias") ##### # # process-environment # 2021oct07 # ##### # «process-environment» (to ".process-environment") # (find-elnode "Index" "* process-environment:") export * (eepitch-eshell) * (eepitch-kill) * (eepitch-eshell) ##### # # eshell-plain-echo-behavior # 2022jan17 # ##### # «eshell-plain-echo-behavior» (to ".eshell-plain-echo-behavior") # https://lists.gnu.org/archive/html/bug-gnu-emacs/2022-01/msg00923.html # (find-wconfig-shell-links) # (find-wconfig-shell-links 2 "Configure the `echo' of eshell") # (find-windows-beginner-intro "5.6.1. Echo in Eshell") # (find-efunctiondescr 'eshell/echo) # (find-efunction 'eshell/echo) # (find-evardescr 'eshell-plain-echo-behavior) # (find-evariable 'eshell-plain-echo-behavior) * (eepitch-eshell) * (eepitch-kill) * (eepitch-eshell) echo A > /tmp/o echo B >> /tmp/o echo -N C >> /tmp/o echo -N D >> /tmp/o echo E >> /tmp/o cat /tmp/o * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) echo -N foo ##### # # emacsconf2022 # 2022dec04 # ##### # «emacsconf2022» (to ".emacsconf2022") # https://emacsconf.org/2022/talks/eshell/ # http://howardism.org/Technical/Emacs/eshell-why.html # https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.webm # https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.vtt # https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main--chapters.vtt # (code-video "eshellvideo" "$S/https/media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.webm") ;; (find-eshellvideo) ;; (find-eshellvideo "0:00") * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) cd /tmp/ wget -nc https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.webm wget -nc https://media.emacsconf.org/2022/emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.vtt mpv --fs --osd-level=2 emacsconf-2022-eshell--top-10-reasons-why-you-should-be-using-eshell--howard-abrams--main.webm ##### # # reduce-latency # 2024mar23 # ##### # «reduce-latency» (to ".reduce-latency") # (find-fline "~/LOGS/2024mar23.emacs" "background-output-thread") <xristos> absinthium: if you're piping a lot of data it can get bogged down, but you can patch Emacs to make it faster <edrx> xristos: how? (patch) <xristos> edrx: https://tdodge.consulting/blog/eshell/background-output-thread ##### # # mastering-eshell # 2024oct11 # ##### # «mastering-eshell» (to ".mastering-eshell") # (find-angggrep "grep --color=auto -nH --null -e mastering-eshell LOGS/*") # (find-fline "~/LOGS/2024oct11.emacs2" "mastering-eshell") # https://www.masteringemacs.org/article/complete-guide-mastering-eshell # (find-htmlpdf-links "masteringeshell" "https://www.masteringemacs.org/article/complete-guide-mastering-eshell") ;; https://www.masteringemacs.org/article/complete-guide-mastering-eshell ;; (find-fline "$S/https/www.masteringemacs.org/article/") (code-pdf-page "masteringeshell" "$S/https/www.masteringemacs.org/article/complete-guide-mastering-eshell.pdf") (code-pdf-text8 "masteringeshell" "$S/https/www.masteringemacs.org/article/complete-guide-mastering-eshell.pdf") ;; (find-masteringeshellpage) ;; (find-masteringeshelltext) ;; (find-masteringeshellpage 5 "Command Interception") ;; (find-masteringeshelltext 5 "Command Interception") <wgreenhouse> edrx: your eev talk is on my list to watch; I was sad to miss it live :) <edrx> wgreenhouse: wow, thanks!!! =) <wgreenhouse> but I like new ways to converse with emacs. I spend a lot of time in eshell and in some ways eev feels like a fellow-traveler of eshell <edrx> I've tried to learn how to add commands to eshell years ago, when its documentation was very sparse, and I failed miserably... if anything doesn't work in eshell please tell me! also, I only added support for vterm just a few days ago... <grym> mplsCorwin: https://imgur.com/gallery/ZiseUyx <edrx> the basic way of interacting with shells is shown is this demo here: https://www.youtube.com/watch?v=86yiRG8YJD0#t=15m11s <wgreenhouse> grym: I'll stan for the first 6 Dune books being worth one's time <wgreenhouse> after that it is indeed downhill <edrx> wgreenhouse: did you modify eshell to add your own hacks? <wgreenhouse> edrx: I mostly use it as-is, but gradually accumulate some aliases for things that should probably be elisp functions <edrx> wgreenhouse: hmm, ok <edrx> when I tried to hack it I wanted to make it recognize "wget" as special command and run a lisp function instead of /usr/bin/wget... but I gave up <wgreenhouse> edrx: you would need to create an interactive function named eshell/wget or so, and it should be picked up as a command https://github.com/manateelazycat/aweshell https://stackoverflow.com/questions/6532998/how-to-run-multiple-shells-on-emacs How to rename files to numbers in Eshell? https://lists.gnu.org/archive/html/help-gnu-emacs/2021-09/msg00146.html https://www.reddit.com/r/emacs/comments/n8n5wr/eshell_tuning_with_wellknown_keybindings/ https://ambrevar.xyz/emacs-eshell/ https://www.reddit.com/r/emacs/comments/6y3q4k/yes_eshell_is_my_main_shell/ https://news.ycombinator.com/item?id=17026490 Eshell as a main shell (ambrevar.bitbucket.io) https://tdodge.consulting/blog/eshell/background-output-thread https://www.reddit.com/r/emacs/comments/usghki/living_the_eshell_dream_a_reduction_in_latency/ eshell-command-result: https://lists.gnu.org/archive/html/bug-gnu-emacs/2022-08/msg02197.html https://irreal.org/blog/?p=10774 Mastering Eshell - Eshell implements zsh’s argument predicates https://www.masteringemacs.org/article/complete-guide-mastering-eshell https://lists.gnu.org/archive/html/bug-gnu-emacs/2022-09/msg00972.html bug#57635: 29.0.50; Look into using generator.el's CPS machinery to repl https://olddeuteronomy.github.io/post/how-to-clear-the-eshell/ https://www.reddit.com/r/emacs/comments/zpqcac/why_use_eshell/ https://www.n16f.net/blog/clearing-the-eshell-buffer/ https://www.reddit.com/r/planetemacs/comments/zunoqh/nicolas_martyanoff_clearing_the_eshell_buffer/ https://howardism.org/Technical/Emacs/eshell-why.html https://www.n16f.net/blog/eshell-key-bindings-and-completion/ https://irreal.org/blog/?p=12120 Defining Eshell Commands https://www.reddit.com/r/emacs/comments/1c7h53x/create_a_file_to_run_commands_in_eshell/ https://www.reddit.com/r/emacs/comments/1c7h53x/comment/l07vkrq/ https://www.reddit.com/r/emacs/comments/da9o7r/example_of_using_elisp_function_in_eshell/ https://lambdaland.org/posts/2024-08-19_fancy_eshell_prompt/ for i in * { (message "hey: %s" i); echo $i} # Local Variables: # coding: utf-8-unix # End: