Как предотвратить bash для автозаполнения конечной точки?

Допустим, у меня есть имя файла и разные расширения:

test.tex test.pdf 

Легче вводить имя файла без расширения, а затем все имя файла. Это возможно, потому что соответствующая программа знает расширение, которое им нужно, и добавляет его автоматически. Следующие примеры отлично работают:

 tex test pdf-viewer test 

Но использование завершения bash здесь постоянно меня раздражает, добавляя конечную точку. Например:

 tex te<TAB> 

превращается в

 tex test. 

Но приложение будет работать с ошибкой; Я должен ударять назад каждый раз после того, как я нажал <TAB> 🙁

Как сказать bash не добавлять конечную точку при выполнении автозаполнения?

Там может быть более простой способ, но это, похоже, работает:

 texfiles () { names=( "$2"*.tex ); COMPREPLY=( "${names[@]%.tex}" ); } complete -F texfiles tex 

Сначала создается функция оболочки, называемая texfiles . Он использует второй аргумент командной строки ( $2 , слово, введенное пользователем в командной строке перед нажатием Tab для завершения слова), и заполняет массив COMPREPLY всеми именами, которые соответствуют "$2"*.tex .

Для каждого из этих имен суффикс .tex удаляется перед добавлением его в массив.

Затем используется complete команда, чтобы сообщить оболочке выполнить функцию texfiles для завершения имени файла для команды tex . Вы можете повторить ту же самую complete команду для всех команд, которые должны завершать файлы .tex таким же образом. Для pdf-viewer вы можете создать соответствующую функцию pdffiles (имена этих функций произвольны).

Это в действии ( <tab> означает, что я нажимаю клавишу Tab ):

 bash-4.4$ ls -l total 0 -rw-r--r-- 1 kk wheel 0 Sep 28 21:43 README.txt -rw-r--r-- 1 kk wheel 0 Sep 28 21:12 file.tex -rw-r--r-- 1 kk wheel 0 Sep 28 21:24 file2.tex -rw-r--r-- 1 kk wheel 0 Sep 28 21:25 hello.tex bash-4.4$ tex <tab><tab> file file2 hello bash-4.4$ tex bash-4.4$ tex f<tab>ile<tab><tab> file file2 bash-4.4$ tex file 

( file ile вставлен в оболочку)

Прочтите раздел «Программируемое завершение» руководства bash для деталей gory.

Добавьте специальную спецификацию завершения для команды tex в ваш .bashrc . После того, как tex должен использовать завершение имени файла, вы можете добавить фильтр, чтобы удалить любой аргумент, который не соответствует *.tex из возможных завершений.

 complete -f -X '!*.tex' 

Теперь, если в вашем каталоге были test.tex , test.aux и test.pdf , префикс test будет завершен только для test.tex . Это завершает полное имя файла, который вы хотите, а не пропускаете . для создания ярлыка.