Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can bash completion be invoked programmatically?

What I want is a function I can call from a program so it completes the way bash would given a commandline and a location where TAB was pressed.

. /etc/bash_completion
generate_completions "command arg1 arg2" 17

would return the same thing as

command arg1 arg2[TAB]

I haven't seen any way to do this.

like image 931
jpkotta Avatar asked Jul 15 '11 21:07

jpkotta


People also ask

How do bash completions work?

Bash completion is a bash function that allows you to auto complete commands or arguments by typing partially commands or arguments, then pressing the [Tab] key. This will help you when writing the bash command in terminal.

Where do bash completion files go?

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.

What is Linux command completion?

Command-line completion allows the user to type the first few characters of a command, program, or filename, and press a completion key (normally Tab ↹ ) to fill in the rest of the item. The user then presses Return or ↵ Enter to run the command or open the file.


1 Answers

I actually had to do this to figure out how apt-get autocomplete works on ubuntu (built my own pseudo-repository tool :)

This is a multistep process:

First, complete -p will give you a listing of all completions in the form of a set of commands you can run to replicate the configuration. For example, lets say you want to hunt down the autocomplete for apt-get. Then:

$ complete -p | grep apt-get
complete -F _apt_get apt-get

This tells you that the shell function _apt_get is called by the completion mechanism.

You need to recreate the special variables used by the function,, namely COMP_LINE (the full line), COMP_WORDS (bash array of all of the arguments -- basically split COMP_LINE), COMP_CWORD (index, should point to last value), COMP_POINT (where within the word you are doing the autocomplete), and COMP_TYPE (this is how you tell it that you want to complete as if you hit tab).

Note: read the manpage for more info -- this is how i figured it out in the first place. man bash

like image 96
Foo Bah Avatar answered Sep 30 '22 17:09

Foo Bah