Implement Zsh integration

* integration/zsh: New file.
* eat.texi (Shell Integration): Add instructions for Zsh.
* integration/bash: Always return zero on succuss.
This commit is contained in:
Akib Azmain Turja 2023-03-31 00:05:33 +06:00
parent eab01e693b
commit 792a98810e
No known key found for this signature in database
GPG key ID: 5535FCF54D88616B
3 changed files with 99 additions and 5 deletions

View file

@ -374,7 +374,7 @@ Eat. When shell integration is enabled and the script is loaded in
your shell, it'll take care of everything and provide many useful
features.
Currently only GNU Bash is supported.
Currently only GNU Bash and Zsh are supported.
If you use GNU Bash, put the following in your @samp{.bashrc} file:
@ -383,6 +383,13 @@ If you use GNU Bash, put the following in your @samp{.bashrc} file:
source "$EAT_SHELL_INTEGRATION_DIR/bash"
@end example
If you use Zsh, put the following in your @samp{.zshrc} file:
@example
[ -n "$EAT_SHELL_INTEGRATION_DIR" ] && \
source "$EAT_SHELL_INTEGRATION_DIR/zsh"
@end example
@cindex directory tracking
@cindex tracking directory
@cindex working directory tracking

View file

@ -43,8 +43,8 @@ __eat_preexec () {
"$(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/".
# Update title to include the command running.
# "${PWD/$HOME/'~'}" converts "/home/akib/foo/" to "~/foo/".
# The next one is substituted with '$', or '#' if we're "root".
printf '\e]2;%s@%s:%s%s %s\e\\' "$USER" "$HOSTNAME" \
"${PWD/$HOME/'~'}" \
@ -105,10 +105,15 @@ __eat_enable_integration ()
}
# Enable.
test -z "$__eat_integration_enabled" && \
test "${TERM:0:4}" = "eat-" && \
if test -z "$__eat_integration_enabled" && \
test "${TERM:0:4}" = "eat-"
then
__eat_enable_integration
else
true
fi
# Local Variables:
# mode: sh
# sh-shell: bash
# End:

82
integration/zsh Normal file
View file

@ -0,0 +1,82 @@
# integration/bash --- Bash integration
# Copyright (C) 2022 Akib Azmain Turja.
# This file is not part of GNU Emacs.
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# For a full copy of the GNU General Public License
# see <https://www.gnu.org/licenses/>.
__eat_precmd () {
__eat_exit_status="$?"
# 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]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" "$HOST" "${PWD/$HOME/~}" \
"$(test $UID -eq 0 && echo '#' || echo '%')"
}
__eat_preexec () {
__eat_current_command="$1"
# 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 include the command running.
# "${PWD/$HOME/~}" converts "/home/akib/foo/" to "~/foo/".
# The next one is substituted with '%', or '#' if we're "root".
printf '\e]2;%s@%s:%s%s %s\e\\' "$USER" "$HOST" "${PWD/$HOME/~}" \
"$(test $UID -eq 0 && echo '#' || echo '%')" \
"$__eat_current_command"
}
__eat_enable_integration ()
{
__eat_integration_enabled=yes
__eat_current_command=""
__eat_exit_status=0
local __eat_prompt_start="$(printf '\e]51;e;B\e\\')"
local __eat_prompt_end="$(printf '\e]51;e;C\e\\')"
local __eat_continuation_start="$(printf '\e]51;e;D\e\\')"
local __eat_continuation_end="$(printf '\e]51;e;E\e\\')"
PS1="%{$__eat_prompt_start%}$PS1%{$__eat_prompt_end%}"
PS2="%{$__eat_continuation_start%}$PS2%{$__eat_continuation_end%}"
# TODO: What to do about RPS1 and friends?
autoload -Uz add-zsh-hook
add-zsh-hook precmd __eat_precmd
add-zsh-hook preexec __eat_preexec
}
# Enable.
if test -z "$__eat_integration_enabled" && \
test "${TERM:0:4}" = "eat-"
then
__eat_enable_integration
else
true
fi
# Local Variables:
# mode: sh
# sh-shell: zsh
# End: