¿Cómo enviar terminaciones de cadena a stdout?

15

Algunos de los gitcomandos tienen muchas opciones, y a menudo sería útil buscar a través de ellos el que necesito: solo estaba buscando la opción que controla el TABancho git-gui, pero hay alrededor de 200 compleciones git config. Una solución obvia es copiar todas las terminaciones en un editor y buscar en ellas, pero prefiero hacer

[something] | grep tab

No hay manni infopáginas para compgen, help compgenni siquiera explica sus propias opciones, y no hay autocompletado paracompgen (¿cómo es eso de ironía?).

PD: compgen -A no funciona.

PPS: Esta no es una pregunta sobre git-gui: la solución a la pregunta de ancho de pestaña estaba en otra parte.

PPPS: no se trata de comandos de autocompletado, solo de parámetros de comando .

l0b0
fuente
Esto es muy similar a ¿Cómo canalizar la salida de "pestaña completa"? , pero la respuesta aceptada allí fue específicamente para completar comandos, no argumentos
Michael Mrozek

Respuestas:

10

Puede usar la siguiente función, que usa la misma forma sudoen que la finalización automática genera la lista de finalización:

comp() {
    local COMP_LINE="$*"
    local COMP_WORDS=("$@")
    local COMP_CWORD=${#COMP_WORDS[@]}
    ((COMP_CWORD--))
    local COMP_POINT=${#COMP_LINE}
    local COMP_WORDBREAKS='"'"'><=;|&(:"
    # Don't really thing any real autocompletion script will rely on
    # the following 2 vars, but on principle they could ~~~  LOL.
    local COMP_TYPE=9
    local COMP_KEY=9
    _command_offset 0
    echo ${COMPREPLY[@]}
}
comp git config ''

donde _command_offsetse define en bash-complete (paquete).

NOTA: la función debe ejecutarse en un shell interactivo (es decir, si está en un archivo, el archivo debe obtenerse en lugar de simplemente ejecutarse) o las reglas / funciones de finalización necesarias no se definirán.

PD. compgen -Asolo funciona para acciones integradas, lo que debería haber intentado (pero tampoco funciona) es compgen -F(o en realidad compgen -o bashdefault -o default -o nospace -F _git). La razón por la que esto no funciona (y el documento para los comandos integrados de bash, incluido compgen / complete) se puede encontrar en bash (1) .

yuyichao
fuente
@ l0b0 espero que funcione en todos los casos.
yuyichao
Excelente, funciona! Hice un par de pequeños ajustes y ahora está en mis .bash_aliases para siempre. Es posible que desee podar para que solo quede la solución, pero no hay duda de que obtiene la recompensa. Eliminaré mis comentarios de discusión ya que ya no son relevantes.
l0b0
1
He descubierto que usar esto en el shell interactivo puede destruir la finalización de la pestaña que ya está en su lugar. Hacer cada una de las variables locales a la función resuelve ese problema. (por ejemplo local COMP_LINE="$*")
AL Flanagan
@ALFlanagan Buen punto. Actualizado.
yuyichao