It’s been more than a year and a half now since I moved from Zsh to Fish, and I am still amazed by how smooth and simple it made my everyday workflow.
One little trick I’ve been taking with me from my Bash days is aliasing sudo
to _
. There are a lot of commands I need to run via sudo
, and typing one
character instead of four makes it obviously quicker. But what if I already
started to write a command which needs proper privileges and forgotten about
that precious sudo
?
Lukas Stabe fixed it for me, years
ago.
First, let’s add his prepend_command
to
~/.config/fish/functions/prepend_command.fish
:
function prepend_command
set -l prepend $argv[1]
if test -z "$prepend"
echo "prepend_command needs one argument."
return 1
end
set -l cmd (commandline)
if test -z "$cmd"
commandline -r $history[1]
end
set -l old_cursor (commandline -C)
commandline -C 0
commandline -i "$prepend "
commandline -C (math $old_cursor + (echo $prepend | wc -c))
end
Then, it’s only a matter of adding a key binding to
~/.config/fish/functions/fish_user_key_bindings.fish
:
function fish_user_key_bindings
fish_default_key_bindings
# Prepend sudo with C-s
bind \cs 'prepend_command sudo'
end
Now hitting Ctrl-s
anywhere in the command I am typing immediately
adds sudo
at the beginning of the line.
prepend_command
comes with the benefit of mimicking the sudo
plugin of Oh
My
Zsh.
Fish doesn’t support history
expansion, but
sometimes I just press Enter
before remembering to hit
Ctrl-s
, and that’s where I’d love some history expansion. I can hit
Ctrl-s
right after the malevolent Enter
, and have my
previous command with sudo
automatically prepended ready to go.
If you are accustomed to the Zsh key binding, you can have it in Fish too:
# Re-run previous command with sudo using ESC-ESC
bind \e\e 'prepend_command sudo'
Time savers, believe you me.