Domanda

Sto cercando di scrivere una piccola applicazione launcher di comando, e vorrebbe utilizzare completamenti scheda di bash nel mio sistema di completamento. Sono stato in grado di ottenere un elenco di completamenti per i comandi generali che utilizzano compgen -abck.
Tuttavia, vorrei anche per ottenere completamenti per comandi specifici: per esempio, il git p ingresso dovrebbe visualizzare il completamento per i comandi di Git.

C'è un modo posso usare compgen per fare questo? In caso contrario, ci sono altri modi in cui posso ottenere un elenco di completamenti di programmazione?

[EDIT: Per chiarire, io non sto cercando di fornire di completamento di bash - la mia app è un lanciatore di comando GUI. Avevo semplicemente come a completamenti esistenti uso di bash nella mia stessa app.]

È stato utile?

Soluzione

Io non so davvero come funziona, ma il impressionante window manager utilizza il seguente codice Lua per ottenere l'accesso al risultato di completamento bash:

https://github.com/awesomeWM/ impressionante / blob / master / lib / pessimo / completion.lua # L119

  1. Via complete -p troviamo complete -o bashdefault -o default -o nospace -F _git git. Ricordiamo "_git" per dopo.
  2. La lunghezza "l git" è 5, quindi abbiamo impostato COMP_COUNT = 6. Stiamo completando il primo argomento di "Git", in modo da COMP_CWORD = 1.

Tutti insieme abbiamo utilizzare il seguente 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"

Altri suggerimenti

Date un'occhiata presso l'Amministrazione Debian Un'introduzione al completamento bash - è abbastanza facile da capire - a proposito, ma ha anche un seconda parte

Controlla nella directory /etc/bash_completion.d/. Questo è dove soggiornano i diversi script di completamento dei comandi.

Ecco un semplice esempio di lavoro, ma in bash:

function foo_completion()
{
    local currentWord=${COMP_WORDS[COMP_CWORD]}
    local completionList=""

    case "${COMP_CWORD}" in
        "1")
            completionList="command1 command2 command3";
            ;;
        "2")
            completionList="param1 param2 param3";
            ;;
    esac

    COMPREPLY=( $( compgen -W "${completionList}" -- ${currentWord} ) )
}

complete -F foo_completion foo

Con questo tipo di codice, si otterrà commandn completato quando si digita "foo c" + scheda e paramN completato quando si digita "foo command1 p" + scheda

È possibile calcolare l'elenco di completamento dal comando help.

MY2C

I hackerato in questo script un po 'indietro che vi dà abbastanza preciso Man-page Bash Completamento so che altre persone hanno fatto cose simili con l'analisi di uscita opzione --help.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top