diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 9996e295b..44cd42335 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,7 @@ fish 4.1.0 (released ???) Notable improvements and fixes ------------------------------ - Compound commands (``begin; echo 1; echo 2; end``) can now be now be abbreviated using braces (``{ echo1; echo 2 }``), like in other shells. +- When tab completion results are truncated, any common directory name is omitted. Deprecations and removed features --------------------------------- diff --git a/src/reader.rs b/src/reader.rs index 788d49643..f07aab2ed 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -6497,10 +6497,21 @@ fn handle_completions(&mut self, token_range: Range) -> bool { prefix.push_utfstr(&tok); prefix.push_utfstr(&common_prefix); } else { - // Append just the end of the string. + // Collapse parent directories and append end of string prefix.push(get_ellipsis_char()); + let full = tok + &common_prefix[..]; - prefix.push_utfstr(&full[full.len() - PREFIX_MAX_LEN..]); + let truncated = &full[full.len() - PREFIX_MAX_LEN..]; + let (i, last_component) = truncated.split('/').enumerate().last().unwrap(); + if i == 0 { + // No path separators were found in the common prefix, so we can't collapse + // any further + prefix.push_utfstr(&truncated); + } else { + // Discard any parent directories and include whats left + prefix.push('/'); + prefix.push_utfstr(last_component); + }; } // Update the pager data. diff --git a/tests/checks/tmux-prefix.fish b/tests/checks/tmux-prefix.fish new file mode 100644 index 000000000..541507ec8 --- /dev/null +++ b/tests/checks/tmux-prefix.fish @@ -0,0 +1,26 @@ +#RUN: %fish %s +#REQUIRES: command -v tmux +#REQUIRES: test -z "$CI" + +isolated-tmux-start + +# Check no collapse +mkdir -p a/b +echo > a/b/f1 +echo > a/b/f2 +isolated-tmux send-keys 'HOME=$PWD ls ~/a/b/' Tab +tmux-sleep +isolated-tmux capture-pane -p +# CHECK: prompt 0> HOME=$PWD ls ~/a/b/f +# CHECK: ~/a/b/f1 ~/a/b/f2 + +# Check collapse +isolated-tmux send-keys C-c +mkdir -p dddddd/eeeeee +echo > dddddd/eeeeee/file1 +echo > dddddd/eeeeee/file2 +isolated-tmux send-keys 'HOME=$PWD ls ~/dddddd/eeeeee/' Tab +tmux-sleep +isolated-tmux capture-pane -p +# CHECK: prompt 0> HOME=$PWD ls ~/dddddd/eeeeee/file +# CHECK: …/file1 …/file2