diff --git a/helix-stdx/src/env.rs b/helix-stdx/src/env.rs index 6e14c7a875ae9..bef2976895032 100644 --- a/helix-stdx/src/env.rs +++ b/helix-stdx/src/env.rs @@ -103,6 +103,12 @@ fn expand_impl(src: &OsStr, mut resolve: impl FnMut(&OsStr) -> Option) let mat = captures.get_match().unwrap(); let pattern_id = mat.pattern().as_usize(); let mut range = mat.range(); + // A pattern may match multiple times on a single variable, for example `${HOME:-$HOME}`: + // `${HOME:-` matches and also the default value (`$HOME`). Skip past any variables which + // have already been expanded. + if range.start < pos { + continue; + } let var = &bytes[captures.get_group(1).unwrap().range()]; let default = if pattern_id != 5 { let Some(bracket_pos) = find_brace_end(&bytes[range.end..]) else {