Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Implement auto-detection of subexecutor #12261

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
44 changes: 44 additions & 0 deletions lib/00subexecutor.zsh
@@ -0,0 +1,44 @@
## Provides auto-detection of subexecutor to use

# If in the future a new subexecuter is created, we only need to edit this array
typeset _KNOWN_SUBEXES=( "doas" "sudo" )
typeset _SUBEX

function _SetupSubexecutor() {
local _i
local _cmd
zstyle -s ':omz' 'subexecutor' _SUBEX
if [[ "$_SUBEX" ]]; then
if command -v "$_SUBEX" > /dev/null; then
return 0
fi
print "Cannot find subexecutor '${_SUBEX}'; please check your configuration!" >&2
return 1
fi
for _i in "${_KNOWN_SUBEXES[@]}"; do
if command -v "$_i" > /dev/null; then
_SUBEX="$_i"
break
fi
done
if [[ -z $_SUBEX ]]; then
print "oh-my-zsh: cannot auto-detect subexecutor; please specify explicitly using 'zstyle :omz subexecutor'." >&2
return 1
fi
zstyle ':omz' 'subexecutor' "$_SUBEX"
}

_SetupSubexecutor
unfunction _SetupSubexecutor
unset _KNOWN_SUBEXES

# The alias provides a 'hardcoded', invariant subexecutor to use throughout the shell session
alias _="$_SUBEX "
Comment on lines +35 to +36
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is taken out from lib/misc.zsh because the definition of the alias now relies completely on what subexecutor is being used.


# The function is, in contrast, modifiable by changing the :omz->subexecutor zstyle
function subex() {
local _subex
zstyle -s ':omz' 'subexecutor' _subex
${_subex} "$@"
}

5 changes: 4 additions & 1 deletion lib/correction.zsh
Expand Up @@ -3,8 +3,11 @@ if [[ "$ENABLE_CORRECTION" == "true" ]]; then
alias man='nocorrect man'
alias mkdir='nocorrect mkdir'
alias mv='nocorrect mv'
alias sudo='nocorrect sudo'
alias su='nocorrect su'

zstyle -s ':omz' 'subexecutor' _subex
alias "$_subex"="nocorrect $_subex"
unset _subex

setopt correct_all
fi
3 changes: 0 additions & 3 deletions lib/misc.zsh
Expand Up @@ -27,9 +27,6 @@ elif (( ${+commands[more]} )); then
env_default 'PAGER' 'more'
fi

## super user alias
alias _='sudo '

Comment on lines -30 to -32
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Moved to 00subexecutor.zsh

## more intelligent acking for ubuntu users and no alias for users without ack
if (( $+commands[ack-grep] )); then
alias afind='ack-grep -il'
Expand Down
6 changes: 4 additions & 2 deletions lib/termsupport.zsh
Expand Up @@ -95,8 +95,10 @@ function omz_termsupport_preexec {
fi
fi

# cmd name only, or if this is sudo or ssh, the next cmd
local CMD="${1[(wr)^(*=*|sudo|ssh|mosh|rake|-*)]:gs/%/%%}"
# cmd name only, or if this is doas/sudo or ssh, the next cmd
local _subex
zstyle -s ':omz' 'subexecutor' _subex
local CMD="${1[(wr)^(*=*|${_subex}|_|subex|mosh|rake|-*)]:gs/%/%%}"
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I replaced sudo in the filter with ${_subex}|_|subex for the following reasons:

  • The subexecutor is not necessarily sudo now (can be doas, for instance)
  • There's an underscore _ alias (previously defined in lib/misc.zsh) that aliases the subexecutor
  • There's a new global function subex that also invokes the subexecutor

local LINE="${2:gs/%/%%}"

title "$CMD" "%100>...>${LINE}%<<"
Expand Down