diff --git a/integration/fish b/integration/fish new file mode 100644 index 0000000..a853064 --- /dev/null +++ b/integration/fish @@ -0,0 +1,95 @@ +# integration/fish --- Fish integration + +# Copyright (C) 2022-2024 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 . + + +# Features missing compared to the bash/zsh integrations: +# - Fish history import into Emacs. +# - The prompt markers are not portable, they depend on a specific prompt customization. +# - The PS2 prompt support (line continuation). + +function eat_enable_integration + set -g __eat_integration_enabled yes + + function __eat_chpwd --on-variable PWD + # Send the current working directory, for directory tracking. + printf '\e]51;e;A;%s;%s\e\\\\' \ + "$(echo -n -- $hostname | base64)" \ + "$(echo -n -- $PWD | base64)" + end + + function __eat_preexec --on-event fish_preexec + set current_command $argv[1] + # Send current command. + printf '\e]51;e;F;%s\e\\\\' \ + "$(echo -n -- $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\e\\\\' "$USER" "$hostname" \ + "$(string replace $HOME '~' $PWD)" \ + "$(fish_is_root_user && echo '#' || echo '$')" \ + "$current_command" + end + + function __eat_postexec --on-event fish_postexec + set exit_status $status + # Send exit status. + printf '\e]51;e;H;%i\e\\\\' $exit_status + + # Inform that a new prompt is going to be printed. + printf '\e]51;e;J\e\\\\' + + # 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" \ + "$(string replace $HOME '~' $PWD)" \ + "$(fish_is_root_user && echo '#' || echo '$')" + end + + # FIXME: These are custom variables for a modified prompt, not native to Fish. + set --global --prepend fish_before_prompt \ + (printf '\e]51;e;B\e\\\\') + set --global --append fish_after_prompt \ + (printf '\e]51;e;C\e\\\\') +end + +function _eat_msg + set msg (printf '\e]51;e;M') + for arg in $argv + set msg $msg "$(echo -n -- $arg | base64)" + end + printf "%s\e\\\\" (string join ";" $msg) +end + +if status is-interactive + and test -z $__eat_integration_enabled + and set -q EAT_SHELL_INTEGRATION_DIR + and string match -q "eat-*" $TERM + + eat_enable_integration +end + +# Local Variables: +# mode: fish +# End: