Intereting Posts
Как установить легкий vim и иметь возможность эффективно загружать файлы в один экземпляр vim? Как я могу заплатить с mailx? systemd, используя 100% моего процессора, если нет, если я запустил его без systemd Сценарий Ed работает только в том случае, если набирается медленно gnuplot, ось формата с постоянной мощностью 10 Сортировка файлов в каталоге по времени доступа, игнорируя подмножество из них логика удаления файлов, где пользователь не имеет права писать Что произойдет, если оболочка по умолчанию для пользователей не установлена? sudo не сохраняет PS1 Почему мой bash не включает в себя интерактивный флаг для этого скрипта? Отображение кнопки Xinput и эмуляция средней кнопки Замена символа в случайной позиции с помощью sed? git развертывание с использованием sudo nopasswd Почему способность определять функции в переменной окружающей среды не является угрозой безопасности сама по себе? Korn / Bash Shell: Как мне конвертировать содержимое в приведенный ниже формат?

Как предотвратить 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 . Это завершает полное имя файла, который вы хотите, а не пропускаете . для создания ярлыка.