Не автозаполнение определенных расширений из имен файлов в оболочке для vim - PullRequest
0 голосов
/ 10 октября 2018

Я заметил действительно классную особенность завершения bash в bash.Допустим, у меня есть каталог с файлами

a.java
a.class
b.java
b.class

, если я начну печатать vim a Tab , bash будет автоматически завершать a.java.Он знает, что я не хочу редактировать a.class

Мне было интересно, как он достигает такого поведения.В моем каталоге bash_completion.d есть куча completion файлов, но vim не имеет ни одного.Как vim достигает такого поведения, и как я могу изменить его, чтобы включить другие расширения файлов, чтобы игнорировать?

1 Ответ

0 голосов
/ 10 октября 2018

В Ubuntu, если я установлю пакет bash-completion, я могу увидеть его содержимое с:

$ dpkg -L bash-completion

В выводе указан /etc/bash_completion.
Внутри, следующая команданаписано:

. /usr/share/bash-completion/bash_completion

Исходный файл /usr/share/bash-completion/bash_completion.

Расположение этих файлов варьируется от операционной системы к другой:

Примечание: я использую Mac, а на macOS сохраняется файл завершения bash(по умолчанию) в /usr/local/etc/bash_completion, а каталог bash_completion.d в /usr/local/etc/bash_completion.d

В моей системе /usr/share/bash-completion/bash_completion содержит эту строку:

_install_xspec '*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)' vi vim gvim rvim view rview rgvim rgview gview emacs xemacs sxemacs kate kwrite

Iдумаю, что эта строка отвечает за поведение, которое вы наблюдаете.

Если вы хотите настроить его, чтобы bash исключил расширения foo и bar при заполнении имени файла после команды $ vim, выможно попробовать следующую процедуру .

  1. Создать файл ~/.bash_completion

Внутри последнего напишите:

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done

Создайте каталог ~/.bash_completion.d/.

Внутри этого каталога создайте файл vim.

Внутризатем напишите:

complete -f -X '*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class|foo|bar)' vi vim gvim rvim view rview rgvim rgview gview

complete - встроенная команда bash, которая позволяет вам указать, как аргументы имени команды должны быть завершены.
-f - сокращение для -A file,который указывает bash, что вы хотите видеть только имена файлов в ваших предложениях.
-X исключает все, что соответствует следующему шаблону.

Обратите внимание, что я просто скопировал шаблон, используемый в /usr/share/bash-completion/bash_completion, идобавлены foo и bar расширения:

*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class|foo|bar)
                                                                           ^^^^^^^

Вам нужно изменить шаблон, чтобы исключить реальные расширения, которых вы хотите избежать.

Имена после шаблона сообщаютbash, для которых команды должны исключать эти расширения.
В предыдущей команде это:

vi vim gvim rvim view rview rgvim rgview gview

Все они вызывают версию Vi или Vim.Вы можете добавить другие имена редакторов в конце.

Для получения дополнительной информации см .:

$ man bash

Найдите раздел READLINE и подраздел Programmable Completion, а также описаниеcomplete встроенный в секцию SHELL BUILTIN COMMANDS.

См. также Введение в завершение bash, часть 1 и Введение в завершение bash, часть 2 .

...