Завершение Bash: отфильтровать резервные файлы (~)

1

Я хотел бы, чтобы bash отфильтровывал файлы резервных копий с именем, оканчивающимся на ~ (тильда), при автозаполнении имен файлов.

Я написал скрипт для установки этого при использовании vim (у меня очень мало опыта работы со скриптами оболочки):

#!/bin/bash

no_backups_complete()
{
    local cur=$2

    COMPREPLY=( $( compgen -o plusdirs -f -X '*\~' -- "$cur" ) )

    return 0
}

complete -o filenames -F no_backups_complete vim

Однако запуск сценария не имеет видимого эффекта, vim [Tab] по-прежнему показывает каждый файл.

Я попытался избежать / не избежать ~ и поместить $ 2 и $ cur в / не в кавычки, без разницы.

Zalorin
источник

Ответы:

1

Синтаксис работает отлично, поэтому, скорее всего, по той или иной причине он не будет добавлен в вашу среду bash.

Посмотрите, загружен ли он в вашей среде:

Откройте новое окно терминала bash и запустите:

declare -F | grep no_backups_complete

Чтобы увидеть объявление функции (если оно доступно):

type no_backups_complete

Если вы получите результат для первой команды, например:

declare -f no_backups_complete

это указывает, что это загружено в окружающую среду; если нет результата, это не так. Ответ типа должен быть «... не найден», если он недоступен, или перечислить определение функции, если он доступен.

Продолжая с предположением, что он не загружен в вашей среде bash:

Где вы положили файл?

  • Обычное местоположение находится в каталоге /etc/bash_completion.d/. Его не нужно отмечать исполняемым, чтобы поместить в этот каталог, или иметь какое-то конкретное имя. У вас правильный формат.

  • В качестве теста просто введите, source /path/to/your/completion.fileа затем посмотрите, игнорирует ли vim файлы, оканчивающиеся на тильды. Это должно - это было сделано в моей оболочке bash.

  • Убедитесь, что вы:
    1. скопировали содержимое из скрипта в ваш файл .bashrc, или
    2. скопировали его в /etc/bash_completion.d/ или
    3. получили файл завершения из .bashrc

Какой бы метод вы ни использовали, если вы не получите исходный файл, вам нужно будет перезапустить терминал, чтобы он включился. Если он находится в каталоге /etc/bash_completion.d, то bash не загрузил его; Мне пришлось закрыть окно терминала и открыть его снова - это может быть связано с конкретной программой терминала, но для этого случая было недостаточно источника .bashrc (вариант 2). Две другие опции начнут работать после того, как будет получен .bashrc.

Если он загружен в вашей среде; то есть declare -F | grep .. и type ..команды возвращают ожидаемые значения, отправлять обратно с результатами. Я думаю, что это гораздо менее вероятно, и стоит пройти эти быстрые проверки, прежде чем идти по этому пути.

аргонавты
источник