T34: review round 2: bash 3.2 drops its DEBUG trap, which ran for key bindings, missed lone subshells and decided commands under extdebug, so it sends no C, and its D comes from the prompt by the command number; PowerShell takes a program's code only when the line's last pipeline ends in it, as its syntax tree and Get-Command name it; each check waits for the prompt before its line, so a repeated status is the line's own
This commit is contained in:
6 files changed
+89
-45
No files matched your search
@@ -13,37 +13,19 @@ else
|
||||
[ -r ~/.bashrc ] && builtin source ~/.bashrc
|
||||
fi
|
||||
_ely_ran=
|
||||
_ely_sent=
|
||||
_ely_n=0
|
||||
_ely_armed=
|
||||
_ely_ps0=
|
||||
if (( BASH_VERSINFO[0] * 100 + BASH_VERSINFO[1] >= 404 )); then
|
||||
# PS0 runs in the shell, so its subscript can note that a command ran.
|
||||
_ely_ps0='${_ely_note[_ely_ran=1]-}\e]133;C\a'
|
||||
else
|
||||
# bash 3.2 has no PS0: the DEBUG trap sends C, then runs the user's own trap with $? and $_ kept.
|
||||
_ely_debug() {
|
||||
builtin local status=$?
|
||||
if [ -n "$_ely_armed" ] && [[ $BASH_COMMAND != _ely_* ]]; then
|
||||
_ely_armed=
|
||||
_ely_ran=1
|
||||
builtin printf '\e]133;C\a'
|
||||
fi
|
||||
builtin return $status
|
||||
}
|
||||
builtin eval "_ely_trap=($(builtin trap -p DEBUG))"
|
||||
builtin trap "_ely_debug \"\$_\"${_ely_trap[2]:+; ${_ely_trap[2]}}" DEBUG
|
||||
builtin unset _ely_trap
|
||||
fi
|
||||
_ely_prompt() {
|
||||
builtin local ret=$? LC_ALL=C char url= i title
|
||||
_ely_armed=
|
||||
_ely_sent=$_ely_ran
|
||||
if [ -n "$_ely_ran" ]; then
|
||||
builtin printf '\e]133;D;%s\a' "$ret"
|
||||
_ely_ran=
|
||||
fi
|
||||
_ely_d=([1]=$'\e]133;D;'"$ret"$'\a')
|
||||
[ -n "$_ely_ps0" ] || _ely_d=([1]=$'\e]133;D;'"$ret"$'\a')
|
||||
for (( i = 0; i < ${#PWD}; i++ )); do
|
||||
char=${PWD:i:1}
|
||||
case $char in
|
||||
@@ -58,9 +40,9 @@ _ely_prompt() {
|
||||
# Last, after anything that sets PS1 or PS0.
|
||||
_ely_mark() {
|
||||
if [[ $PS1 != *'\e]133;A'* ]]; then
|
||||
if builtin shopt -q promptvars; then
|
||||
# bash 3.2 traps no line that is only a subshell; \# counts it, so the prompt sends its D.
|
||||
PS1='\[${_ely_d[!_ely_sent && _ely_n && \# != _ely_n]-}${_ely_note[_ely_n = \#]-}\e]133;A\a\]'"$PS1"'\[\e]133;B\a\]'
|
||||
if [ -z "$_ely_ps0" ] && builtin shopt -q promptvars; then
|
||||
# bash 3.2 has no PS0; \#, the command number, moves once a command ran.
|
||||
PS1='\[${_ely_d[_ely_n && \# != _ely_n]-}${_ely_note[_ely_n = \#]-}\e]133;A\a\]'"$PS1"'\[\e]133;B\a\]'
|
||||
else
|
||||
PS1='\[\e]133;A\a\]'"$PS1"'\[\e]133;B\a\]'
|
||||
fi
|
||||
@@ -68,6 +50,5 @@ _ely_mark() {
|
||||
if [ -n "$_ely_ps0" ] && builtin shopt -q promptvars && [[ ${PS0-} != *"$_ely_ps0"* ]]; then
|
||||
PS0=$_ely_ps0${PS0-}
|
||||
fi
|
||||
_ely_armed=1
|
||||
}
|
||||
PROMPT_COMMAND="_ely_prompt${PROMPT_COMMAND:+;$PROMPT_COMMAND};_ely_mark"
|
||||
Reference in new issue
Block a user