Вместо того, чтобы продолжать комментировать ...
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
. Может, факт прав доступа к файлу или нулевая длина файла могут объяснить это странное поведение?