emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/eat 792a98810e: Implement Zsh integration


From: ELPA Syncer
Subject: [nongnu] elpa/eat 792a98810e: Implement Zsh integration
Date: Thu, 30 Mar 2023 15:00:27 -0400 (EDT)

branch: elpa/eat
commit 792a98810e4e43596cc720d546bf5447c2582632
Author: Akib Azmain Turja <akib@disroot.org>
Commit: Akib Azmain Turja <akib@disroot.org>

    Implement Zsh integration
    
    * integration/zsh: New file.
    * eat.texi (Shell Integration): Add instructions for Zsh.
    * integration/bash: Always return zero on succuss.
---
 eat.texi         |  9 ++++++-
 integration/bash | 13 ++++++---
 integration/zsh  | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 99 insertions(+), 5 deletions(-)

diff --git a/eat.texi b/eat.texi
index 83e753a54f..7ee67bda30 100644
--- a/eat.texi
+++ b/eat.texi
@@ -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
diff --git a/integration/bash b/integration/bash
index 56a4129cbd..bfe18edae2 100644
--- a/integration/bash
+++ b/integration/bash
@@ -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:
diff --git a/integration/zsh b/integration/zsh
new file mode 100644
index 0000000000..64e106e1d6
--- /dev/null
+++ b/integration/zsh
@@ -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:



reply via email to

[Prev in Thread] Current Thread [Next in Thread]