Включение bash-complete отключает поведение по умолчанию автозаполнения имен файлов - PullRequest
0 голосов
/ 06 февраля 2019

Моя make версия в macOS High Sierra Версия 10.13.6 выглядит следующим образом:

$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0

Моя версия Bash выглядит следующим образом:

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.

Моя текущая директория выглядит такэто:

$ ls -1
Makefile
a.txt
b.txt
c.txt

Мой Makefile выглядит так:

hello:
        echo hello

%.txt: FORCE
        cat "$@"

FORCE:

Случай 1: Без bash-completion

Когда у меня не установлено bash-completionЯ могу удобно автоматически заполнять имена файлов в текущем каталоге в качестве целевого аргумента для make.Я имею в виду, если я наберу:

make a<TAB>

, он автоматически завершится до:

make a.txt

Случай 2: С bash-completion

Когда у меня будет bash-completion (например, с brew install bash-completion), я больше не могу использовать это поведение.

Если я наберу:

make a<TAB>

, оно вообще не будет автозаполняться.Теперь он выполняет автозаполнение других целей, таких как make he<TAB> и make FO<TAB>, что раньше было невозможно, но я теряю автозаполнение любых произвольных имен файлов.

Вопрос

  • Почему происходит установка bash-completion отключить поведение автозаполнения текущих имен файлов по умолчанию?Я думаю, что это очень удобное поведение.
  • Как мне вернуть это поведение без удаления bash-completion.Если я могу сделать это, я могу иметь лучшее из обоих миров.Используйте автозаполнения, предоставляемые bash-completion, а также автозаполнение имен файлов в текущем каталоге.

1 Ответ

0 голосов
/ 06 февраля 2019

Чтобы ответить на первую часть вашего вопроса, я думаю, что большинство людей не хотели бы, чтобы Bash предлагал файлы в рабочем каталоге в качестве рекомендуемых целей для make.

Но вы можете настроить поведение без особых проблем.

Некоторые полезные документы по Bash Tab Completion можно найти здесь .

Похоже, что исходный код Bash Completion, используемый в Mac OS X, здесь здесь.Вот строка, которая вас волнует:

COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
    awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
    {split($1,A,/ /);for(i in A)print A[i]}' )" \
    -- "$cur" ) )

Вы можете видеть, что встроенная в нее compgen генерирует список возможных завершений на основе вывода make -qp Makefile ..

Вы можете взломать это, чтобы работать так, как вы этого хотите.Сначала скопируйте файл автозаполнения, относящийся к марке, в свой файл завершения bash:

cp /usr/local/Cellar/bash-completion/1.3_3/etc/bash_completion.d/make ~/.bash_completion

Затем отредактируйте этот файл, чтобы указать немного другое поведение.Здесь я покажу различие:

--- /usr/local/Cellar/bash-completion/1.3_3/etc/bash_completion.d/make  2019-02-06 18:35:00.000000000 +1100
+++ /Users/alexharvey/.bash_completion  2019-02-06 18:34:36.000000000 +1100
@@ -62,7 +62,7 @@

         COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
             awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
-            {split($1,A,/ /);for(i in A)print A[i]}' )" \
+            {split($1,A,/ /);for(i in A)print A[i]}' ; ls * )" \
             -- "$cur" ) )

     fi

Обратите внимание, что все, что я сделал, это добавил вывод ls * к ответу, возвращенному в compgen, чтобы он считал файлы в рабочем каталогеТакже возможны вкладки дополнений.

И это все.Запустите новую оболочку.

...