Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing bash completions for specific commands programmatically

Tags:

I'm trying to write a small command launcher application, and would like to use bash's tab completions in my own completion system. I've been able to get a list of completions for general commands using compgen -abck.
However, I would also like to get completions for specific commands: for instance, the input git p should display completion for git's commands.

Is there any way I can use compgen to do this? If not, are there any other ways I can get a list of completions programmatically?

[EDIT: To clarify, I'm not trying to provide completion to bash - my app is a GUI command launcher. I'd simply like to use bash's existing completions in my own app.]

like image 639
Donald Harvey Avatar asked Aug 19 '10 10:08

Donald Harvey


People also ask

Does bash have tab completion?

Bourne shell and csh do not, but ksh, bash, tcsh, and zsh all have tab completion to varying degrees. The basic principle in all of these shells is the same; you type the start of the word, hit the <TAB> key twice, and the list of possible commands or files is displayed.

Where do bash completion files go?

A. Put them in the completions subdir of $BASH_COMPLETION_USER_DIR (defaults to $XDG_DATA_HOME/bash-completion or ~/. local/share/bash-completion if $XDG_DATA_HOME is not set) to have them loaded automatically on demand when the respective command is being completed.

How do I know if bash completion is installed?

Depending on your package manager, you have to manually source this file in your ~/. bashrc file. Reload your shell and verify that bash-completion is correctly installed by typing type _init_completion .


3 Answers

I don't really know how it works, but the awesome window manager uses the following Lua code for getting access to bash completion's result:

https://github.com/awesomeWM/awesome/blob/master/lib/awful/completion.lua#L119

  1. Via complete -p we find complete -o bashdefault -o default -o nospace -F _git git. We remember "_git" for later.
  2. The length of "git l" is 5, so we set COMP_COUNT=6. We are completing the first argument to "git", so COMP_CWORD=1.

All together we use the following script:

__print_completions() {     printf '%s\n' "${COMPREPLY[@]}" }  # load bash-completion functions source /etc/bash_completion  # load git's completion function _completion_loader git  COMP_WORDS=(git l) COMP_LINE='git l' COMP_POINT=6 COMP_CWORD=1 _git __print_completions 

Output: "log"

like image 92
Uli Schlachter Avatar answered Oct 20 '22 00:10

Uli Schlachter


Check in the /etc/bash_completion.d/ directory. This is where the different command completion scripts stay.

like image 28
Daniel Avatar answered Oct 19 '22 22:10

Daniel


Quite an old question, but in the mean time I've implemented a script that handles this to reuse completions with ZSH

like image 20
Treviño Avatar answered Oct 20 '22 00:10

Treviño