Acceso a terminaciones de bash para los comandos de programación específica
-
29-09-2019 - |
Pregunta
Estoy tratando de escribir un pequeño lanzador de aplicaciones del sistema, y ??que le gustaría utilizar la ficha terminaciones de golpe en mi propio sistema de finalización. He sido capaz de obtener una lista de las terminaciones de los comandos generales utilizando compgen -abck
.
Sin embargo, también me gustaría que para obtener terminaciones para los comandos específicos: por ejemplo, la entrada de git p
debería mostrar la finalización de los comandos de Git.
¿Hay alguna manera de poder utilizar compgen
para hacer esto? Si no es así, ¿hay alguna otra manera puedo obtener una lista de terminaciones programación?
[EDIT: Para aclarar, no estoy tratando de proporcionar finalización de fiesta - mi aplicación es un lanzador de comandos GUI. Me gustaría simplemente como a terminaciones existentes utilización de golpe de mi propia aplicación.]
Solución
Yo realmente no sé cómo funciona, pero el impresionante gestor de ventanas utilizando el siguiente código para Lua para acceder a consecuencia de la finalización bash:
- Vía
complete -p
encontramoscomplete -o bashdefault -o default -o nospace -F _git git
. Recordamos "_git" para más adelante. - La longitud de "l git" es 5, por lo que nos propusimos COMP_COUNT = 6. Estamos terminando el primer argumento de "git", por lo COMP_CWORD = 1.
Todos juntos utilice la siguiente secuencia de comandos:
__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
Salida: "registro"
Otros consejos
Tome un vistazo a la Administración de Debian Una introducción a la finalización fiesta - Es bastante fácil de entender - por cierto, también tiene un segunda parte
Comprobar en el directorio /etc/bash_completion.d/
. Aquí es donde se quedan los diferentes guiones de terminación de comandos.
A continuación, un simple ejemplo de trabajo, pero en 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 este tipo de código, obtendrá COMMANDn completado cuando se escribe "foo c" + tab y paramN completado cuando se escribe "foo comando1 p" + tab
Puede calcular la lista de terminación de la ayuda de comandos.
MY2C
Me cortó hasta este script hace un tiempo que le da bastante exacto el hombre-Bash página Finalización sé que otras personas han hecho cosas similares con opción de análisis de la salida --help
.