Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: [bug] Completion functions _files/_path_files -F filter on escaped file names

On Wed, Jun 21, 2023 at 12:29 PM Johan Grande <nahoj@xxxxxxxxx> wrote:
> When completion with _files or _path_files is called at the beginning of
> an argument, exclusion patterns given with `-F` are applied to
> already-escaped file names. This breaks patterns that contain escapable
> characters such as a space or [].
> With a \ added to the pattern, 'a a' is filtered out.

Upon closer examination, the documentation of the -F option is
imprecise.  -F is a substitute for the "ignored-patterns" zstyle, and
the description of that style clearly states that it filters out trial
completions.  Thus the -F option does not ignore files, it ignores the
strings that are candidates to be inserted on the command line when
completing files.

> But this is very brittle as it depends on the implementation of the
> escaping instead of the file names themselves.

Unfortunately this is implemented in the internals of the "compadd"
builtin and other forms of completion rely on it.

> Do you think that this behavior could be fixed?

We could try this.  However, it's not backward-compatible for people
who are already quoting spaces etc. for _files -F patterns.

diff --git a/Completion/Unix/Type/_path_files b/Completion/Unix/Type/_path_files
index d46dcbe5a..c471ad08e 100644
--- a/Completion/Unix/Type/_path_files
+++ b/Completion/Unix/Type/_path_files
@@ -100,6 +100,12 @@ if (( $#ignore )); then

+# Adjust the patterns for the effects of "compquote" on file names.
+# What's needed here is the inverse of ${(b)...}, that is, quote only
+# characters that are NOT pattern characters but might need quoting.
+# Backslashes appearing in a file name remain a bugaboo here.
+ignore=( ${ignore//(#b)([\!\#\$\&[:space:];\"\'])/\\${match[1]}} )
 # If we were given no file selection option, we behave as if we were given
 # a `-f'.

Messages sorted by: Reverse Date, Date, Thread, Author