diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index 59a1efb02..4d6fb8c21 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -68,25 +68,48 @@ function omz_termsupport_preexec { return fi + # split command into array of arguments + local -a cmdargs + cmdargs=("${(z)2}") + # if running fg, extract the command from the job description + if [[ "${cmdargs[1]}" = fg ]]; then + # get the job id from the first argument passed to the fg command + local job_id jobspec="${cmdargs[2]#%}" + # logic based on jobs arguments: + # http://zsh.sourceforge.net/Doc/Release/Jobs-_0026-Signals.html#Jobs + # https://www.zsh.org/mla/users/2007/msg00704.html + case "$jobspec" in + <->) # %number argument: + # use the same passed as an argument + job_id=${jobspec} ;; + ""|%|+) # empty, %% or %+ argument: + # use the current job, which appears with a + in $jobstates: + # suspended:+:5071=suspended (tty output) + job_id=${(k)jobstates[(r)*:+:*]} ;; + -) # %- argument: + # use the previous job, which appears with a - in $jobstates: + # suspended:-:6493=suspended (signal) + job_id=${(k)jobstates[(r)*:-:*]} ;; + [?]*) # %?string argument: + # use $jobtexts to match for a job whose command *contains* + job_id=${(k)jobtexts[(r)*${(Q)jobspec}*]} ;; + *) # %string argument: + # use $jobtexts to match for a job whose command *starts with* + job_id=${(k)jobtexts[(r)${(Q)jobspec}*]} ;; + esac + + # override preexec function arguments with job command + local job_cmd="${jobtexts[$job_id]}" + if [[ -n "$job_cmd" ]]; then + 1="$job_cmd" + 2="$job_cmd" + fi + fi + # cmd name only, or if this is sudo or ssh, the next cmd local CMD=${1[(wr)^(*=*|sudo|ssh|mosh|rake|-*)]:gs/%/%%} local LINE="${2:gs/%/%%}" - # replace fg, possibly with argument, with description from jobs - if [[ "$CMD" = fg ]]; then - local JOB - if [[ ${(z)1} = fg ]]; then # no arguments - JOB="$(jobs %% 2>/dev/null)" - else # arguments - JOB="$(jobs ${${(z)1}[2]} 2>/dev/null)" - fi - if [[ $? -eq 0 ]]; then - JOB="${${(z)JOB}[4,$]}" # trim job number, +, pid, status - title ${JOB:gs/%/%%} ${JOB:gs/%/%%} - return - fi - fi - title '$CMD' '%100>...>$LINE%<<' }