Вместо того, чтобы продолжать комментировать ...
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
. Может, факт прав доступа к файлу или нулевая длина файла могут объяснить это странное поведение?~/bin/testing
2.complete -f -X '!*.@(zip|udp)' testing
, 3.testing <tab><tab>
?shopt
…extglob
активирован Пример с «test» выбираетzip
файл только снова. Я заметил, чтоtest.zip
отображается красным цветом, в то времяtest.upd
как отображается белым цветомls -l
, оба файла пусты с одинаковыми разрешениями, владельцем смещения и связью группы. Почемуls
отличаетсяtest.zip
отtest.upd
? Может быть, это подсказка к моей проблеме?В файле
/etc/bash_completion
, который вы, вероятно, где-то используете, завершение по умолчанию, по крайней мере для моей версииbash
(v4.2.25):Попробуйте изменить все выражение на
И добавить в свой
.bash_profile
источник
unzip <tab>
не найдет.zip
ни.upd
файлов, ни других файлов.gzip
с.gz
файлами?gunzip
с.gz
файлами выберите только те файлы , оканчивающиеся на.gz
, но это определение также различны:complete -F _filedir_xspec gunzip
./etc/bash_completion
в вашем.bashrc
?shopt -s extglob
Попробуйте добавить эту строку в ваш .bashrc:
источник
.udp
файлы, но только если нет.zip
файлов. Если atest.zip
иtest.udp
file присутствуют в текущем каталоге,unzip <tab>
перечисляются только.zip
файлы. Я ожидаю увидеть оба файла (то есть завершение bash дастtest.
).udp
иzip
файлы. Вы источник.bashrc
после добавления строки?unzip <tab>
список всех файлов, даже те, которые заканчиваются в другой фразе. Теперь именно то, что мне нужно.complete -f -o default -X '!*.zip' unzip
иcomplete -f -o default -X '!*.udp' unzip
Лучше использовать
_filedir
вместо «сырых»complete
.обоснование
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
~
) расширяются/home/tux/Do<TAB><TAB>
списка, который вы получаете в качестве ответа, удаляется «/ home / tux» и, следовательно, он намного более компактенMWE
источник