fix(bash): work around bash < 4 and introduce initialization guards (#1533)

* fix(bash): add a guard for interactive shells

* fix(bash): add a guard for the Bash version

* fix(bash): localize READLINE_LINE in bash < 4

In bash < 4, the variables READLINE_LINE and READLINE_POINT are not
supported for the shell commands called by `bind -x`.  Even if it is
not supported, atuin works in not a bad way.  However, this sometimes
causes a strange behavior by the remaining values of READLINE_LINE set
in the previous calls of __atuin_history.  In bash < 4, we can
consistently use an empty string instead of $READLINE_LINE, and the
changes to READLINE_LINE and READLINE_POINT should be localized within
the function.

* fix(bash): add guard for double initialization

In bash, it is customary to reload the settings by sourcing `.bashrc`
again after modifying it.  In such a case, `eval "$(atuin init bash)"`
is executed again.  This registers duplicate hooks to
`preexec_functions` and `precmd_functions`.  To prevent this in this
patch, we introduce an include guard, so that the initialization is
not performed more than once.
This commit is contained in:
Koichi Murase 2024-01-10 23:11:12 +09:00 committed by GitHub
parent 6dda16d047
commit a7bed61461
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 0 deletions

View File

@ -265,6 +265,8 @@ antigen bundle atuinsh/atuin@main
### bash
Atuin works in `bash >= 3.1`, but we recommend to use Atuin with the recent versions of `bash >= 5`.
#### [ble.sh](https://github.com/akinomyoga/ble.sh)
Atuin works best in bash when using [ble.sh](https://github.com/akinomyoga/ble.sh) >= 0.4.
@ -298,6 +300,8 @@ echo 'eval "$(atuin init bash)"' >> ~/.bashrc
bash-preexec currently has an issue where it will stop honoring `ignorespace`. While Atuin will ignore commands prefixed with whitespace, they may still end up in your bash history. Please check your configuration! All other shells do not have this issue.
To use Atuin in `bash < 4` with bash-preexec, the option `enter_accept` needs to be turned on (which is so by default).
### fish
Add

View File

@ -1,3 +1,16 @@
# Include guard
[[ ${__atuin_initialized-} == true ]] && return 0
__atuin_initialized=true
# Enable only in interactive shells
[[ $- == *i* ]] || return 0
# Require bash >= 3.1
if ((BASH_VERSINFO[0] < 3 || BASH_VERSINFO[0] == 3 && BASH_VERSINFO[1] < 1)); then
[[ -t 2 ]] && printf 'atuin: requires bash >= 3.1 for the integration.\n' >&2
return 0
fi
ATUIN_SESSION=$(atuin uuid)
ATUIN_STTY=$(stty -g)
export ATUIN_SESSION
@ -154,6 +167,12 @@ __atuin_history() {
fi
fi
# READLINE_LINE and READLINE_POINT are only supported by bash >= 4.0 or
# ble.sh. When it is not supported, we localize them to suppress strange
# behaviors.
[[ ${BLE_ATTACHED-} ]] || ((BASH_VERSINFO[0] >= 4)) ||
local READLINE_LINE="" READLINE_POINT=0
local __atuin_output
__atuin_output=$(ATUIN_SHELL_BASH=t ATUIN_LOG=error atuin search "$@" -i -- "$READLINE_LINE" 3>&1 1>&2 2>&3)