diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 28b9e6769..dbe3701aa 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,7 +13,7 @@ fish 4.3.0 (released December 28, 2025) Deprecations and removed features --------------------------------- -- fish no longer sets :ref:`universal variables ` by default, making the configuration easier to understand. +- fish no longer sets user-facing :ref:`universal variables ` by default, making the configuration easier to understand. Specifically, the ``fish_color_*``, ``fish_pager_color_*`` and ``fish_key_bindings`` variables are now set in the global scope by default. After upgrading to 4.3.0, fish will (once and never again) migrate these universals to globals set at startup in the ``~/.config/fish/conf.d/fish_frozen_theme.fish`` and diff --git a/share/config.fish b/share/config.fish index bc48cc01d..4ced2cdff 100644 --- a/share/config.fish +++ b/share/config.fish @@ -205,7 +205,7 @@ if command -q kill end if status is-interactive - __fish_theme_migrate + __fish_migrate end fish_config theme choose default --no-override diff --git a/share/functions/__fish_config_interactive.fish b/share/functions/__fish_config_interactive.fish index e77470e15..f482770f5 100644 --- a/share/functions/__fish_config_interactive.fish +++ b/share/functions/__fish_config_interactive.fish @@ -6,15 +6,6 @@ # function __fish_config_interactive -d "Initializations that should be performed when entering interactive mode" functions -e __fish_config_interactive - # Create empty configuration directores if they do not already exist - test -e $__fish_config_dir/completions/ -a -e $__fish_config_dir/conf.d/ -a -e $__fish_config_dir/functions/ || - mkdir -p $__fish_config_dir/{completions, conf.d, functions} - - # Create config.fish with some boilerplate if it does not exist - test -e $__fish_config_dir/config.fish || echo "\ -if status is-interactive -# Commands to run in interactive sessions can go here -end" >$__fish_config_dir/config.fish set -g __fish_active_key_bindings diff --git a/share/functions/__fish_theme_migrate.fish b/share/functions/__fish_migrate.fish similarity index 85% rename from share/functions/__fish_theme_migrate.fish rename to share/functions/__fish_migrate.fish index 3e3e3c58a..51b74db67 100644 --- a/share/functions/__fish_theme_migrate.fish +++ b/share/functions/__fish_migrate.fish @@ -1,9 +1,27 @@ # localization: skip(private) -function __fish_theme_migrate - functions -e __fish_theme_migrate +function __fish_migrate + functions -e __fish_migrate + + set -l migration_version 4300 # Maybe migrate. - if not set -q __fish_initialized || test $__fish_initialized -ge 4300 + if set -q __fish_initialized && test $__fish_initialized -ge $migration_version + return + end + + # Create empty configuration directores if they do not already exist + test -e $__fish_config_dir/completions/ -a -e $__fish_config_dir/conf.d/ -a -e $__fish_config_dir/functions/ || + mkdir -p $__fish_config_dir/{completions, conf.d, functions} + + # Create config.fish with some boilerplate if it does not exist + test -e $__fish_config_dir/config.fish || echo "\ +if status is-interactive +# Commands to run in interactive sessions can go here +end" >$__fish_config_dir/config.fish + + set -l mark_migration_done set -U __fish_initialized $migration_version + if not set -q __fish_initialized + $mark_migration_done return end @@ -22,7 +40,7 @@ function __fish_theme_migrate for varname in $theme_uvars set -a theme_data "$(string escape -- $varname $$varname | string join " ")" end - __fish_theme_freeze __fish_theme_migrate $theme_data + __fish_theme_freeze __fish_migrate $theme_data set msg_suffix " by default."\n" Migrated them to global variables set in $(set_color --underline)$( __fish_unexpand_tilde $__fish_config_dir/conf.d/fish_frozen_theme.fish )$(set_color normal)" @@ -35,6 +53,7 @@ function __fish_theme_migrate set -l relative_filename conf.d/fish_frozen_key_bindings.fish set -l filename $__fish_config_dir/$relative_filename __fish_backup_config_files $relative_filename + mkdir -p -- (path dirname -- $filename) echo >$filename "\ # This file was created by fish when upgrading to version 4.3, to migrate # the 'fish_key_bindings' variable from its old default scope (universal) @@ -62,7 +81,7 @@ set --erase --universal fish_key_bindings" (set_color normal)) source $__fish_config_dir/$relative_filename end - set -U __fish_initialized 4300 + $mark_migration_done if $removing_uvars echo -s (set_color --bold) 'fish:' (set_color normal) " upgraded to version 4.3:" string join \n -- $msg diff --git a/share/functions/__fish_theme_freeze.fish b/share/functions/__fish_theme_freeze.fish index 4b6b8355c..1c8b5925c 100644 --- a/share/functions/__fish_theme_freeze.fish +++ b/share/functions/__fish_theme_freeze.fish @@ -9,8 +9,9 @@ function __fish_theme_freeze __fish_data_with_file help_sections $(command -v grep) -Fxq $help_section or echo "fish: internal error: missing help section '$help_section'" + mkdir -p -- (path dirname -- $__fish_config_dir/conf.d) printf >$__fish_config_dir/$relative_path %s\n \ - $(test $data_source = __fish_theme_migrate && + $(test $data_source = __fish_migrate && echo "\ # This file was created by fish when upgrading to version 4.3, to migrate # theme variables from universal to global scope.") \ @@ -21,7 +22,7 @@ function __fish_theme_freeze # or # man fish-interactive | less +/^SYNTAX.HIGHLIGHTING # for appropriate commands to add to ~/.config/fish/config.fish instead." \ - $(test $data_source = __fish_theme_migrate && + $(test $data_source = __fish_migrate && echo '# See also the release notes for fish 4.3.0 (run `help relnotes`).') \ "" \ 'set --global '$theme_data diff --git a/tests/checks/__fish_theme_migrate.fish b/tests/checks/__fish_migrate.fish similarity index 96% rename from tests/checks/__fish_theme_migrate.fish rename to tests/checks/__fish_migrate.fish index 0139bf587..923a7c2a7 100644 --- a/tests/checks/__fish_theme_migrate.fish +++ b/tests/checks/__fish_migrate.fish @@ -30,7 +30,7 @@ echo no default universal variables # CHECK: ok provoke-migration - $fish -c __fish_theme_migrate + $fish -c __fish_migrate # CHECK: {{\x1b\[1m}}fish:{{\x1b\[m}} {{upgraded.*}} # CHECK: {{.*Color.*no.longer.*universal.*}} # CHECK: Migrated {{.*}} {{\S*}}/xdg_config_home/fish/conf.d/fish_frozen_theme.fish{{\x1b\[m}} @@ -49,7 +49,7 @@ echo no default universal variables # But the migration is only done once, in case the user really wants these as universals. set -U fish_color_autosuggestion 8e8e8e $fish -c ' - __fish_theme_migrate + __fish_migrate set -eg fish_color_autosuggestion echo $fish_color_autosuggestion # CHECK: 8e8e8e @@ -63,7 +63,7 @@ echo no default universal variables echo yes | fish_config theme save default fake-old-uvars provoke-migration - $fish -c __fish_theme_migrate + $fish -c __fish_migrate # CHECK: {{\x1b\[1m}}fish:{{\x1b\[m}} {{upgraded.*}} # CHECK: {{.*Color.*no.longer.*universal.*}} # CHECK: {{.*restart.*}} @@ -80,7 +80,7 @@ echo no default universal variables $fish -c ' set -g fish_color_autosuggestion red set -g fish_color_command green --theme=default - __fish_theme_migrate + __fish_migrate for cmd in "" "__fish_color_theme=unknown __fish_apply_theme" eval $cmd echo fish_color_autosuggestion $fish_color_autosuggestion @@ -98,7 +98,7 @@ echo no default universal variables { set -U fish_key_bindings fish_vi_key_bindings provoke-migration - $fish -c __fish_theme_migrate + $fish -c __fish_migrate # CHECK: {{\x1b\[1m}}fish:{{\x1b\[m}} {{upgraded.*}} # CHECK: {{.*fish_key_bindings.*no.longer.*universal.*}} # CHECK: Migrated {{.*}} {{\S*}}/xdg_config_home/fish/conf.d/fish_frozen_key_bindings.fish{{\x1b\[m}} diff --git a/tests/checks/command-not-found.fish b/tests/checks/command-not-found.fish index c5b07ab16..151c21e52 100644 --- a/tests/checks/command-not-found.fish +++ b/tests/checks/command-not-found.fish @@ -1,4 +1,5 @@ #RUN: fish=%fish %fish %s +__fish_migrate # make sure the interactive fish doesn't need mkdir in PATH set -g PATH $fish -c "nonexistent-command-1234 banana rama" #CHECKERR: fish: Unknown command: nonexistent-command-1234