Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
#######
#
# E-scripts on eat ("emulate a terminal")
#
# 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://anggtwu.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://anggtwu.net/e/eat.e>
#           or at <http://anggtwu.net/e/eat.e.html>.
#        See also <http://anggtwu.net/emacs.html>,
#                 <http://anggtwu.net/.emacs[.html]>,
#                 <http://anggtwu.net/.zshrc[.html]>,
#                 <http://anggtwu.net/escripts.html>,
#             and <http://anggtwu.net/>.
#
#######



# «.2022»		(to "2022")
# «.2024»		(to "2024")
# «.eat-args»		(to "eat-args")
# «.keymaps»		(to "keymaps")
# «.sixel»		(to "sixel")
# «.kill-if-needed»	(to "kill-if-needed")

# (find-es "emacs" "eat")




#####
#
# Notes from 2022
# 2023dec03
#
#####

# «2022»  (to ".2022")
# (find-epackage-links 'eat "eat" t)
# (find-epackages      'eat)
# (find-epackage       'eat)
# (code-c-d "eat" "~/.emacs.d/elpa/eat-0.9.4/" "eat")
# (find-eatfile "")
# (find-eatnode "")
# (find-eatnode "Colors")
# (find-eatnode "Hello Terminal")
# (find-efunction 'eat)
# (find-efunction 'eat--1)


(eat--1 program arg display-buffer-fn)

(eat--1 "lua5.1" nil '+)
(eat--1 "lua5.1" 1 '+)

# (find-efunction 'eat-semi-char-mode)

# (find-evardescr 'eat--mouse-click-mode-map)
# (find-evardescr 'eat--mouse-modifier-click-mode-map)
# (find-evardescr 'eat--mouse-movement-mode-map)
# (find-evardescr 'eat-char-mode-map)
# (find-evardescr 'eat-eshell-char-mode-map)
# (find-evardescr 'eat-eshell-emacs-mode-map)
# (find-evardescr 'eat-eshell-semi-char-mode-map)
# (find-evardescr 'eat-line-mode-map)
# (find-evardescr 'eat-mode-map)
# (find-evardescr 'eat-semi-char-mode-map)
# (find-evardescr 'eat-trace-replay-mode-map)

# (find-efunction 'eat-self-input)


# (find-ekeymapdescr eat--mouse-click-mode-map)





# https://codeberg.org/akib/emacs-eat/
# https://akib.codeberg.page/blog/introducing-eat.html
# https://www.reddit.com/r/planetemacs/comments/z52uwf/introducing_eat_a_new_terminal_emulator_for_emacs/
# https://codeberg.org/akib/emacs-eat/issues/17
# https://emacsconf.org/2023/talks/eat/

(defun find-eatprocess0 (name program-and-args)
  (let* ((bufname (format "*%s*" name))
         (buffer  (switch-to-buffer bufname)))
    (unless (eq major-mode #'eat-mode)
      (eat-mode))
    (unless eat--process
      (eat-exec buffer "eat" "/usr/bin/env" nil program-and-args))
    (eat-emacs-mode)))

(defun find-eatprocess (program-and-args &optional n)
  (find-eatprocess0
   (format "eat: %s%s"
	   (ee-unsplit program-and-args)
	   (if n (format " (%s)" n) ""))
   (ee-split program-and-args)))

(defun eepitch-line-eat (line)
  "Send LINE to the eat buffer and run the key binding for RET there."
  (eepitch-eval-at-target-window
    `(progn (eat-semi-char-mode)
            (process-send-string eat--process ,(concat line "\n"))))
            (eat-emacs-mode))

(defun eepitch-eat (program-and-args &optional n)
  (interactive)
  (prog1 (eepitch `(find-eatprocess ,program-and-args ,n))
    (setq eepitch-line 'eepitch-line-eat)))





#####
#
# 2024
# 2024mar24
#
#####

# «2024»  (to ".2024")
# (find-eatfile "eat.el" "(defun eat--1 ")
# (find-angg "elisp/eev-eat.el")
# (find-eaproposf "eat.*live")
# (find-eaproposf "eat.*position")
# (find-eaproposf "eat.*insert")

(defun eat--0 (program buffer)
  (with-current-buffer buffer
    (unless (eq major-mode #'eat-mode) (eat-mode))
    (unless (and eat-terminal
                 (eat-term-parameter eat-terminal 'eat--process))
      (eat-exec buffer (buffer-name) "/usr/bin/env" nil
                (list "sh" "-c" program)))
    buffer))


(find-ebuffer (eat--0 "lua5.1" "foo"))


(defun eat--1-buffer (arg)
  (cond ((numberp arg) (get-buffer-create (format "%s<%d>" eat-buffer-name arg)))
	(arg
    (generate-new-buffer eat-buffer-name))
   (t
    (get-buffer-create eat-buffer-name))))


# (find-eapropos "^eat--")

(generate-new-buffer "foo")
(with-current-buffer "foo" 42)





(defun eat--1 (program0 arg display-buffer-fn)
  "Start a new Eat terminal emulator in a buffer.
PROGRAM and ARG is same as in `eat' and `eat-other-window'.
DISPLAY-BUFFER-FN is the function to display the buffer."
  (let ((program (eat--1-program program0))
        (buffer (eat--1-program arg))
         (cond
          ((numberp arg)
           (get-buffer-create (format "%s<%d>" eat-buffer-name arg)))
          (arg
           (generate-new-buffer eat-buffer-name))
          (t
           (get-buffer-create eat-buffer-name)))))
    (with-current-buffer buffer
      (unless (eq major-mode #'eat-mode)
        (eat-mode))
      (funcall display-buffer-fn buffer)
      (unless (and eat-terminal
                   (eat-term-parameter eat-terminal 'eat--process))
        (eat-exec buffer (buffer-name) "/usr/bin/env" nil
                  (list "sh" "-c" program)))
      buffer)))



;; This is similar to:
;;   (find-eev "eepitch.el" "other-terms")
;; but with fewer features... the arguments of `program-and-args' are
;; discarded - only the program name is kept - and we have little
;; control over the name of the buffer - n can only be a number or
;; nil.
;;
(defun find-eatprocess (&optional program-and-args n)
  (let ((prog (if program-and-args
		  (car (ee-split program-and-args))
		(or explicit-shell-file-name
                    (getenv "ESHELL")
                    shell-file-name))))
    (eat--1 prog n 'switch-to-buffer)))

(defun eepitch-eat (&optional program-and-args n)
  (interactive)
  (prog1 (eepitch `(find-eatprocess ,program-and-args ,n))
    (setq eepitch-line 'eepitch-line-eat)))

;; (find-efunction 'eepitch)
;; (find-efunction 'eepitch-prepare)
;; (find-efunction 'eepitch-buffer-create)

(defun eepitch-buffer-create2 ()
  (save-window-excursion
    (eval eepitch-code)
    (setq eepitch-buffer-name
	  (buffer-name (current-buffer)))))

(defun eepitch-prepare2 ()
  (if (not (eepitch-buffer-exists))
      (eepitch-buffer-create2))
  (if (eq (current-buffer) (eepitch-target-buffer))
      (error "Can't pitch to the current buffer"))
  (if (not (eepitch-window-exists))
      (eval eepitch-window-show)))

(defun eepitch2 (code)
  (setq eepitch-code code)
  (setq eepitch-buffer-name "")	; so that `eepitch-buffer-exists' will fail
  (setq eepitch-window-show	; set the way to set up windows to the
      '(eepitch-window-show))   ; default two-window setting
  (setq eepitch-kill		; set the behavior of `eepitch-kill'
      '(eepitch-kill-buffer))   ; to just kill the target buffer
  (setq eepitch-line nil)	; use the default `eepitch-line'
  (eepitch-prepare2)
  (list 'Target: eepitch-buffer-name))	; feedback (for <f8> and `M-e')


* (eepitch-eat "lua5.1")
* (eepitch-kill)
* (eepitch-eat "lua5.1")
* (eepitch2 '(find-eatprocess))



* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)

(find-2a nil '(find-eatprocess "lua5.1"))


)
(find-ansitermprocess "lua5.1")



(find-eatprocess)
(find-eatprocess nil 42)
(find-eatprocess "lua5.1")
(find-eatprocess "lua5.1" 42)


# (find-eaproposf "find.*comint")

(ee-split nil)
(ee-split "a b c")
(ee-split '("a" "b c"))

(require 'eat)

(find-2a nil '(find-eatprocess "lua5.1"))


(eat-term-send-string TERMINAL STRING)

* (eepitch-eat "lua5.1")
* (eepitch-kill)
* (eepitch-eat "lua5.1")
print(1+2)



#####
#
# eat-args
# 2024mar24
#
#####

# «eat-args»  (to ".eat-args")
# (find-efunction 'eat)
# (find-efunction 'eat--1)

(eat)
(eat "lua5.1")
(eat "lua5.1" 42)
(eat--1 nil      nil #'pop-to-buffer-same-window)
(eat--1 nil      42  #'pop-to-buffer-same-window)
(eat--1 "lua5.1" nil #'pop-to-buffer-same-window)
(eat--1 "lua5.1" 42  #'pop-to-buffer-same-window)
(eat--1 "lua5.1" 42  'switch-to-buffer)
(eat--1 program arg #'pop-to-buffer-same-window)



#####
#
# keymaps
# 2024mar24
#
#####

# «keymaps»  (to ".keymaps")
# (find-eatnode "Keyboard")
# (find-eatnode "Input Modes")
# (find-eatnode "Input Modes" "7.1 Semi-char Mode")
# (find-eatnode "Input Modes" "7.2 Char Mode")
# (find-eatnode "Input Modes" "7.3 Emacs Mode")
# (find-eatnode "Input Modes" "7.4 Line Mode")
# (find-eapropos "^eat.*map")
# (find-eaproposv "^eat.*-mode-map")
# (find-evariable    'eat--mouse-click-mode-map)
# (find-ekeymapdescr  eat--mouse-click-mode-map)
# (find-evariable    'eat--mouse-modifier-click-mode-map)
# (find-ekeymapdescr  eat--mouse-modifier-click-mode-map)
# (find-evariable    'eat--mouse-movement-mode-map)
# (find-ekeymapdescr  eat--mouse-movement-mode-map)
# (find-evariable    'eat-char-mode-map)
# (find-ekeymapdescr  eat-char-mode-map)
# (find-evariable    'eat-eshell-char-mode-map)
# (find-ekeymapdescr  eat-eshell-char-mode-map)
# (find-evariable    'eat-eshell-emacs-mode-map)
# (find-ekeymapdescr  eat-eshell-emacs-mode-map)
# (find-evariable    'eat-eshell-semi-char-mode-map)
# (find-ekeymapdescr  eat-eshell-semi-char-mode-map)
# (find-evariable    'eat-line-mode-map)
# (find-ekeymapdescr  eat-line-mode-map)
# (find-evariable    'eat-mode-map)
# (find-ekeymapdescr  eat-mode-map)
# (find-evariable    'eat-semi-char-mode-map)
# (find-ekeymapdescr  eat-semi-char-mode-map)
# (find-evariable    'eat-trace-replay-mode-map)
# (find-ekeymapdescr  eat-trace-replay-mode-map)

# (find-elocus-links "C-c C-e" 'eat-semi-char-mode-map)

# (define-key eat-mode-map           (kbd "M-k") 'ee-kill-this-buffer)
# (define-key eat-mode-map           (kbd "M-k") 'ee-kill-this-buffer)
# (define-key eat-semi-char-mode-map (kbd "M-K") 'bury-buffer)
# (define-key eat-semi-char-mode-map (kbd "M-K") 'bury-buffer)




#####
#
# sixel
# 2024mar24
#
#####

# «sixel»  (to ".sixel")
# (find-eatnode "Sixel")
# (find-es "sixel" "sixel-experiments")





#####
#
# kill-if-needed
# 2024mar25
#
#####

# «kill-if-needed»  (to ".kill-if-needed")

(defun ee-eat-kill-buffer-if-needed (bufname)
  (if (and (get-buffer bufname)
	   (with-current-buffer bufname
	     (or (not (eq major-mode 'eat-mode))
		 (not eat-terminal)
		 (not (eat-term-live-p eat-terminal)))))
      (ee-kill-buffer buffer)))

(defun ee-eat-buffer-kill-needed (bufname)
  (and (get-buffer bufname)
       (with-current-buffer bufname
	 (or (not (eq major-mode 'eat-mode))
	     (not eat-terminal)
	     (not (eat-term-live-p eat-terminal))))))

(find-efunction 'eat--t-ensure-live-term)
(find-efunction 'eat-term-live-p)





#  Local Variables:
#  coding:  utf-8-unix
#  modes:   (fundamental-mode emacs-lisp-mode)
#  End: