The best way I have found to persistently add a path to your $PATH is
set -U fish_user_paths $fish_user_paths ~/path/name
This prepends to $PATH. And since it’s persistent, the path stays in $PATH on shell restarts.
It’s more efficient than putting a command in your config.fish to modify your $PATH, because it only runs once compared to running on every shell restart.
The variable fish_user_paths is intended to be set by the user1, as stated by ridiculousfish, the maintainer of fish.
Consider creating a fish function for convenience: 2
# ~/.config/fish/functions/add_to_path.fish
function add_to_path --description 'Persistently prepends paths to your PATH'
set --universal fish_user_paths $fish_user_paths $argv
end
And use it as:
$ add_to_path foo bar # Adds foo/ and bar/ to your PATH
Notes
-
On that page the author gives the example
set -U fish_user_paths ~/bin. This overwritesfish_user_pathswith a single value of~/bin. To avoid losing existing paths set infish_user_paths, be sure to include$fish_user_pathsin addition to any new paths being added (as seen in my answer). -
My dotfiles contain a slightly more advanced version that skips adding duplicates https://github.com/dideler/dotfiles/blob/master/.config/fish/functions/add_to_user_path.fish