A Zsh widget to toggle a prefix on a command
By default, this will set "Alt+s" to toggle sudo on a command.
In its current state, it uses split-shell-arguments
to divide up the buffer, and looks for newlines,
;/&&/||/|,
followed optionally by if/else/while/etc.
This method should avoid any false positives,
but it will also ignore $(command substitutions).
This project also makes use of all sudo flags
known by the completion function _sudo
and deletes them and their arguments if found as well.
For example,
sudo -uuser -g group --shell foo bar will be replaced by
foo bar, since -u and -g take arguments,
while --shell does not.
| Widget | Binding | Prefix Inserted | Prefix Matched |
|---|---|---|---|
toggle-sudo |
Alt-s | sudo |
sudo followed by any number of supported flags known by _sudo completion |
toggle-noglob |
Alt-g | noglob |
noglob |
toggle-nocorrect |
(not bound) | nocorrect |
nocorrect |
toggle-command |
Alt-Shift-c | command |
command |
Launch a command with i3-msg instead of in the current session.
.toggle-i3exec(){
.toggle-command-prefix 'i3-msg -- exec -- ' 'i3-msg' '(--|exec)'
}
zle -N .toggle-i3exec
bindkey '^[i' .toggle-i3execLaunch a command with nice
.toggle-nice(){
.toggle-command-prefix 'nice -n10 ' 'nice' '(-n?|--adjustment=)*' '(-n|--adjustment)'
}
zle -N .toggle-nice
bindkey '^[n' .toggle-niceToggle-command-prefix uses zstyle settings to control certain behavior.
If a command is found and removed, the following lookup is done:
zstyle -t :zle:toggle-command-prefix:${removed_text} copyIf the lookup returns true, then the remove text is also yanked into the cut buffer for later pasting.
You can use this like so:
# copy by default
zstyle ':zle:toggle-command-prefix:*' copy true
# don't copy sudo by itself
zstyle ':zle:toggle-command-prefix:sudo ' copy false
# copy sudo followed by any number of other matched flags
zstyle ':zle:toggle-command-prefix:sudo -*' copy true