From 0e1af38de91c0e6f63ea3e88440eff3fc40568c7 Mon Sep 17 00:00:00 2001 From: Akib Azmain Turja <akib@disroot.org> Date: Sat, 7 Oct 2023 15:12:52 +0600 Subject: [PATCH] Support Emacs 27.1 * eat.el: Depend on Emacs 27.1. Require 'compat' and 'term'. * eat.el (eat-term-color-*): Inherit 'term-color-*' in Emacs 27. * eat.el (eat--t-sixel-render-bitmap): Call 'mapconcat' with three arguments. * eat.el (eat-yank-from-kill-ring): Signal error in Emacs 27. * eat.el (eat--eshell-setup-proc-and-term): Don't error if process mark is invalid. * eat.el (eat-eshell-mode): Properly revert 'eshell-variable-aliases-list' when disabling the mode. * eat.el (eat--trace-exec) (eat--trace-eshell-adjust-make-process-args): Make sure 'lisp-data-mode' is defined before calling. --- README.org | 12 ++++++++++-- eat.el | 50 +++++++++++++++++++++++++++++++++++++------------- 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/README.org b/README.org index 15396f9..4776af7 100644 --- a/README.org +++ b/README.org @@ -98,13 +98,21 @@ be accessed with =C-h i m Eat=, also available [[https://elpa.nongnu.org/nongnu- * Installation -Eat requires at least Emacs 28.1 or above. +Eat requires at least Emacs 27.1 or above. ** NonGNU ELPA Eat is available on NonGNU ELPA. So you can just do =M-x package-install RET eat RET=. +If you're on Emacs 27, you'll need to add NonGNU ELPA to your +~package-archives~ by putting the following in your ~init.el~: + +#+begin_src emacs-lisp +(add-to-list 'package-archives + '("nongnu" . "https://elpa.nongnu.org/nongnu/")) +#+end_src + ** Quelpa #+begin_src emacs-lisp @@ -145,7 +153,7 @@ native-compiled Term even without byte-compilation, and when Eat is byte-compiled, Eat is more than three times fast. Also, Term flickers, just try to run =emacs -nw= in it. It doesn't support remote connections, for example over Tramp. However, it's builtin -from the early days of Emacs, while Eat needs atleast Emacs 28.1. +from the early days of Emacs, while Eat needs atleast Emacs 27.1. ** Vterm diff --git a/eat.el b/eat.el index 08127d2..2d69861 100644 --- a/eat.el +++ b/eat.el @@ -5,7 +5,7 @@ ;; Author: Akib Azmain Turja <akib@disroot.org> ;; Created: 2022-08-15 ;; Version: 0.8 -;; Package-Requires: ((emacs "28.1") (compat "29.1")) +;; Package-Requires: ((emacs "27.1") (compat "29.1")) ;; Keywords: terminals processes ;; Homepage: https://codeberg.org/akib/emacs-eat @@ -81,11 +81,13 @@ ;;; Code: +(require 'compat) (require 'subr-x) (require 'cl-lib) (require 'ansi-color) (require 'color) (require 'shell) +(require 'term) (require 'url) ;; Needed by `eat-reload'. @@ -780,7 +782,11 @@ If your process is choking on big inputs, try lowering the value." (dolist (color colors) (let ((face (intern (format "eat-term-color-%i" face-counter)))) (custom-declare-face - face `((t :inherit ,(intern (format "ansi-color-%s" color)))) + face `((t :inherit + ,(intern (format (if (>= emacs-major-version 28) + "ansi-color-%s" + "term-color-%s") + color)))) (format "Face used to render %s color text." color) :group 'eat-term) (put (intern (format "eat-term-color-%s" color)) @@ -790,8 +796,11 @@ If your process is choking on big inputs, try lowering the value." (dolist (color colors) (let ((face (intern (format "eat-term-color-%i" face-counter)))) (custom-declare-face - face `((t :inherit ,(intern (format "ansi-color-bright-%s" - color)))) + face `((t :inherit + ,(intern (format (if (>= emacs-major-version 28) + "ansi-color-bright-%s" + "term-color-%s") + color)))) (format "Face used to render bright %s color text." color) :group 'eat-term) (put (intern (format "eat-term-color-bright-%s" color)) @@ -3086,7 +3095,7 @@ CHAR-SIZE is the width and height of a character." color-key-length) (mapconcat (lambda (line) (format "\"%s\",\n" line)) - color-map) + color-map "") (mapconcat (lambda (row) (format "\"%s\"" (string-join (nreverse row)))) @@ -5610,6 +5619,8 @@ argument COUNT specifies how many times to insert CHARACTER." (prefix-numeric-value current-prefix-arg))) (eat-self-input count character)) +(defvar yank-transform-functions) ; In `simple'. + (defun eat-yank (&optional arg) "Same as `yank', but for Eat. @@ -5630,8 +5641,14 @@ ARG is passed to `yank', which see." "Same as `yank-from-kill-ring', but for Eat. STRING and ARG are passed to `yank-pop', which see." - (interactive (list (read-from-kill-ring "Yank from kill-ring: ") - current-prefix-arg)) + (interactive + (progn + (unless (>= emacs-major-version 28) + (error "`eat-yank-from-kill-ring' requires at least Emacs 28")) + (list (read-from-kill-ring "Yank from kill-ring: ") + current-prefix-arg))) + (unless (>= emacs-major-version 28) + (error "`eat-yank-from-kill-ring' requires at least Emacs 28")) (when eat-terminal (funcall eat--synchronize-scroll-function (eat--synchronize-scroll-windows 'force-selected)) @@ -7182,6 +7199,8 @@ PROGRAM can be a shell command." (defvar eshell-last-output-start) ; In `esh-mode'. (defvar eshell-last-output-end) ; In `esh-mode'. +(defvar eshell-output-filter-functions) ; In `esh-mode'. +(defvar eshell-parent-buffer) ; In `em-term'. (declare-function eshell-head-process "esh-cmd" ()) (declare-function eshell-resume-eval "esh-cmd" ()) @@ -7242,8 +7261,11 @@ PROGRAM can be a shell command." (unless eat-terminal (process-put proc 'adjust-window-size-function #'eat--adjust-process-window-size) - (setq eat-terminal (eat-term-make (current-buffer) - (process-mark proc))) + (setq eat-terminal + (eat-term-make (current-buffer) + (if (marker-buffer (process-mark proc)) + (process-mark proc) + (point-max)))) (set-marker (process-mark proc) (eat-term-end eat-terminal)) (setf (eat-term-parameter eat-terminal 'input-function) #'eat--send-input) @@ -7385,7 +7407,7 @@ modify its argument to change the filter, the sentinel and invoke ('t t) ('ask (not (y-or-n-p "The program stty can't be \ found, input won't be shown if terminal emulation is enabled. \ -Disable terminal emulation?"))) +Disable terminal emulation? "))) ((and (pred functionp) function) (apply function command args))))) (funcall fn command args) @@ -7635,7 +7657,9 @@ symbol `buffer', in which case the point of current buffer is set." (member elem '(("TERM" eat--eshell-term-name t) ("TERMINFO" eat-term-terminfo-directory t) - ("INSIDE_EMACS" eat-term-inside-emacs t)))) + ("INSIDE_EMACS" eat-term-inside-emacs t) + ("EAT_SHELL_INTEGRATION_DIR" + eat-term-shell-integration-directory t)))) eshell-variable-aliases-list)) (advice-remove #'eshell-gather-process-output #'eat--eshell-adjust-make-process-args) @@ -7822,7 +7846,7 @@ FN, `eat-exec', which see." (dolist (var eat--trace-recorded-variables) (push (cons var (symbol-value var)) variables))) (with-current-buffer buf - (lisp-data-mode) + (when (fboundp 'lisp-data-mode) (lisp-data-mode)) (insert ";; -*- mode: lisp-data -*-\n") (eat--trace-log time 'create 'eat width height variables)))))) @@ -7947,7 +7971,7 @@ see." (dolist (var eat--trace-recorded-variables) (push (cons var (symbol-value var)) variables)) (with-current-buffer buf - (lisp-data-mode) + (when (fboundp 'lisp-data-mode) (lisp-data-mode)) (insert ";; -*- lisp-data -*-\n") (eat--trace-log time 'create 'eshell width height variables)))))))))