Настроить вкладку в оболочке

Это может быть лучшее имя, чем "создание пользовательских вкладок", но здесь сценарий:

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

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

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

[[email protected] tmp]$ wine <TAB><TAB>
chromatron2.exe  foo.exe

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

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

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

Итак, мой вопрос: как эта "фильтрация" выполнена? Спасибо заранее.

Ответы

Ответ 1

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

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

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

complete -f -X '!*[email protected](exe|EXE|com|COM|scr|SCR|exe.so)' wine

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

Ответ 3

Я знаю, что это старо, но я искал что-то подобное с script.

Вы можете поиграть с примером, который я сделал здесь: 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 ""