diff --git a/plugins/sudo/sudo.plugin.zsh b/plugins/sudo/sudo.plugin.zsh index b3749eff7..f2445a762 100644 --- a/plugins/sudo/sudo.plugin.zsh +++ b/plugins/sudo/sudo.plugin.zsh @@ -9,40 +9,48 @@ # ------- # # * Dongweiming +# * Subhaditya Nath +# * Marc Cornellà # # ------------------------------------------------------------------------------ +__sudo-replace-buffer() { + local old=$1 new=$2 space=${2:+ } + if [[ ${#LBUFFER} -le ${#old} ]]; then + RBUFFER="${space}${BUFFER#$old }" + LBUFFER="${new}" + else + LBUFFER="${new}${space}${LBUFFER#$old }" + fi +} + sudo-command-line() { [[ -z $BUFFER ]] && LBUFFER="$(fc -ln -1)" # Save beginning space local WHITESPACE="" - if [[ ${LBUFFER:0:1} == " " ]] ; then + if [[ ${LBUFFER:0:1} = " " ]]; then WHITESPACE=" " LBUFFER="${LBUFFER:1}" fi - if [[ -n $EDITOR && $BUFFER == $EDITOR\ * ]]; then - if [[ ${#LBUFFER} -le ${#EDITOR} ]]; then - RBUFFER=" ${BUFFER#$EDITOR }" - LBUFFER="sudoedit" - else - LBUFFER="sudoedit ${LBUFFER#$EDITOR }" - fi - elif [[ $BUFFER == sudoedit\ * ]]; then - if [[ ${#LBUFFER} -le 8 ]]; then - RBUFFER=" ${BUFFER#sudoedit }" - LBUFFER="$EDITOR" - else - LBUFFER="$EDITOR ${LBUFFER#sudoedit }" - fi - elif [[ $BUFFER == sudo\ * ]]; then - if [[ ${#LBUFFER} -le 4 ]]; then - RBUFFER="${BUFFER#sudo }" - LBUFFER="" - else - LBUFFER="${LBUFFER#sudo }" + # Get the first part of the typed command and check if it's an alias to $EDITOR + # If so, locally change $EDITOR to the alias so that it matches below + if [[ -n "$EDITOR" ]]; then + local cmd="${${(Az)BUFFER}[1]}" + if [[ "${aliases[$cmd]} " = (\$EDITOR|$EDITOR)\ * ]]; then + local EDITOR="$cmd" fi + fi + + if [[ -n $EDITOR && $BUFFER = $EDITOR\ * ]]; then + __sudo-replace-buffer "$EDITOR" "sudoedit" + elif [[ -n $EDITOR && $BUFFER = \$EDITOR\ * ]]; then + __sudo-replace-buffer "\$EDITOR" "sudoedit" + elif [[ $BUFFER = sudoedit\ * ]]; then + __sudo-replace-buffer "sudoedit" "$EDITOR" + elif [[ $BUFFER = sudo\ * ]]; then + __sudo-replace-buffer "sudo" "" else LBUFFER="sudo $LBUFFER" fi @@ -50,7 +58,9 @@ sudo-command-line() { # Preserve beginning space LBUFFER="${WHITESPACE}${LBUFFER}" } + zle -N sudo-command-line + # Defined shortcut keys: [Esc] [Esc] bindkey -M emacs '\e\e' sudo-command-line bindkey -M vicmd '\e\e' sudo-command-line