fish-shell/share/functions/__fish_config_interactive.fish

270 lines
8.9 KiB
Fish

# Initializations that should only be performed when entering
# interactive mode.
# This function is called by the __fish_on_interactive function, which
# is defined in config.fish.
function __fish_config_interactive -d "Initializations that should be performed when entering interactive mode"
# Make sure this function is only run once
if set -q __fish_config_interactive_done
return
end
set -g __fish_config_interactive_done
# Set the correct configuration directory
set -l configdir ~/.config
if set -q XDG_CONFIG_HOME
set configdir $XDG_CONFIG_HOME
end
# Set the correct user data directory
set -l userdatadir ~/.local/share
if set -q XDG_DATA_HOME
set userdatadir $XDG_DATA_HOME
end
#
# If we are starting up for the first time, set various defaults
#
if not set -q __fish_init_1_50_0
if not set -q fish_greeting
set -l line1 (printf (_ 'Welcome to fish, the friendly interactive shell') )
set -l line2 (printf (_ 'Type %shelp%s for instructions on how to use fish') (set_color green) (set_color normal))
set -U fish_greeting $line1\n$line2
end
set -U __fish_init_1_50_0
#
# Set various defaults using these throwaway functions
#
function set_default -d "Set a universal variable, unless it has already been set"
if not set -q $argv[1]
set -U -- $argv
end
end
# Regular syntax highlighting colors
set_default fish_color_normal normal
set_default fish_color_command 005fd7 purple
set_default fish_color_param 00afff cyan
set_default fish_color_redirection normal
set_default fish_color_comment red
set_default fish_color_error red --bold
set_default fish_color_escape cyan
set_default fish_color_operator cyan
set_default fish_color_quote brown
set_default fish_color_autosuggestion 555 yellow
set_default fish_color_valid_path --underline
set_default fish_color_cwd green
set_default fish_color_cwd_root red
# Background color for matching quotes and parenthesis
set_default fish_color_match cyan
# Background color for search matches
set_default fish_color_search_match --background=purple
# Background color for selections
set_default fish_color_selection --background=purple
# Pager colors
set_default fish_pager_color_prefix cyan
set_default fish_pager_color_completion normal
set_default fish_pager_color_description 555 yellow
set_default fish_pager_color_progress cyan
#
# Directory history colors
#
set_default fish_color_history_current cyan
#
# Remove temporary functions for setting default variable values
#
functions -e set_default
end
#
# Generate man page completions if not present
#
if not test -d $userdatadir/fish/generated_completions
#fish_update_completions is a function, so it can not be directly run in background.
eval "$__fish_bin_dir/fish -c 'fish_update_completions > /dev/null ^/dev/null' &"
end
if status -i
#
# Print a greeting
#
if functions -q fish_greeting
fish_greeting
else
if set -q fish_greeting
switch "$fish_greeting"
case ''
# If variable is empty, don't print anything, saves us a fork
case '*'
echo $fish_greeting
end
end
end
# Warn upgrading users that fishd has gone away
# https://github.com/fish-shell/fish-shell/issues/1730
set -l __fishd_socket_path
if set -q XDG_RUNTIME_DIR
set __fishd_socket_path "$XDG_RUNTIME_DIR/fishd.socket"
else
set __fishd_socket_path "/tmp/fish.$USER/fishd.socket"
end
if test -S "$__fishd_socket_path"
printf (_ "One or more instances of an old version of fish is still running.\nUniversal variables will not be shared across instances and changes may be lost.\nAll running instances of old versions of fish should be restarted.\n")
end
end
#
# This event handler makes sure the prompt is repainted when
# fish_color_cwd changes value. Like all event handlers, it can't be
# autoloaded.
#
function __fish_repaint --on-variable fish_color_cwd --description "Event handler, repaints the prompt when fish_color_cwd changes"
if status --is-interactive
set -e __fish_prompt_cwd
commandline -f repaint ^/dev/null
end
end
function __fish_repaint_root --on-variable fish_color_cwd_root --description "Event handler, repaints the prompt when fish_color_cwd_root changes"
if status --is-interactive
set -e __fish_prompt_cwd
commandline -f repaint ^/dev/null
end
end
#
# Completions for SysV startup scripts. These aren't bound to any
# specific command, so they can't be autoloaded.
#
complete -x -p "/etc/init.d/*" -a start --description 'Start service'
complete -x -p "/etc/init.d/*" -a stop --description 'Stop service'
complete -x -p "/etc/init.d/*" -a status --description 'Print service status'
complete -x -p "/etc/init.d/*" -a restart --description 'Stop and then start service'
complete -x -p "/etc/init.d/*" -a reload --description 'Reload service configuration'
# Make sure some key bindings are set
if not set -q fish_key_bindings
set -U fish_key_bindings fish_default_key_bindings
end
# Reload key bindings when binding variable change
function __fish_reload_key_bindings -d "Reload key bindings when binding variable change" --on-variable fish_key_bindings
# do nothing if the key bindings didn't actually change
# This could be because the variable was set to the existing value
# or because it was a local variable
if test "$fish_key_bindings" = "$__fish_active_key_bindings"
return
end
set -g __fish_active_key_bindings "$fish_key_bindings"
set -g fish_bind_mode default
if test "$fish_key_bindings" = fish_default_key_bindings
fish_default_key_bindings
# Load user key bindings if they are defined
if functions --query fish_user_key_bindings > /dev/null
fish_user_key_bindings
end
else
eval $fish_key_bindings ^/dev/null
end
end
# Load key bindings. Redirect stderr per #1155
set -g __fish_active_key_bindings
__fish_reload_key_bindings ^ /dev/null
# Repaint screen when window changes size
function __fish_winch_handler --on-signal winch
commandline -f repaint
end
# Notify vte-based terminals when $PWD changes (issue #906)
if test "$VTE_VERSION" -ge 3405 -o "$TERM_PROGRAM" = "Apple_Terminal"
function __update_vte_cwd --on-variable PWD --description 'Notify VTE of change to $PWD'
status --is-command-substitution; and return
printf '\033]7;file://%s%s\a' (hostname) (pwd | __fish_urlencode)
end
end
# The first time a command is not found, look for command-not-found
# This is not cheap so we try to avoid doing it during startup
# config.fish already installed a handler for noninteractive command-not-found,
# so delete it here since we are now interactive
functions -e __fish_command_not_found_handler
# Now install our fancy variant
function __fish_command_not_found_setup --on-event fish_command_not_found
# Remove fish_command_not_found_setup so we only execute this once
functions --erase __fish_command_not_found_setup
# First check if we are on OpenSUSE since SUSE's handler has no options
# and expects first argument to be a command and second database
# also check if there is command-not-found command.
if begin; test -f /etc/SuSE-release; and type -q -p command-not-found; end
function __fish_command_not_found_handler --on-event fish_command_not_found
/usr/bin/command-not-found $argv
end
# Check for Fedora's handler
else if test -f /usr/libexec/pk-command-not-found
function __fish_command_not_found_handler --on-event fish_command_not_found
/usr/libexec/pk-command-not-found $argv
end
# Check in /usr/lib, this is where modern Ubuntus place this command
else if test -f /usr/lib/command-not-found
function __fish_command_not_found_handler --on-event fish_command_not_found
/usr/lib/command-not-found -- $argv
end
# Check for NixOS handler
else if test -f /run/current-system/sw/bin/command-not-found
function __fish_command_not_found_handler --on-event fish_command_not_found
/run/current-system/sw/bin/command-not-found $argv
end
# Ubuntu Feisty places this command in the regular path instead
else if type -q -p command-not-found
function __fish_command_not_found_handler --on-event fish_command_not_found
command-not-found -- $argv
end
# pkgfile is an optional, but official, package on Arch Linux
# it ships with example handlers for bash and zsh, so we'll follow that format
else if type -p -q pkgfile
function __fish_command_not_found_handler --on-event fish_command_not_found
set -l __packages (pkgfile --binaries --verbose -- $argv ^/dev/null)
if test $status -eq 0
printf "%s may be found in the following packages:\n" "$argv"
printf " %s\n" $__packages
else
__fish_default_command_not_found_handler $argv
end
end
# Use standard fish command not found handler otherwise
else
function __fish_command_not_found_handler --on-event fish_command_not_found
__fish_default_command_not_found_handler $argv
end
end
__fish_command_not_found_handler $argv
end
end