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.