Настроить вкладку в оболочке
Это может быть лучшее имя, чем "создание пользовательских вкладок", но здесь сценарий:
Обычно, когда я нахожусь в командной строке, и я ввожу команду, а затем дважды {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 Завершение проекта.
Ответ 2
Вы можете посмотреть Программируемое завершение в руководстве 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 ""