diff --git a/src/expand.cpp b/src/expand.cpp index fbdc8c8d0..5f0b362c6 100644 --- a/src/expand.cpp +++ b/src/expand.cpp @@ -1211,7 +1211,9 @@ std::map get_abbreviations(const environment_t &vars) { std::map result; for (const wcstring &name : names) { if (string_prefixes_string(prefix, name)) { - result[name.substr(prefix.size())] = vars.get(name)->as_string(); + wcstring key; + unescape_string(name.substr(prefix.size()), &key, UNESCAPE_DEFAULT, STRING_STYLE_VAR); + result[key] = vars.get(name)->as_string(); } } return result; diff --git a/src/expand.h b/src/expand.h index 371724307..3737d8494 100644 --- a/src/expand.h +++ b/src/expand.h @@ -177,6 +177,7 @@ wcstring replace_home_directory_with_tilde(const wcstring &str, const environmen maybe_t expand_abbreviation(const wcstring &src, const environment_t &vars); /// \return a snapshot of all abbreviations as a map abbreviation->expansion. +/// The abbreviations are unescaped, i.e. they may not be valid variable identifiers (#6166). std::map get_abbreviations(const environment_t &vars); // Terrible hacks diff --git a/tests/checks/abbr.fish b/tests/checks/abbr.fish index dd8eaddd3..b2c3a64ef 100644 --- a/tests/checks/abbr.fish +++ b/tests/checks/abbr.fish @@ -85,3 +85,7 @@ abbr __abbr11 omega11 abbr __abbr12 omega12 abbr -r __abbr11 __abbr12 # CHECKERR: abbr --rename: Abbreviation __abbr12 already exists, cannot rename __abbr11 + +abbr __abbr-with-dashes omega +complete -C__abbr-with +# CHECK: __abbr-with-dashes Abbreviation: omega