Small bash script to quickly edit scripts in $PATH
Use a shebang
#!/usr/bin/env bash

 I see you're already doing that.
In bash, prefer [[...]] over [...]. The double bracket conditional
command
gives you more features (including regular expression matching), and fewer
surprises (particularly about unquoted variables).
With a getopts loop, I prefer to shift at the end:
while getopts ...; do
    case $opt in
        ...
    esac
done
shift $((OPTIND - 1))

Allow the Usage function to take an error message:
Usage() {
    [[ -n $2 ]] &amp;&amp; echo &quot;$2&quot; &gt;&amp;2
    # ... rest is the same
}

That simplifies some assertions
(( $# &gt; 0 )) || Usage 2 &quot;No arguments given&quot;

Use command -v instead of which
Use an array to hold the paths. There's no other good way to hold a list of things where any of them might contain whitespace.
paths=()
for b in &quot;$@&quot;; do
    p=$( command -v &quot;$b&quot; ) &amp;&amp; paths+=(&quot;$p&quot;)
done

You do need to command substitution (aka subshell) so you can capture the output.
The &quot;colon&quot; function makes me cringe.
For clarity, use if instead of long boolean chains
if (( ${#paths[@]} == 0 )); then
    echo &quot;No valid executables found in PATH&quot; &gt;&amp;2
    exit 3
fi

And prefer quoting over word splitting:
vim $flags &quot;${paths[@]}&quot;

Yes, the script will exit with vim's exit status. If you want to be super tidy, you could replace the script process with vim:
exec vim $flags &quot;${paths[@]}&quot;