Замість того, щоб продовжувати коментувати…
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
. Чи може пояснити факт дозволу на файл чи нульову довжину файлу цю дивну поведінку?