One of my friends is getting into deep emacs! They were talking about learning elisp since it underlies everything else you do on emacs. My commentary was that you would study elisp if you intended to write or customise your own modes, and you would use eshell as your shell all the time as well. I assumed that had been a discouraging blandishment, but lo they reappeared in com talking about how eshell was a bit weird for com since anything you type appears twice. I had to get into this. $ emacsclient -c -a "" C-x C-f /ssh:screwtape@tty.sdf.org:~/ M-x eshell It begins! The point of eshell is that you are not directly writing in a shell. So it's exactly not like sshing in and writing in korn shell, to the extent a tramp shell (M-x shell) would be like that, which it also isn't. Instead you are evaluating elisp. Strings that are printed or returned are sent to the tramped shell (which is ksh in my case). The shell is powerful enough for com out of the box. so /ssh:screwtape@tty.sdf.org:/sdf/arpa/ns/s/screwtape/gopher/screwtape $ "date" Sat Nov 12 23:33:49 2022 /ssh:screwtape@tty.sdf.org:/sdf/arpa/ns/s/screwtape/gopher/screwtape $ but also $ (prog1 "" (dotimes (s 3) (print "date"))) M-x eval-print-last-sexp C-g "date" "date" "date" "" Sun Nov 13 00:01:18 2022 Sun Nov 13 00:01:18 2022 Sun Nov 13 00:01:18 2022 I'm not sure of the deeper meaning of C-g there. And I would have to bind my own key for eval-print-last-sexp (sexp in this case is an elisp s expression) I do (prog1 "" .. ) so that the actual return is an empty string (= pressing enter twice in the shell but not doing anything else). This had been on my mind regarding how to drive com remotely. A fortnight ago I had more or less settled on this: $ rlwrap ssh screwtape@tty.sdf.org 'ecl' > (ext:system "tmux new-session -s COM -d") > (ext:run-program "tmux" `("capture-pane" "-t0" "-p") :output t) > (ext:run-program "tmux" `("send-keys" "'date'" "C-m")) etc but with macros and functions So that I'm inside a lisp repl on (arpa) SDF, driving a headless COM chat also on SDF. I guess there is no reason to use non-portable ecl extensions, so maybe that should be changed to (require 'asdf) 's #'uiop:run-program for syncronous shellery. Our elisp approach one brings all of emacs (tramp, dired, eshell) to bear, while approach two uses just ssh (from here) + ecl (there) + tmux (there) or some such permutation for a common lisp repl. For slow connections the ecl repl environment is faster than tramping, since tramp-mode makes a number of connections for its whimsical tramped (e)shell which becomes quite slow, though what happens on your workstation is very fast somewhat analogously to rlwrap.