Skip to content

Commit

Permalink
fix(bash): fix small issues of enter_accept for the plain Bash (#1467)
Browse files Browse the repository at this point in the history
* fix(bash): history should be updated before preexec

* fix(bash): properly execute "--"

With the current implementation, the user command "--" would not be
executed even if it were the intended one.  This is because it would
be confused as an option by the "eval" builtin.  We can specify "--"
to tell "eval" that the later arguments should be literally treated as
the command.

* fix(bash): correctly restore $? and $_

* fix(bash): fix the use of preexec_ret_value

The exit status of preexec_ret_value is used to suppress the execution
of the corresponding command in the extdebug mode.  The current
implementation somehow tries to set $? before the call of stty, which
does not have any effect.  Instead, we can manually turn off the
execution of the user command when the condition matches.

* feat(bash): support array PROMPT_COMMAND of Bash >= 5.1
  • Loading branch information
akinomyoga authored Jan 1, 2024
1 parent 7fe152a commit 1350d3f
Showing 1 changed file with 23 additions and 15 deletions.
38 changes: 23 additions & 15 deletions atuin/src/shell/atuin.bash
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ __atuin_history() {
fi
echo "${PS1@P}$HISTORY"

# Add it to the bash history
history -s "$HISTORY"

# Assuming bash-preexec
# Invoke every function in the preexec array
local preexec_function
Expand All @@ -56,31 +59,36 @@ __atuin_history() {
fi
fi
done
# shellcheck disable=SC2154
__atuin_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command"

# Juggle the terminal settings so that the command can be interacted with
local stty_backup
stty_backup=$(stty -g)
stty "$ATUIN_STTY"
# If extdebug is turned on and any preexec function returns non-zero
# exit status, we do not run the user command.
if ! { shopt -q extdebug && ((preexec_ret_value)); }; then
# Juggle the terminal settings so that the command can be interacted with
local stty_backup
stty_backup=$(stty -g)
stty "$ATUIN_STTY"

eval "$HISTORY"
exit_status=$?
# Execute the command. Note: We need to record $? and $_ after the
# user command within the same call of "eval" because $_ is otherwise
# overwritten by the last argument of "eval".
__atuin_set_ret_value "${__bp_last_ret_value-}" "${__bp_last_argument_prev_command-}"
eval -- "$HISTORY"$'\n__bp_last_ret_value=$? __bp_last_argument_prev_command=$_'

stty "$stty_backup"
stty "$stty_backup"
fi

# Execute preprompt commands
__atuin_set_ret_value "$exit_status" "$HISTORY"
eval "$PROMPT_COMMAND"
# Add it to the bash history
history -s "$HISTORY"
local __atuin_prompt_command
for __atuin_prompt_command in "${PROMPT_COMMAND[@]}"; do
__atuin_set_ret_value "${__bp_last_ret_value-}" "${__bp_last_argument_prev_command-}"
eval -- "$__atuin_prompt_command"
done
# Bash will redraw only the line with the prompt after we finish,
# so to work for a multiline prompt we need to print it ourselves,
# then move up a line
__atuin_set_ret_value "$exit_status" "$HISTORY"
__atuin_set_ret_value "${__bp_last_ret_value-}" "${__bp_last_argument_prev_command-}"
echo "${PS1@P}"
tput cuu 1
__atuin_set_ret_value "$exit_status" "$HISTORY"
fi

READLINE_LINE=""
Expand Down

1 comment on commit 1350d3f

@vercel
Copy link

@vercel vercel bot commented on 1350d3f Jan 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

atuin-docs – ./

atuin-docs-atuin.vercel.app
atuin-docs-git-main-atuin.vercel.app
atuin-docs.vercel.app

Please sign in to comment.