Как вывести завершение строки в стандартный вывод?

15

У некоторых gitкоманд есть много опций, и часто было бы полезно найти в них ту, которая мне нужна - я просто искал опцию, которая контролирует TABширину git-gui, но есть около 200 дополнений git config. Очевидный обходной путь - скопировать все дополнения в редактор и поискать их, но я бы предпочел сделать

[something] | grep tab

Там нет manили infoстраниц для compgen, help compgenдаже не объясняет свои собственные варианты, и нет автозаполнения для compgen(как это для иронии?).

PS: compgen -Aне работает.

PPS: Это не вопрос о git-gui- Решение вопроса о ширине вкладки было в другом месте.

PPPS: речь идет не об автозаполнении команд, а только о параметрах команды .

l0b0
источник
Это очень похоже на Как передать вывод «Tab Complete»? , но принятый ответ там был специально для выполнения команд, а не аргументов
Михаил Мрозек

Ответы:

10

Вы можете использовать следующую функцию, которая использует тот же способ, которым sudoавтоматическое завершение генерирует список завершения:

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 ''

где _command_offsetопределяется в bash-завершении (пакете).

ПРИМЕЧАНИЕ: функция должна быть запущена в интерактивной оболочке (т. Е. Если она находится в файле, файл должен быть получен, а не просто запущен), иначе необходимые правила / функции завершения не будут определены.

PS. compgen -Aработает только для встроенных действий, то, что вы должны были попробовать (но тоже не работает) compgen -F(или на самом деле compgen -o bashdefault -o default -o nospace -F _git). Причина, по которой это не работает (и документация для встроенных команд bash, включая compgen / complete), может быть найдена в bash (1) .

yuyichao
источник
@ l0b0, надеюсь, работает во всех случаях.
yuyichao
Отлично, это работает! Я сделал несколько небольших изменений, и теперь это навсегда в моем .bash_aliases . Возможно, вы захотите обрезать, чтобы осталось только решение, но нет сомнений, что вы получите награду. Я удалю свои комментарии к обсуждению, так как они больше не актуальны.
10
1
Я обнаружил, что использование этого в интерактивной оболочке может уничтожить уже завершенное табуляция. Создание каждой из переменных локально для функции решает эту проблему. (например local COMP_LINE="$*")
А.Л. Фланаган
@ALFlanagan Хорошая мысль. Обновлено.
yuyichao