summaryrefslogtreecommitdiff
path: root/plugins/sudo
diff options
context:
space:
mode:
authorTuowen Zhao <ztuowen@gmail.com>2022-02-19 17:12:23 -0600
committerTuowen Zhao <ztuowen@gmail.com>2022-02-19 17:12:23 -0600
commitcae9a2b797649379e865e6bd73bc67e294e4ac77 (patch)
tree481419eff4bc761c3ca516704427394193473419 /plugins/sudo
parent49edbf438ed690c76e6b2af80368c59404cf0167 (diff)
parent3427da4057dbe302933a7b5b19b4e23bfb9d0969 (diff)
downloadzsh-cae9a2b797649379e865e6bd73bc67e294e4ac77.tar.gz
zsh-cae9a2b797649379e865e6bd73bc67e294e4ac77.tar.bz2
zsh-cae9a2b797649379e865e6bd73bc67e294e4ac77.zip
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'plugins/sudo')
-rw-r--r--plugins/sudo/README.md16
-rw-r--r--plugins/sudo/sudo.plugin.zsh57
2 files changed, 51 insertions, 22 deletions
diff --git a/plugins/sudo/README.md b/plugins/sudo/README.md
index 012fc5325..27cd20c18 100644
--- a/plugins/sudo/README.md
+++ b/plugins/sudo/README.md
@@ -24,6 +24,20 @@ By pressing the <kbd>esc</kbd> key twice, you will have the same command with `s
$ 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):
+
+If the editor defined were `vim`:
+
+```console
+$ vim /etc/hosts
+```
+
+By pressing the <kbd>esc</kbd> key twice, you will have the same command with `sudo -e` instead of the editor, that would open that editor with root privileges:
+
+```console
+$ sudo -e /etc/hosts
+```
+
### Previous executed commands
Say you want to delete a system file and denied:
@@ -44,6 +58,8 @@ Password:
$
```
+The same happens for file editing, as told before.
+
## Key binding
By default, the `sudo` plugin uses <kbd>Esc</kbd><kbd>Esc</kbd> as the trigger.
diff --git a/plugins/sudo/sudo.plugin.zsh b/plugins/sudo/sudo.plugin.zsh
index e02f88a87..2a0b3bfc4 100644
--- a/plugins/sudo/sudo.plugin.zsh
+++ b/plugins/sudo/sudo.plugin.zsh
@@ -2,7 +2,7 @@
# Description
# -----------
#
-# sudo or sudoedit will be inserted before the command
+# sudo or sudo -e (replacement for sudoedit) will be inserted before the command
#
# ------------------------------------------------------------------------------
# Authors
@@ -11,14 +11,19 @@
# * Dongweiming <ciici123@gmail.com>
# * Subhaditya Nath <github.com/subnut>
# * Marc Cornellà <github.com/mcornella>
+# * Carlo Sala <carlosalag@protonmail.com>
#
# ------------------------------------------------------------------------------
__sudo-replace-buffer() {
local old=$1 new=$2 space=${2:+ }
- if [[ ${#LBUFFER} -le ${#old} ]]; then
- RBUFFER="${space}${BUFFER#$old }"
- LBUFFER="${new}"
+
+ # if the cursor is positioned in the $old part of the text, make
+ # the substitution and leave the cursor after the $new text
+ if [[ $CURSOR -le ${#old} ]]; then
+ BUFFER="${new}${space}${BUFFER#$old }"
+ CURSOR=${#new}
+ # otherwise just replace $old with $new in the text before the cursor
else
LBUFFER="${new}${space}${LBUFFER#$old }"
fi
@@ -35,14 +40,21 @@ sudo-command-line() {
LBUFFER="${LBUFFER:1}"
fi
- # If $EDITOR is not set, just toggle the sudo prefix on and off
- if [[ -z "$EDITOR" ]]; then
- case "$BUFFER" in
- sudoedit\ *) __sudo-replace-buffer "sudoedit" "" ;;
- sudo\ *) __sudo-replace-buffer "sudo" "" ;;
- *) LBUFFER="sudo $LBUFFER" ;;
- esac
- else
+ {
+ # If $SUDO_EDITOR or $VISUAL are defined, then use that as $EDITOR
+ # Else use the default $EDITOR
+ local EDITOR=${SUDO_EDITOR:-${VISUAL:-$EDITOR}}
+
+ # 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" ;;
+ esac
+ return
+ fi
+
# Check if the typed command is really an alias to $EDITOR
# Get the first part of the typed command
@@ -67,24 +79,25 @@ sudo-command-line() {
if [[ "$realcmd" = (\$EDITOR|$editorcmd|${editorcmd:c}) \
|| "${realcmd:c}" = ($editorcmd|${editorcmd:c}) ]] \
|| builtin which -a "$realcmd" | command grep -Fx -q "$editorcmd"; then
- editorcmd="$cmd" # replace $editorcmd with the typed command so it matches below
+ __sudo-replace-buffer "$cmd" "sudo -e"
+ return
fi
# Check for editor commands in the typed command and replace accordingly
case "$BUFFER" in
- $editorcmd\ *) __sudo-replace-buffer "$editorcmd" "sudoedit" ;;
- \$EDITOR\ *) __sudo-replace-buffer '$EDITOR' "sudoedit" ;;
- sudoedit\ *) __sudo-replace-buffer "sudoedit" "$EDITOR" ;;
+ $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" ;;
esac
- fi
-
- # Preserve beginning space
- LBUFFER="${WHITESPACE}${LBUFFER}"
+ } always {
+ # Preserve beginning space
+ LBUFFER="${WHITESPACE}${LBUFFER}"
- # Redisplay edit buffer (compatibility with zsh-syntax-highlighting)
- zle redisplay
+ # Redisplay edit buffer (compatibility with zsh-syntax-highlighting)
+ zle redisplay
+ }
}
zle -N sudo-command-line