diff options
author | Subhaditya Nath <56714626+subnut@users.noreply.github.com> | 2020-11-12 01:55:32 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-11 21:25:32 +0100 |
commit | 874d83f7b86afbc395915e796cff4e4fe949a204 (patch) | |
tree | a6823d5a900cb3c71a02d330f2960f0453cd55ea /plugins/sudo/sudo.plugin.zsh | |
parent | 1beac5958ede29855ef2ac4313ada83ed37f5ea8 (diff) | |
download | zsh-874d83f7b86afbc395915e796cff4e4fe949a204.tar.gz zsh-874d83f7b86afbc395915e796cff4e4fe949a204.tar.bz2 zsh-874d83f7b86afbc395915e796cff4e4fe949a204.zip |
feat(sudo): support aliases to $EDITOR (#9431)
Co-authored-by: Marc Cornellà <marc.cornella@live.com>
Diffstat (limited to 'plugins/sudo/sudo.plugin.zsh')
-rw-r--r-- | plugins/sudo/sudo.plugin.zsh | 52 |
1 files changed, 31 insertions, 21 deletions
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 <ciici123@gmail.com> +# * Subhaditya Nath <github.com/subnut> +# * Marc Cornellà <github.com/mcornella> # # ------------------------------------------------------------------------------ +__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 |