From 6d7eb3746cf2944989c67f8b178ffcc36aceb60e Mon Sep 17 00:00:00 2001 From: xlebpushek Date: Sun, 8 Jun 2025 14:52:40 +0400 Subject: [PATCH] feat: support custom prefix in sudo plugin and update README accordingly feat: add configurable prefix support to sudo plugin with alias reminder - Introduced ZSH_SUDO_PLUGIN_PREFIX variable to allow custom command prefix instead of default 'sudo' - Updated command substitution logic to handle prefix and prefix -e (sudoedit) properly - Enhanced README with usage examples and a note about creating alias for custom prefixes - Maintains default behavior when no prefix is specified --- plugins/sudo/README.md | 45 +++++++++++++++++++++++++----------- plugins/sudo/sudo.plugin.zsh | 40 +++++++++++++++++--------------- 2 files changed, 52 insertions(+), 33 deletions(-) diff --git a/plugins/sudo/README.md b/plugins/sudo/README.md index 27cd20c18..96b3adb91 100644 --- a/plugins/sudo/README.md +++ b/plugins/sudo/README.md @@ -1,30 +1,30 @@ # sudo -Easily prefix your current or previous commands with `sudo` by pressing esc twice. +Easily prefix your current or previous commands with `sudo` (or a custom prefix) by pressing esc twice. To use it, add `sudo` to the plugins array in your zshrc file: ```zsh plugins=(... sudo) -``` +```` ## Usage ### Current typed commands -Say you have typed a long command and forgot to add `sudo` in front: +Say you have typed a long command and forgot to add the prefix (default: `sudo`) in front: ```console $ apt-get install build-essential ``` -By pressing the esc key twice, you will have the same command with `sudo` prefixed without typing: +By pressing the esc key twice, you will have the same command with the prefix (`sudo` by default) added without typing: ```console $ sudo apt-get install build-essential ``` -The same happens for editing files with your default editor (defined in `$SUDO_EDITOR`, `$VISUAL` or `$EDITOR`, in that order): +The same happens for editing files with your default editor (defined in `$SUDO_EDITOR`, `$VISUAL`, or `$EDITOR`, in that order): If the editor defined were `vim`: @@ -32,7 +32,7 @@ If the editor defined were `vim`: $ vim /etc/hosts ``` -By pressing the esc key twice, you will have the same command with `sudo -e` instead of the editor, that would open that editor with root privileges: +By pressing the esc key twice, the command will be replaced with the prefix followed by `-e` (default: `sudo -e`), which opens that editor with root privileges: ```console $ sudo -e /etc/hosts @@ -40,7 +40,7 @@ $ sudo -e /etc/hosts ### Previous executed commands -Say you want to delete a system file and denied: +Say you want to delete a system file and get a permission denied error: ```console $ rm some-system-file.txt @@ -48,21 +48,20 @@ $ rm some-system-file.txt $ ``` -By pressing the esc key twice, you will have the same command with `sudo` prefixed without typing: +By pressing the esc key twice, the plugin will take the last executed command and prefix it with `sudo` (or your configured prefix): ```console -$ rm some-system-file.txt --su: some-system-file.txt: Permission denied $ sudo rm some-system-file.txt Password: $ ``` -The same happens for file editing, as told before. +The same applies for file editing commands, as described above. ## Key binding -By default, the `sudo` plugin uses EscEsc as the trigger. +By default, the plugin uses EscEsc as the trigger. + If you want to change it, you can use the `bindkey` command to bind it to a different key: ```sh @@ -71,5 +70,23 @@ bindkey -M vicmd '' sudo-command-line bindkey -M viins '' sudo-command-line ``` -where `` is the sequence you want to use. You can find the keyboard sequence -by running `cat` and pressing the keyboard combination you want to use. +where `` is the key sequence you want to use. You can find the keyboard sequence by running `cat` and pressing the desired key combination. + +## Configuration + +You can override the default prefix (`sudo`) by setting the `ZSH_SUDO_PLUGIN_PREFIX` environment variable in your `.zshrc`: + +```zsh +export ZSH_SUDO_PLUGIN_PREFIX="doas" +``` + +This will make the plugin prefix commands with `doas` instead of `sudo`. + + +**Important:** If you use a custom prefix different from `sudo`, make sure to create an alias named after that prefix pointing to `sudo`, for example: + +```zsh +alias doas='sudo' +``` + +This ensures proper command substitution and consistent behavior. \ No newline at end of file diff --git a/plugins/sudo/sudo.plugin.zsh b/plugins/sudo/sudo.plugin.zsh index 66b253fe7..f98b6af73 100644 --- a/plugins/sudo/sudo.plugin.zsh +++ b/plugins/sudo/sudo.plugin.zsh @@ -2,7 +2,7 @@ # Description # ----------- # -# sudo or sudo -e (replacement for sudoedit) will be inserted before the command +# [prefix](by default: sudo) or [prefix](by default: sudo) -e (replacement for sudoedit) will be inserted before the command # # ------------------------------------------------------------------------------ # Authors @@ -12,10 +12,11 @@ # * Subhaditya Nath # * Marc Cornellà # * Carlo Sala +# * Xlebp Rjanoi # # ------------------------------------------------------------------------------ -__sudo-replace-buffer() { +__prefix-replace-buffer() { local old=$1 new=$2 space=${2:+ } # if the cursor is positioned in the $old part of the text, make @@ -29,8 +30,8 @@ __sudo-replace-buffer() { fi } -sudo-command-line() { - # If line is empty, get the last run command from history +prefix-command-line() { + # If buffer is empty, use last history entry [[ -z $BUFFER ]] && LBUFFER="$(fc -ln -1)" # Save beginning space @@ -44,13 +45,13 @@ sudo-command-line() { # If $SUDO_EDITOR or $VISUAL are defined, then use that as $EDITOR # Else use the default $EDITOR local EDITOR=${SUDO_EDITOR:-${VISUAL:-$EDITOR}} + local PREFIX=${ZSH_SUDO_PLUGIN_PREFIX:-sudo} - # If $EDITOR is not set, just toggle the sudo prefix on and off if [[ -z "$EDITOR" ]]; then case "$BUFFER" in - sudo\ -e\ *) __sudo-replace-buffer "sudo -e" "" ;; - sudo\ *) __sudo-replace-buffer "sudo" "" ;; - *) LBUFFER="sudo $LBUFFER" ;; + $PREFIX\ -e\ *) __prefix-replace-buffer "$PREFIX -e" "" ;; + $PREFIX\ *) __prefix-replace-buffer "$PREFIX" "" ;; + *) LBUFFER="$PREFIX $LBUFFER" ;; esac return fi @@ -79,30 +80,31 @@ sudo-command-line() { if [[ "$realcmd" = (\$EDITOR|$editorcmd|${editorcmd:c}) \ || "${realcmd:c}" = ($editorcmd|${editorcmd:c}) ]] \ || builtin which -a "$realcmd" | command grep -Fx -q "$editorcmd"; then - __sudo-replace-buffer "$cmd" "sudo -e" + __prefix-replace-buffer "$cmd" "$PREFIX -e" return fi # Check for editor commands in the typed command and replace accordingly case "$BUFFER" in - $editorcmd\ *) __sudo-replace-buffer "$editorcmd" "sudo -e" ;; - \$EDITOR\ *) __sudo-replace-buffer '$EDITOR' "sudo -e" ;; - sudo\ -e\ *) __sudo-replace-buffer "sudo -e" "$EDITOR" ;; - sudo\ *) __sudo-replace-buffer "sudo" "" ;; - *) LBUFFER="sudo $LBUFFER" ;; + $editorcmd\ *) __prefix-replace-buffer "$editorcmd" "$PREFIX -e" ;; + \$EDITOR\ *) __prefix-replace-buffer '$EDITOR' "$PREFIX -e" ;; + $PREFIX\ -e\ *) __prefix-replace-buffer "$PREFIX -e" "$EDITOR" ;; + $PREFIX\ *) __prefix-replace-buffer "$PREFIX" "" ;; + *) LBUFFER="$PREFIX $LBUFFER" ;; esac } always { # Preserve beginning space LBUFFER="${WHITESPACE}${LBUFFER}" # Redisplay edit buffer (compatibility with zsh-syntax-highlighting) - zle && zle redisplay # only run redisplay if zle is enabled + zle && zle redisplay # only run redisplay if zle is enabled } } -zle -N sudo-command-line +zle -N prefix-command-line # Defined shortcut keys: [Esc] [Esc] -bindkey -M emacs '\e\e' sudo-command-line -bindkey -M vicmd '\e\e' sudo-command-line -bindkey -M viins '\e\e' sudo-command-line +bindkey -M emacs '\e\e' prefix-command-line +bindkey -M vicmd '\e\e' prefix-command-line +bindkey -M viins '\e\e' prefix-command-line +