Вместо того, чтобы продолжать комментировать ...
complete -f -X '!*.@(zip|udp)' unzip
следует добавить завершение для
-f -X '!*.@(zip|udp)'
| | | |||________|
| | | || |
| | | || +- filterpat: zip or udp
| | | |+------------- @ : Matches one of the given patterns
| | | +-------------- *. : Anything+<dot>
| | +---------------- ! : Negate
| +------------------- -X : Filter out matches in "filterpat"
+---------------------- -f : files
Другими словами: заполните файлы и удалите все, не оканчивающиеся на .zipили .udp.
Дополнительно
Если вы добавите -o defaultзавершение, вы завершите / сопоставите все файлы и каталоги, если нет файлов, оканчивающихся на .zipили .udp.
Если вы добавите -o plusdirsзавершение, вы добавите любые каталоги в дополнение к любым совпадениям файлов, оканчивающихся на .zipили .udp.
Текущий
При использовании complete -p unzipвы получаете текущий шаблон.
Из ваших комментариев это звучит в основном так, как будто вы пропустили +или @в шаблоне, как в:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
что означает совпадение с любым файлом, буквально оканчивающимся на.(zip|udp) . Например
touch 'file_test.(zip|udp)'
Также взгляните на этот раздел руководства:
это возможно, например extglob, не включен. Включить с помощью:
shopt -s extglob
Проверьте текущее состояние всех shoptнастроек, введя:
shopt
функция
Если -F somethingэто так, значит, он использует функцию с именем что-то для генерации списка завершений.
_filedir_xspec, Как правило , является функцией Debian. У вас может быть что-то вроде этого:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Что означает /usr/share/bash-completion/bash_completionполучить источник. Здесь вы найдете соответствующую функцию . Несколькими строками ниже вы видите, что эта функция / завершение добавляется функцией с именем _install_xspecнапример:
_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo
Ручные записи:
Обновление к комментариям 1:
- Нет совпадения из-за неправильных архивов или прав доступа к файлам.
Это не должно повлиять на результат. completeсопоставляет только файлы, заданные правилами, и не обрабатывает файлы. Если вы можете перечислить их с ls, они должны совпадать.
В качестве примечания можно добавить такую функциональность, используя полную функцию:
function _unzip_validated() {
# 1. Generate list of files ending in e.g. .zip and .udp
# 2. Validate each file and remove invalid ones from file list.
}
complete -F _unzip_validated unzip
- Цвета. Почему lsотличается test.zipот test.upd?
Это не влияет complete. Цвета lsпредоставлены $LS_COLORS. Пытаться:
echo "$LS_COLORS" | tr : '\n' | sort
Вы должны увидеть что-то вроде *.zip=01;31:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp с другой стороны, нет записи, связанной с ним, поэтому нет окраски.
Следующий шаг (должен был быть первым)
- Откройте терминал и перейдите в каталог с тестовыми файлами. Оба .zip и .udp
- Войти
bash --norc
- Войти
complete -f -X '!*.@(zip|udp)' unzip
- Войти
shopt -s extglob
- Войти
unzip <tab><tab>
Результат?
Кроме того, нажмите изменить под вашим вопросом и добавьте вывод:
bind -V
shopt
env
может быть полезным
complete -p unzipдаетcomplete -f -X '!*.@(zip|udp)' unzipиunzip <tab>завершает файл с именемtest.zip. Тем не менее, каталог также содержит файл с именем,test.updкоторый не найден при завершении вкладкиunzip. Может, факт прав доступа к файлу или нулевая длина файла могут объяснить это странное поведение?