mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-05-18 00:31:15 -03:00
If a user passes "-i" when running a script, they ought to expect weird behavior i.e. fish might run the user's interactive-only configuration which might print things to TTY etc. But at least for our part of the configuration, we can avoid depending on the user-settable interactive bit. __fish_config_interactive is already only called when we paint the first prompt, either for a prompt (which implies we're an interactive shell) or for builtin read (which does not imply anything about the interactivity of the shell). Only print greetings when not in interactive read. Notably, "status is-interactive-read" is not overridable by the user. This helps us get rid of more "status is-interactive" switches.
164 lines
7.1 KiB
Fish
164 lines
7.1 KiB
Fish
# localization: skip(private)
|
|
#
|
|
# 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"
|
|
functions -e __fish_config_interactive
|
|
|
|
set -g __fish_active_key_bindings
|
|
|
|
functions -q __fish_webconfig_update_color_hook
|
|
|
|
#
|
|
# Generate man page completions if not present.
|
|
#
|
|
# Don't do this if we're being invoked as part of running unit tests.
|
|
if not set -q FISH_UNIT_TESTS_RUNNING
|
|
if not test -d $__fish_cache_dir/generated_completions
|
|
# We cannot simply do `fish_update_completions &` because it is a function.
|
|
# We don't want to call `fish -c` since that is unnecessary and sources config.fish again.
|
|
mkdir -p $__fish_cache_dir/generated_completions
|
|
fish_update_completions_detach=true fish_update_completions 2>/dev/null
|
|
end
|
|
end
|
|
|
|
#
|
|
# Print a greeting.
|
|
# The default just prints a variable of the same name.
|
|
#
|
|
# NOTE: This status check is necessary to not print the greeting when `read`ing in scripts. See #7080.
|
|
if not status is-interactive-read
|
|
and functions -q fish_greeting
|
|
fish_greeting
|
|
end
|
|
|
|
# Display SHELL_WELCOME if set. This is a standard environment variable (introduced by
|
|
# systemd v257) intended for shells to display when they first initialize.
|
|
if not status is-interactive-read
|
|
and set -q SHELL_WELCOME[1]
|
|
string join -- ' ' $SHELL_WELCOME
|
|
end
|
|
|
|
#
|
|
# Completions for SysV startup scripts. These aren't bound to any
|
|
# specific command, so they can't be autoloaded.
|
|
#
|
|
if test -d /etc/init.d
|
|
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'
|
|
end
|
|
|
|
#
|
|
# Only a few builtins take filenames; initialize the rest with no file completions
|
|
#
|
|
complete -c(builtin -n | string match -rv '(\.|:|source|cd|contains|count|echo|exec|fish_indent|printf|random|realpath|set|\\[|test|for)') --no-files
|
|
|
|
# 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
|
|
# Make sure some key bindings are set
|
|
if not set --query fish_key_bindings
|
|
set --global fish_key_bindings fish_default_key_bindings
|
|
return
|
|
end
|
|
|
|
# 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 fish_key_bindings is empty on the first run, we still need to set the defaults.
|
|
if test "$fish_key_bindings" = "$__fish_active_key_bindings" -a -n "$fish_key_bindings"
|
|
return
|
|
end
|
|
# Check if fish_key_bindings is a valid function.
|
|
# If not, either keep the previous bindings (if any) or revert to default.
|
|
# Also print an error so the user knows.
|
|
if not functions -q "$fish_key_bindings"
|
|
echo "There is no fish_key_bindings function called: '$fish_key_bindings'" >&2
|
|
# We need to see if this is a defined function, otherwise we'd be in an endless loop.
|
|
if functions -q $__fish_active_key_bindings
|
|
echo "Keeping $__fish_active_key_bindings" >&2
|
|
# Set the variable to the old value so this error doesn't happen again.
|
|
set fish_key_bindings $__fish_active_key_bindings
|
|
return 1
|
|
else if functions -q fish_default_key_bindings
|
|
echo "Reverting to default bindings" >&2
|
|
set fish_key_bindings fish_default_key_bindings
|
|
# Return because we are called again
|
|
return 0
|
|
else
|
|
# If we can't even find the default bindings, something is broken.
|
|
# Without it, we would eventually run into the stack size limit, but that'd print hundreds of duplicate lines
|
|
# so we should give up earlier.
|
|
echo "Cannot find fish_default_key_bindings, falling back to very simple bindings." >&2
|
|
echo "Most likely something is wrong with your installation." >&2
|
|
return 0
|
|
end
|
|
end
|
|
set -g __fish_active_key_bindings "$fish_key_bindings"
|
|
set -g fish_bind_mode default
|
|
$fish_key_bindings
|
|
# Load user key bindings if they are defined
|
|
if functions --query fish_user_key_bindings >/dev/null
|
|
fish_user_key_bindings
|
|
end
|
|
end
|
|
|
|
# Load key bindings
|
|
__fish_reload_key_bindings
|
|
|
|
# Detect whether the terminal reflows on its own
|
|
# If it does we shouldn't do it.
|
|
# Allow $fish_handle_reflow to override it.
|
|
if not set -q fish_handle_reflow
|
|
# VTE reflows the text itself, so us doing it inevitably races against it.
|
|
# Guidance from the VTE developers is to let them repaint.
|
|
# Konsole reflows since version 21.04. Konsole added XTVERSION
|
|
# in v22.03.80~7.
|
|
# TODO(term-workaround)
|
|
if string match -rq -- '^(?:VTE\b|Konsole |WezTerm )' (status terminal)
|
|
or begin
|
|
set -q KONSOLE_VERSION
|
|
and test "$KONSOLE_VERSION" -ge 210400 2>/dev/null
|
|
end
|
|
or string match -q -- 'alacritty*' $TERM
|
|
set -g fish_handle_reflow 0
|
|
else
|
|
set -g fish_handle_reflow 1
|
|
end
|
|
end
|
|
|
|
function __fish_winch_handler --on-signal WINCH -d "Repaint screen when window changes size"
|
|
if test "$fish_handle_reflow" = 1 2>/dev/null
|
|
commandline -f repaint >/dev/null 2>/dev/null
|
|
end
|
|
end
|
|
|
|
# Notify terminals when $PWD changes via OSC 7 (issue #906).
|
|
if not functions --query __fish_update_cwd_osc
|
|
function __fish_update_cwd_osc --description 'Notify terminals when $PWD might have changed' \
|
|
--on-variable=PWD --on-event=fish_prompt
|
|
set -l host $hostname
|
|
# if set -l konsole_version (string match -r -- '^Konsole (\d+)\..*' (status terminal))[2]
|
|
# # To-do: use a Konsole version where KF6_DEP_VERSION is >= 6.12
|
|
# and $konsole_version -lt ???
|
|
# end
|
|
# TODO(term-workaround)
|
|
if set -q KONSOLE_VERSION
|
|
set host ''
|
|
end
|
|
if [ -n "$MSYSTEM" ] && string match -rq -- '^(Konsole|WezTerm) ' (status terminal)
|
|
return
|
|
end
|
|
if [ "$TERM" = dumb ]
|
|
return
|
|
end
|
|
printf \e\]7\;file://%s%s\a (string escape --style=url -- $host $PWD)
|
|
end
|
|
end
|
|
__fish_update_cwd_osc # Run once because we might have already inherited a PWD from an old tab
|
|
end
|