Настроить завершение табуляции в оболочке

Это может иметь лучшее название, чем «завершение настраиваемой вкладки», но вот сценарий:

Обычно, когда я нахожусь в командной строке и ввожу команду, а затем дважды нажимаю {TAB}, я получаю список всех файлов и подкаталогов в текущем каталоге. Например:

[user@host tmp]$ cat <TAB><TAB>
chromatron2.exe                  Fedora-16-i686-Live-Desktop.iso  isolate.py
favicon.ico                      foo.exe                          James_Gosling_Interview.mp3

Однако я заметил, что по крайней мере одна программа каким-то образом фильтрует этот список: wine. Рассмотреть возможность:

[user@host tmp]$ wine <TAB><TAB>
chromatron2.exe  foo.exe

Он эффективно фильтрует результаты до *.exe.

Думая, что это может быть какой-то сценарий-оболочка, отвечающий за фильтрацию, я сделал which и file, и оказалось, что wine - это не скрипт, а исполняемый файл.

Теперь я не знаю, закодирован ли этот «фильтр» каким-то образом в самой программе или иным образом указан во время установки вина по умолчанию, поэтому я не уверен, подходит ли этот вопрос больше для stackoverflow или суперпользователя, поэтому я скрещиваю пальцы и бросаю сюда. Прошу прощения, если не угадал. (Кроме того, я проверил несколько похожих вопросов, но большинство из них были неуместными или касались редактирования конфигурации оболочки.)

Итак, мой вопрос: как осуществляется эта «фильтрация»? Заранее спасибо.


person jedwards    schedule 08.06.2012    source источник
comment
завершение табуляции зависит от оболочки, какую оболочку вы используете (echo $SHELL)   -  person tobyodavies    schedule 08.06.2012
comment
Извините, я использую bash. Редактировать: 4.2.24   -  person jedwards    schedule 08.06.2012


Ответы (3)


Скорее всего, вы найдете в своей системе файл с именем /etc/bash_completion, который полон функций и complete команд, которые настраивают это поведение. Файл будет получен из одного из файлов запуска вашей оболочки, например ~/.bashrc.

Также может быть каталог с именем /etc/bash_completion.d, который содержит отдельные файлы с дополнительными функциями завершения. Источником этих файлов является /etc/bash_completion.

Вот как выглядит команда завершения wine из /etc/bash_completion в моей системе:

complete -f -X '!*.@(exe|EXE|com|COM|scr|SCR|exe.so)' wine

Этот набор файлов в значительной степени поддерживается проектом Bash Completion.

person Dennis Williamson    schedule 08.06.2012
comment
У меня действительно есть эти файлы, а также строка, которую вы упомянули. Спасибо за исчерпывающий ответ :-) - person jedwards; 08.06.2012

Вы можете взглянуть на Programmable Completion в руководстве по bash, чтобы понять, как это работает. .

person Diego Torres Milano    schedule 08.06.2012
comment
Убедитесь, что вы сделали его совместимым для пользователей ZSH! Это руководство простое и позволяет легко понять, как обычно реализуется завершение: linux-mag.com /id/1106 - person Jeffrey Vandenborne; 08.06.2012

Я знаю, что это старо, но я хотел сделать что-то подобное с моим собственным сценарием.

Вы можете поиграть с примером, который я сделал здесь: http://runnable.com/Uug-FAUPXc4hAADF/autocomplete-for-bash

Вставил код сверху:

# Create function that will run when a certain phrase is typed in terminal
# and tab key is pressed twice
_math_complete()
{
    # fill local variable with a list of completions
    local COMPLETES="add sub mult div"
    # you can fill this variable however you want. example:
    # ./genMathArgs.sh > ./mathArgsList
    # local COMPLETES=`cat ./mathArgsList`

    # we put the completions into $COMPREPLY using compgen
    COMPREPLY=( $(compgen -W "$COMPLETES" -- ${COMP_WORDS[COMP_CWORD]}) )
    return 0
}

# get completions for command 'math' from function '_math_complete()'
complete -F _math_complete math 

# print instructions
echo ""
echo "To test auto complete do the following:"
echo "Type math then press tab twice." 
echo "You will see the list we created in COMPLETES"
echo ""
person AnandKumar Patel    schedule 31.01.2014
comment
Спасибо за хороший яркий пример. Мне нравится идея использования вымышленной команды для демонстрации концепции. Я использовал его для разработки и автозаполнения для zlogin. - person Philip Kearns; 01.02.2017