[PATCH] `compopt -o nosort` with duplicates intact

[email protected]
Newsgroups gmane.comp.shells.bash.bugs
Message-ID <[email protected]>
Hello!

I have a completion function where I want the list of completions to
match COMPREPLY exactly. No sorting or deduplicating.

I thought compopt -o nosort would disable both. Turned out that the
deduplication is only disabled for *non-adjacent* entries. Adjacent
duplicates are still folded into one.

Duplicates in this context are not a sign of a mistake, they are all
a valid choice. Which one gets to be used once the command is run is
determined by other options on the command line. Kind of like how the
same argument to -l in gcc can lead to very different outcomes based on
what -L options are supplied, and in what order.  Showing the duplicates
tells the user that there is a choice, and avoids potential confusion.
The function in question deduplicates COMPREPLY, but only if duplicates
are the only remaining items.

The patch below disables the deduplication of adjacent entries too when
-o nosort is used. Do you think this is reasonable? Any downsides?

--- bash-5.3/pcomplete.c	2024-07-09 23:38:54.000000000 +0800
+++ bash-5.3a/pcomplete.c	2026-02-22 20:37:00.272792797 +0800
@@ -1471,8 +1471,10 @@
   if (flags & COPT_NOQUOTE)
     rl_filename_quoting_desired = 1 - nval;
   /* Ditto */
-  if (flags & COPT_NOSORT)
+  if (flags & COPT_NOSORT) {
     rl_sort_completion_matches = 1 - nval;
+    rl_ignore_completion_duplicates = 1 - nval;
+  }
 }
 
 /* Set or unset FLAGS in the options word of the current compspec.

 -- 
 Thanks,
 Georgi
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.