Accedendo completamenti bash per comandi specifici di programmazione
-
29-09-2019 - |
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.]
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
- Via
complete -p
troviamocomplete -o bashdefault -o default -o nospace -F _git git
. Ricordiamo "_git" per dopo. - 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
.