[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/eat 9caa496e45 1/9: Tighter shell integration
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/eat 9caa496e45 1/9: Tighter shell integration |
Date: |
Tue, 6 Dec 2022 13:58:45 -0500 (EST) |
branch: elpa/eat
commit 9caa496e454aea4193df2a3638309dd0ddb205ea
Author: Akib Azmain Turja <akib@disroot.org>
Commit: Akib Azmain Turja <akib@disroot.org>
Tighter shell integration
* eat.el (eat--t-term): New slots: 'prompt-start-fn',
'prompt-end-fn', 'cont-prompt-start-fn', 'cont-prompt-end-fn',
'set-cmd-fn', 'cmd-start-fn', 'cmd-finish-fn'
* eat.el (eat--t-set-cwd): Accept three arguments in two
different formats.
* eat.el (eat--t-prompt-start, eat--t-prompt-end)
(eat--t-cont-prompt-start, eat--t-cont-prompt-end)
(eat--t-set-cmd, eat--t-cmd-start, eat--t-cmd-finish): New
function.
* eat.el (eat--t-handle-output): Accept Eat's own
OSC 51 ; e ; ... ST sequences.
* eat.el (eat-term-prompt-start-function)
(eat-term-prompt-end-function)
(eat-term-continuation-prompt-start-function)
(eat-term-continuation-prompt-end-function)
(eat-term-set-cmd-function, eat-term-cmd-start-function)
(eat-term-cmd-finish-function): New generalized variable.
* integration/bash (__eat_current_command, __eat_exit_status):
New variable.
* integration/bash (__eat_prompt_command): Send exit status of
last command, if applicable. Use Eat specific sequence to
report working directory. Set title.
* integration/bash (__eat_preexec): Report current command and
execution start.
* integration/bash (__eat_before_prompt_command): Set
'__eat_exit_status' to the exit status of the last command.
* integration/bash (__eat_prompt_start, __eat_prompt_end)
(__eat_continuation_start, __eat_continuation_end): New
variable, used as constant only to make the code more readable.
* integration/bash (__eat_enable_integration): Wrap 'PS1' and
'PS2'. Don't set title from 'PS1'.
---
eat.el | 416 ++++++++++++++++++++++++++++++++++++++++++-------------
integration/bash | 39 +++++-
2 files changed, 351 insertions(+), 104 deletions(-)
diff --git a/eat.el b/eat.el
index 6eaacf328c..249ee93e1d 100644
--- a/eat.el
+++ b/eat.el
@@ -689,18 +689,39 @@ For example: when THRESHOLD is 3, \"*foobarbaz\" is
converted to
(manipulate-selection-fn
(1value #'ignore)
:documentation "Function to manipulate selection.")
+ (grab-mouse-fn
+ (1value #'ignore)
+ :documentation "Function to grab mouse.")
+ (set-focus-ev-mode-fn
+ (1value #'ignore)
+ :documentation "Function to set focus event mode.")
(set-title-fn
(1value #'ignore)
- :documentation "Function to set title.")
+ :documentation "Function to set the title.")
(set-cwd-fn
(1value #'ignore)
:documentation "Function to set the current working directory.")
- (grab-mouse-fn
+ (prompt-start-fn
(1value #'ignore)
- :documentation "Function to grab mouse.")
- (set-focus-ev-mode-fn
+ :documentation "Function to call when prompt starts.")
+ (prompt-end-fn
(1value #'ignore)
- :documentation "Function to set focus event mode.")
+ :documentation "Function to call when prompt ends.")
+ (cont-prompt-start-fn
+ (1value #'ignore)
+ :documentation "Function to call when prompt starts.")
+ (cont-prompt-end-fn
+ (1value #'ignore)
+ :documentation "Function to call when prompt ends.")
+ (set-cmd-fn
+ (1value #'ignore)
+ :documentation "Function to set the command being executed.")
+ (cmd-start-fn
+ (1value #'ignore)
+ :documentation "Function to call just before a command is run.")
+ (cmd-finish-fn
+ (1value #'ignore)
+ :documentation "Function to call after a command has finished.")
(parser-state nil :documentation "State of parser.")
(scroll-begin 1 :documentation "First line of scroll region.")
(scroll-end 24 :documentation "Last line of scroll region.")
@@ -2222,23 +2243,38 @@ MODE should be one of nil and `x10', `normal',
`button-event',
;; Inform the UI.
(funcall (eat--t-term-set-title-fn eat--t-term) eat--t-term title))
-(defun eat--t-set-cwd (url)
+(defun eat--t-set-cwd (format host path)
"Set the working directory of terminal to URL.
-URL should be a URL in the format \"file://HOST/CWD/\"; HOST can be
-empty."
- (let ((obj (url-generic-parse-url url)))
- (when (and (string= (url-type obj) "file")
- (or (null (url-host obj))
- (string= (url-host obj) (system-name))))
- (let ((dir (expand-file-name
- (file-name-as-directory
- (url-unhex-string (url-filename obj))))))
- ;; Update working directory.
- (setf (eat--t-term-cwd eat--t-term) dir)
- ;; Inform the UI.
- (funcall (eat--t-term-set-cwd-fn eat--t-term)
- eat--t-term dir)))))
+If FORMAT is `base64', HOST should be base64 encoded hostname and PATH
+should be base64 encoded working directory path.
+
+If FORMAT is `url', HOST should be nil and PATH should be an URL in
+the format \"file://HOST/CWD/\"; HOST can be empty."
+ (pcase-exhaustive format
+ ('base64
+ (let ((dir (ignore-errors (expand-file-name
+ (file-name-as-directory
+ (base64-decode-string path)))))
+ (hostname (ignore-errors (base64-decode-string host))))
+ (when (and dir hostname)
+ ;; Update working directory.
+ (setf (eat--t-term-cwd eat--t-term) (cons hostname dir))
+ ;; Inform the UI.
+ (funcall (eat--t-term-set-cwd-fn eat--t-term)
+ eat--t-term hostname dir))))
+ ('url
+ (let ((url (url-generic-parse-url path)))
+ (when (string= (url-type url) "file")
+ (let ((host (url-host url))
+ (dir (expand-file-name
+ (file-name-as-directory
+ (url-unhex-string (url-filename url))))))
+ ;; Update working directory.
+ (setf (eat--t-term-cwd eat--t-term) (cons host dir))
+ ;; Inform the UI.
+ (funcall (eat--t-term-set-cwd-fn eat--t-term)
+ eat--t-term host dir)))))))
(defun eat--t-send-device-attrs (params format)
"Return device attributes.
@@ -2355,6 +2391,38 @@ DATA is the selection data encoded in base64."
(aset (eat--t-term-cut-buffers eat--t-term) (- i ?0)
str)))))))
+(defun eat--t-prompt-start ()
+ "Call shell prompt start hook."
+ (funcall (eat--t-term-prompt-start-fn eat--t-term) eat--t-term))
+
+(defun eat--t-prompt-end ()
+ "Call shell prompt end hook."
+ (funcall (eat--t-term-prompt-end-fn eat--t-term) eat--t-term))
+
+(defun eat--t-cont-prompt-start ()
+ "Call shell prompt start hook."
+ (funcall (eat--t-term-cont-prompt-start-fn eat--t-term)
+ eat--t-term))
+
+(defun eat--t-cont-prompt-end ()
+ "Call shell prompt end hook."
+ (funcall (eat--t-term-cont-prompt-end-fn eat--t-term) eat--t-term))
+
+(defun eat--t-set-cmd (cmd)
+ "Set the command being executed to CMD."
+ (let ((c (ignore-errors (base64-decode-string cmd))))
+ (when c
+ (funcall (eat--t-term-set-cmd-fn eat--t-term) eat--t-term c))))
+
+(defun eat--t-cmd-start ()
+ "Call shell command start hook."
+ (funcall (eat--t-term-cmd-start-fn eat--t-term) eat--t-term))
+
+(defun eat--t-cmd-finish (status)
+ "Call shell command finish hook with exit status STATUS."
+ (funcall (eat--t-term-cmd-finish-fn eat--t-term) eat--t-term
+ status))
+
(defun eat--t-set-modes (params format)
"Set modes according to PARAMS in format FORMAT."
;; Dispatch the request to appropriate function.
@@ -2756,20 +2824,58 @@ DATA is the selection data encoded in base64."
((rx string-start ?7 ?\;
(let url (zero-or-more anything))
string-end)
- (eat--t-set-cwd url))
- ;; OSC 10 ; ? ST.
+ (eat--t-set-cwd 'url nil url))
+ ;; OSC 1 0 ; ? ST.
("10;?"
(eat--t-report-foreground-color))
- ;; OSC 11 ; ? ST.
+ ;; OSC 1 1 ; ? ST.
("11;?"
(eat--t-report-background-color))
- ;; OSC 52 ; <t> ; <s> ST.
+ ;; In XTerm, OSC 51 is reserved for Emacs shell.
+ ;; I have no idea why, but Vterm uses this OSC
+ ;; to set the current directory and remotely
+ ;; execute Emacs Lisp code. Vterm uses the
+ ;; characters 'A' and 'E' as the first character
+ ;; of second parameter of this OSC. We use 'e'
+ ;; as the second parameter, followed by one or
+ ;; more parameters.
+ ;; OSC 5 1 ; e ; A ; <t> ; <s> ST
+ ((rx string-start "51;e;A;"
+ (let host (zero-or-more (not ?\;)))
+ ?\; (let path (zero-or-more anything))
+ string-end)
+ (eat--t-set-cwd 'base64 host path))
+ ;; OSC 5 1 ; e ; B ST
+ ("51;e;B"
+ (eat--t-prompt-start))
+ ;; OSC 5 1 ; e ; C ST
+ ("51;e;C"
+ (eat--t-prompt-end))
+ ;; OSC 5 1 ; e ; D ST
+ ("51;e;D"
+ (eat--t-cont-prompt-start))
+ ;; OSC 5 1 ; e ; E ST
+ ("51;e;E"
+ (eat--t-cont-prompt-end))
+ ;; OSC 5 1 ; e ; F ; <t> ST
+ ((rx string-start "51;e;F;"
+ (let cmd (zero-or-more anything))
+ string-end)
+ (eat--t-set-cmd cmd))
+ ;; OSC 5 1 ; e ; G ST
+ ("51;e;G"
+ (eat--t-cmd-start))
+ ;; OSC 5 1 ; e ; H ; <n> ST
+ ((rx string-start "51;e;H;"
+ (let status (one-or-more digit))
+ string-end)
+ (eat--t-cmd-finish (string-to-number status)))
+ ;; OSC 5 2 ; <t> ; <s> ST.
((rx string-start "52;"
(let targets
(zero-or-more (any ?c ?p ?q ?s
(?0 . ?9))))
- ";"
- (let data (zero-or-more anything))
+ ?\; (let data (zero-or-more anything))
string-end)
(eat--t-manipulate-selection
targets data))))))))))
@@ -3009,42 +3115,6 @@ FUNCTION), where FUNCTION is the function to set cursor."
(gv-define-setter eat-term-set-cursor-function (function terminal)
`(setf (eat--t-term-set-cursor-fn ,terminal) ,function))
-(defun eat-term-title (terminal)
- "Return the current title of TERMINAL."
- (eat--t-term-title terminal))
-
-(defun eat-term-set-title-function (terminal)
- "Return the function used to set the title of TERMINAL.
-
-The function is called with two arguments, TERMINAL and the new title
-of TERMINAL. The function should not change point and buffer
-restriction.
-
-To set it, use (`setf' (`eat-term-set-title-function' TERMINAL)
-FUNCTION), where FUNCTION is the function to set title."
- (eat--t-term-set-title-fn terminal))
-
-(gv-define-setter eat-term-set-title-function (function terminal)
- `(setf (eat--t-term-set-title-fn ,terminal) ,function))
-
-(defun eat-term-cwd (terminal)
- "Return the current working directory of TERMINAL."
- (eat--t-term-cwd terminal))
-
-(defun eat-term-set-cwd-function (terminal)
- "Return the function used to set the working directory of TERMINAL.
-
-The function is called with two arguments, TERMINAL and the new
-\(current) working directory of TERMINAL. The function should not
-change point and buffer restriction.
-
-To set it, use (`setf' (`eat-term-set-cwd-function' TERMINAL)
-FUNCTION), where FUNCTION is the function to set title."
- (eat--t-term-set-cwd-fn terminal))
-
-(gv-define-setter eat-term-set-cwd-function (function terminal)
- `(setf (eat--t-term-set-cwd-fn ,terminal) ,function))
-
(defun eat-term-grab-mouse-function (terminal)
"Return the function used to grab the mouse.
@@ -3113,7 +3183,8 @@ selection."
(defun eat-term-ring-bell-function (terminal)
"Return the function used to ring the bell.
-The function is called with a single argument TERMINAL.
+The function is called with a single argument TERMINAL. The function
+should not change point and buffer restriction.
To set it, use (`setf' (`eat-term-ring-bell-function' TERMINAL)
FUNCTION), where FUNCTION is the function to ring the bell."
@@ -3122,6 +3193,150 @@ FUNCTION), where FUNCTION is the function to ring the
bell."
(gv-define-setter eat-term-ring-bell-function (function terminal)
`(setf (eat--t-term-bell-fn ,terminal) ,function))
+(defun eat-term-title (terminal)
+ "Return the current title of TERMINAL."
+ (eat--t-term-title terminal))
+
+(defun eat-term-set-title-function (terminal)
+ "Return the function used to set the title of TERMINAL.
+
+The function is called with two arguments, TERMINAL and the new title
+of TERMINAL. The function should not change point and buffer
+restriction.
+
+Note that the client is responsible for the arguments to the function,
+verify them before using.
+
+To set it, use (`setf' (`eat-term-set-title-function' TERMINAL)
+FUNCTION), where FUNCTION is the function to set title."
+ (eat--t-term-set-title-fn terminal))
+
+(gv-define-setter eat-term-set-title-function (function terminal)
+ `(setf (eat--t-term-set-title-fn ,terminal) ,function))
+
+(defun eat-term-cwd (terminal)
+ "Return the current working directory of TERMINAL with the hostname.
+
+The return value is of form (HOST . PATH), where HOST is the hostname
+and PATH is the working directory."
+ (eat--t-term-cwd terminal))
+
+(defun eat-term-set-cwd-function (terminal)
+ "Return the function used to set the working directory of TERMINAL.
+
+The function is called with three arguments, TERMINAL, the host where
+the directory is, and the new (current) working directory of TERMINAL.
+The function should not change point and buffer restriction.
+
+Note that the client is responsible for the arguments to the function,
+verify them before using.
+
+To set it, use (`setf' (`eat-term-set-cwd-function' TERMINAL)
+FUNCTION), where FUNCTION is the function to set the current working
+directory."
+ (eat--t-term-set-cwd-fn terminal))
+
+(gv-define-setter eat-term-set-cwd-function (function terminal)
+ `(setf (eat--t-term-set-cwd-fn ,terminal) ,function))
+
+(defun eat-term-prompt-start-function (terminal)
+ "Return the function called just before shell prompt.
+
+The function is called with with a single argument, TERMINAL. The
+function should not change point and buffer restriction.
+
+To set it, use (`setf' (`eat-term-prompt-start-function' TERMINAL)
+FUNCTION), where FUNCTION is the function to call."
+ (eat--t-term-prompt-start-fn terminal))
+
+(gv-define-setter eat-term-prompt-start-function (function terminal)
+ `(setf (eat--t-term-prompt-start-fn ,terminal) ,function))
+
+(defun eat-term-prompt-end-function (terminal)
+ "Return the function called just after shell prompt.
+
+The function is called with with a single argument, TERMINAL. The
+function should not change point and buffer restriction.
+
+To set it, use (`setf' (`eat-term-prompt-end-function' TERMINAL)
+FUNCTION), where FUNCTION is the function to call."
+ (eat--t-term-prompt-end-fn terminal))
+
+(gv-define-setter eat-term-prompt-end-function (function terminal)
+ `(setf (eat--t-term-prompt-end-fn ,terminal) ,function))
+
+(defun eat-term-continuation-prompt-start-function (terminal)
+ "Return the function called just before shell continuation prompt.
+
+The function is called with with a single argument, TERMINAL. The
+function should not change point and buffer restriction.
+
+To set it, use (`setf' (`eat-term-continuation-prompt-start-function'
+TERMINAL) FUNCTION), where FUNCTION is the function to call."
+ (eat--t-term-cont-prompt-start-fn terminal))
+
+(gv-define-setter eat-term-continuation-prompt-start-function
+ (function terminal)
+ `(setf (eat--t-term-cont-prompt-start-fn ,terminal) ,function))
+
+(defun eat-term-continuation-prompt-end-function (terminal)
+ "Return the function called just after shell continuation prompt.
+
+The function is called with with a single argument, TERMINAL. The
+function should not change point and buffer restriction.
+
+To set it, use (`setf' (`eat-term-continuation-prompt-end-function'
+TERMINAL) FUNCTION), where FUNCTION is the function to call."
+ (eat--t-term-cont-prompt-end-fn terminal))
+
+(gv-define-setter eat-term-continuation-prompt-end-function
+ (function terminal)
+ `(setf (eat--t-term-cont-prompt-end-fn ,terminal) ,function))
+
+(defun eat-term-set-cmd-function (terminal)
+ "Return the function used to set the command being run in TERMINAL.
+
+The function is called with two arguments, TERMINAL, the host where
+the directory is, and the new (current) working directory of TERMINAL.
+The function should not change point and buffer restriction.
+
+Note that the client is responsible for the arguments to the function,
+verify them before using.
+
+To set it, use (`setf' (`eat-term-set-cwd-function' TERMINAL)
+FUNCTION), where FUNCTION is the function to set the command."
+ (eat--t-term-set-cmd-fn terminal))
+
+(gv-define-setter eat-term-set-cmd-function (function terminal)
+ `(setf (eat--t-term-set-cmd-fn ,terminal) ,function))
+
+(defun eat-term-cmd-start-function (terminal)
+ "Return the function called just before a command is run in shell.
+
+The function is called with with a single argument, TERMINAL. The
+function should not change point and buffer restriction.
+
+To set it, use (`setf' (`eat-term-cmd-start-function' TERMINAL)
+FUNCTION), where FUNCTION is the function to call."
+ (eat--t-term-cmd-start-fn terminal))
+
+(gv-define-setter eat-term-cmd-start-function (function terminal)
+ `(setf (eat--t-term-cmd-start-fn ,terminal) ,function))
+
+(defun eat-term-cmd-finish-function (terminal)
+ "Return the function called after a command has finished in shell.
+
+The function is called with with a two arguments, TERMINAL and the
+exit status of the command. The function should not change point and
+buffer restriction.
+
+To set it, use (`setf' (`eat-term-cmd-finish-function' TERMINAL)
+FUNCTION), where FUNCTION is the function to call."
+ (eat--t-term-cmd-finish-fn terminal))
+
+(gv-define-setter eat-term-cmd-finish-function (function terminal)
+ `(setf (eat--t-term-cmd-finish-fn ,terminal) ,function))
+
(defun eat-term-size (terminal)
"Return the size of TERMINAL as (WIDTH . HEIGHT)."
(let ((disp (eat--t-term-display terminal)))
@@ -3898,13 +4113,13 @@ return \"eat-color\", otherwise return \"eat-mono\"."
(defun eat--set-cursor (_ state)
"Set cursor type according to STATE.
- STATE can be one of the following:
+STATE can be one of the following:
- `:default' Default cursor.
- `:invisible' Invisible cursor.
- `:very-visible' Very visible cursor. Can also be implemented
- as blinking cursor.
- Any other value Default cursor."
+`:default' Default cursor.
+`:invisible' Invisible cursor.
+`:very-visible' Very visible cursor. Can also be implemented as
+ blinking cursor.
+Any other value Default cursor."
(setq-local eat--cursor-blink-type
(pcase state
(:invisible eat-invisible-cursor-type)
@@ -3913,6 +4128,37 @@ return \"eat-color\", otherwise return \"eat-mono\"."
cursor-type (car eat--cursor-blink-type))
(eat--cursor-blink-mode (if (cadr eat--cursor-blink-type) +1 -1)))
+(defun eat--manipulate-kill-ring (_ selection data)
+ "Manipulate `kill-ring'.
+
+SELECTION can be one of `:clipboard', `:primary', `:secondary',
+`:select'. When DATA is a string, set the selection to that string,
+when DATA is nil, unset the selection, and when DATA is t, return the
+selection, or nil if none."
+ (let ((inhibit-eol-conversion t)
+ (select-enable-clipboard (eq selection :clipboard))
+ (select-enable-primary (eq selection :primary)))
+ (pcase-exhaustive data
+ ('t
+ (when eat-enable-yank-to-terminal
+ (ignore-error error
+ (current-kill 0 'do-not-move))))
+ ((and (pred stringp) str)
+ (when eat-enable-kill-from-terminal
+ (kill-new str))))))
+
+(defun eat--bell (_)
+ "Ring the bell."
+ (ding t))
+
+(defun eat--set-cwd (_ host cwd)
+ "Set CWD as the current working directory (`default-directory').
+
+If HOST isn't the host Emacs is running on, don't do anything."
+ (when (and eat-enable-directory-tracking
+ (string= host (system-name)))
+ (ignore-errors
+ (cd-absolute cwd))))
;;;;; Input.
@@ -4248,35 +4494,6 @@ MODE should one of:
(eat--mouse-modifier-click-mode -1)
(eat--mouse-movement-mode -1))))
-(defun eat--manipulate-kill-ring (_ selection data)
- "Manipulate `kill-ring'.
-
-SELECTION can be one of `:clipboard', `:primary', `:secondary',
-`:select'. When DATA is a string, set the selection to that string,
-when DATA is nil, unset the selection, and when DATA is t, return the
-selection, or nil if none."
- (let ((inhibit-eol-conversion t)
- (select-enable-clipboard (eq selection :clipboard))
- (select-enable-primary (eq selection :primary)))
- (pcase-exhaustive data
- ('t
- (when eat-enable-yank-to-terminal
- (ignore-error error
- (current-kill 0 'do-not-move))))
- ((and (pred stringp) str)
- (when eat-enable-kill-from-terminal
- (kill-new str))))))
-
-(defun eat--bell (_)
- "Ring the bell."
- (ding t))
-
-(defun eat--set-cwd (_ cwd)
- "Set CWD as the current working directory (`default-directory')."
- (when eat-enable-directory-tracking
- (ignore-errors
- (cd-absolute cwd))))
-
;;;;; Major Mode.
@@ -4329,7 +4546,8 @@ END if it's safe to do so."
eat--output-queue-first-chunk-time
eat--process-output-queue-timer))
;; This is intended; input methods don't work on read-only buffers.
- (setq buffer-read-only nil buffer-undo-list t
+ (setq buffer-read-only nil
+ buffer-undo-list t
eat--synchronize-scroll-function #'eat--synchronize-scroll
filter-buffer-substring-function
#'eat--filter-buffer-substring
diff --git a/integration/bash b/integration/bash
index 1c2a5c379d..41b530136b 100644
--- a/integration/bash
+++ b/integration/bash
@@ -17,26 +17,49 @@
# For a full copy of the GNU General Public License
# see <https://www.gnu.org/licenses/>.
+__eat_current_command=""
+__eat_exit_status=0
+
__eat_prompt_command () {
+ # Send exit status.
+ if test -n "$__eat_current_command"
+ then
+ printf '\e]51;e;H;%i\e\\' "$__eat_exit_status"
+ fi
+ __eat_current_command=""
# Send the current working directory, for directory tracking.
- printf '\e]7;file://%s%s\e\\' "$HOSTNAME" "$PWD"
+ printf '\e]51;e;A;%s;%s\e\\' "$(printf "%s" "$HOSTNAME" | base64)" \
+ "$(printf "%s" "$PWD" | base64)"
+ # Update title.
+ # "${PWD/$HOME/'~'}" converts "/home/akib/org/" to "~/org/".
+ # The next one is substituted with '$', or '#' if we're "root".
+ printf '\e]2;%s@%s:%s%s\e\\' "$USER" "$HOSTNAME" \
+ "${PWD/$HOME/'~'}" \
+ "$(test $UID -eq 0 && echo '#' || echo '$')"
}
__eat_preexec () {
+ # Get the real command typed by the user from the history.
+ __eat_current_command="$(history 1 | sed 's/ *[0-9]* *//')"
+ # Send current command.
+ printf '\e]51;e;F;%s\e\\' \
+ "$(printf "%s" "$__eat_current_command" | base64)"
+ # Send pre-exec sequence.
+ printf '\e]51;e;G\e\\'
+ # Update title to including the command running.
# "${PWD/$HOME/'~'}" converts "/home/akib/org/" to "~/org/".
# The next one is substituted with '$', or '#' if we're "root".
- # The final one gets the real command typed by the user from the
- # history.
printf '\e]2;%s@%s:%s%s %s\e\\' "$USER" "$HOSTNAME" \
"${PWD/$HOME/'~'}" \
"$(test $UID -eq 0 && echo '#' || echo '$')" \
- "$(history 1 | sed 's/ *[0-9]* *//')"
+ "$__eat_current_command"
}
__eat_inhibit_preexec=yes
__eat_before_prompt_command ()
{
+ __eat_exit_status="$?"
__eat_inhibit_preexec=yes
}
@@ -54,10 +77,16 @@ __eat_before_exec () {
fi
}
+__eat_prompt_start='\e]51;e;B\e\\'
+__eat_prompt_end='\e]51;e;C\e\\'
+__eat_continuation_start='\e]51;e;D\e\\'
+__eat_continuation_end='\e]51;e;E\e\\'
+
__eat_enable_integration ()
{
__eat_integration_enabled=yes
- PS1='\[\e]2;\u@\h:\w$\e\\\]'"$PS1"
+ PS1="\[$__eat_prompt_start\]$PS1\[$__eat_prompt_end\]"
+ PS2="\[$__eat_continuation_start\]$PS2\[$__eat_continuation_end\]"
PROMPT_COMMAND+=(__eat_prompt_command)
trap '__eat_before_exec' DEBUG
# Wrap 'PROMPT_COMMAND' to avoid it getting trapped in 'DEBUG' trap.
- [nongnu] elpa/eat updated (d35864ca6b -> 693940c733), ELPA Syncer, 2022/12/06
- [nongnu] elpa/eat 693940c733 9/9: * README.org: Add shell integration instructions, ELPA Syncer, 2022/12/06
- [nongnu] elpa/eat 8188f71562 8/9: * eat-tests.el (eat-test-set-cwd): Update test, ELPA Syncer, 2022/12/06
- [nongnu] elpa/eat 62a09caef1 7/9: * eat.el (eat--t-term): Fix initial value of 'cwd', ELPA Syncer, 2022/12/06
- [nongnu] elpa/eat a04999011f 3/9: Annotate shell prompts, ELPA Syncer, 2022/12/06
- [nongnu] elpa/eat e287487b42 6/9: Document everything about shell integration, ELPA Syncer, 2022/12/06
- [nongnu] elpa/eat 2c6afa4dc0 4/9: Add shell prompt navigation commands, ELPA Syncer, 2022/12/06
- [nongnu] elpa/eat 9caa496e45 1/9: Tighter shell integration,
ELPA Syncer <=
- [nongnu] elpa/eat b42687f146 5/9: Fix prompt navigation when annotation is disabled, ELPA Syncer, 2022/12/06
- [nongnu] elpa/eat b4d07cb474 2/9: Add shell commands run in Eat to Emacs history, ELPA Syncer, 2022/12/06