Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

allow completion files for, e.g., units #1242

Open
2 tasks
greg-minshall opened this issue Aug 30, 2024 · 3 comments
Open
2 tasks

allow completion files for, e.g., units #1242

greg-minshall opened this issue Aug 30, 2024 · 3 comments

Comments

@greg-minshall
Copy link

Describe the feature/solution

there is code in bash_completion that binds completion for some commands to _comp_complete_longopt, which means, unless sourced explicitly into bash, a completion file for any of these commands won't be used.

the request is to somehow allow such commands to have a completion file, which would then take over from _comp_complete_longopt for that command.

Maintenance (please complete the following information)

i'm not sure of the protocol. but, i have a patch that seems to allow this functionality.

other than possibly being wrong, a downside of the patch is that it will have any command in this set commands always go through _comp_load (presumably somewhat expensive) before calling _comp_complete_longopt. if the patch is accepted, that could probably be short-circuited.

  • This is a request for new completion

no

  • Link to upstream project query about shipping the completion:

no

@greg-minshall
Copy link
Author

i apologize, but i can't figure out how to attach the patch (its extension is ".patch", and the error message says they allow a "PATCH" file, bug ...). here it is inline, but let me know if are interested in seeing it in some different form.

From d7644e821d4f94b3766a93b5370bbc5461c35531 Mon Sep 17 00:00:00 2001
From: Greg Minshall <[email protected]>
Date: Fri, 30 Aug 2024 16:20:50 +0300
Subject: [PATCH] bash_completion: run comp_load *before* comp_complete_longopt

in order to allow a certain set of commands (bound to
comp_complete_longopt in the code) to possibly have a completion file
added.

previously, completion for this set of commands was handled by
`_comp_complete_longopt`.  (these are commands that provide output for
`--help` that can be munged to produce completions when starting from
one or two hyphens on the "command line so far".)

with this patch, `_comp_load` is first called and, if it fails to find
a completion file for the active command, and the active command is in
the set, it calls `_comp_complete_longopt`.

there is a downside of this patch: for a command in this set that
does *not* have a completion file, `_comp_load` will be called each
time completion is requested for the command.  it should be possible
to do a `complete -F _comp_complete_longopt <CMD>` in this case.
---
 bash_completion | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/bash_completion b/bash_completion
index bf42e008..17a93b65 100644
--- a/bash_completion
+++ b/bash_completion
@@ -2990,8 +2990,17 @@ _comp_complete_longopt()
         _comp_compgen -a filedir
     fi
 }
-# makeinfo and texi2dvi are defined elsewhere.
-complete -F _comp_complete_longopt \
+
+declare -Ag _comp_longopts
+
+_comp__init_install_longopt()
+{
+    for cmd in "$@"; do
+        _comp_longopts[$cmd]="set"
+    done
+}
+
+_comp__init_install_longopt \
     a2ps awk base64 bash bc bison cat chroot colordiff cp \
     csplit cut date df diff dir du enscript expand fmt fold gperf \
     grep grub head irb ld ldd less ln ls m4 mkdir mkfifo mknod \
@@ -3249,8 +3258,9 @@ _comp_load()
     # Look up simple "xspec" completions
     [[ -v _comp_xspecs[$cmdname] || -v _xspecs[$cmdname] ]] &&
         complete -F _comp_complete_filedir_xspec "$cmdname" "$backslash$cmdname" && return 0
-
-    if [[ $flag_fallback_default ]]; then
+    if [[ -v _comp_longopts[$cmdname] || -v _longopts[$cmdname] ]]; then
+        _comp_complete_longopt $cmdname
+    elif [[ $flag_fallback_default ]]; then
         complete -F _comp_complete_minimal -- "$origcmd" && return 0
     fi
 
-- 
2.46.0

@greg-minshall
Copy link
Author

sorry, two things. the affected commands are

    a2ps awk base64 bash bc bison cat chroot colordiff cp
    csplit cut date df diff dir du enscript expand fmt fold gperf 
    grep grub head irb ld ldd less ln ls m4 mkdir mkfifo mknod
    mv netstat nl nm objcopy objdump od paste pr ptx readelf rm rmdir
    sed seq shar sort split strip sum tac tail tee
    texindex touch tr uname unexpand uniq units vdir wc who

and, the following diff (to the result of the above patch) might solve the performance issue i worried about.

diff --git a/bash_completion b/bash_completion
index 17a93b65..6b98ce0c 100644
--- a/bash_completion
+++ b/bash_completion
@@ -3259,7 +3259,8 @@ _comp_load()
     [[ -v _comp_xspecs[$cmdname] || -v _xspecs[$cmdname] ]] &&
         complete -F _comp_complete_filedir_xspec "$cmdname" "$backslash$cmdname" && return 0
     if [[ -v _comp_longopts[$cmdname] || -v _longopts[$cmdname] ]]; then
-        _comp_complete_longopt $cmdname
+        _comp_complete_longopt "$cmdname"
+        complete -F _comp_complete_longopt "$cmdname"
     elif [[ $flag_fallback_default ]]; then
         complete -F _comp_complete_minimal -- "$origcmd" && return 0
     fi

(also fixes a shellcheck warning.)

@scop
Copy link
Owner

scop commented Nov 13, 2024

Sorry about the long delay. The idea in principle sounds good to me.

Could you file this as a pull request so we can review and eventually merge it using the usual process?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants