Автозаполнение Bash для переменной среды, содержащей имя каталога

10

Я использую, среди прочего, Bash 4.2.37 на Linux Mint 14.

Когда я автоматически заполняю имя переменной среды, печатая Tab, оно расширяется до имени переменной, за которым следует пробел.

Если значением переменной является имя каталога, я хочу, чтобы оно расширилось до имени переменной, за которым следует /.

Например, если я наберу:

$ ls $HOM<tab>

он расширяется до:

$ ls $HOME _

где _отмечает местоположение курсора. Проблема в том, что я обычно хочу продолжать вводить имя некоторого файла или каталога в моем домашнем каталоге, что означает, что я должен набрать, backspaceа затем /.

Поэтому я хочу расширить вышеприведенное:

$ ls $HOME/_

То же самое происходит, когда я набрал полное имя переменной; после ls $HOME, tabдобавляет пробел, и я хочу добавить /.

(И, конечно, я не хочу добавлять a, /если значение переменной не является именем каталога.)

Есть ли какой-то способ, которым я могу сказать bash вести себя так, как я хочу, с помощью команд bash или путем обновления моего $HOME/.inputrc?

Примечание: я специально ищу способ заставить tabсебя вести себя так, как я хочу. Способы достижения одинакового поведения при разных нажатиях клавиш были бы интересны, но не отвечали бы на мой вопрос.

(Я отключил /etc/profile.d/bash_completion.shв своей системе, потому что она плохо взаимодействует с set -o nounset. Быстрый эксперимент показывает, что это, вероятно, не относится к моему вопросу.)

Кстати, tcsh делает это: учитывая переменную окружения $FOOBAR, типизация $FOOBA<tab>расширяется до $FOOBAR/того, ссылается ли она на каталог $FOOBAR(с пробелом), если нет. Нет, этого недостаточно, чтобы убедить меня вернуться к tcsh. Zsh делает это тоже.

Кит Томпсон
источник
+1 Если вам хочется приключений, вот код .
10
@ l0b0: (а) он у меня уже есть. (б) Я не чувствую себя таким авантюрным. (c) Предполагается, что это программируемое завершение.
Кит Томпсон

Ответы:

6

Эта функция реализована в bash 4.3, выпущенном 2014-02-26.

Цитирование NEWSфайла (входит в верхний уровень bash-4.3.tar.gz, см. Также подпись GPG ):

Код завершения слова проверяет, расширяется ли имя файла, содержащего переменную оболочки, до имени каталога и добавляется /к слову соответствующим образом. Тот же код расширяет переменные оболочки в именах команд при выполнении команды завершения.

Быстрый эксперимент с копией, созданной из источника, показывает, что если я наберу

$ ls $HOM<tab>

теперь он расширяется до

$ ls $HOME/

(Кстати, Zsh также делает это.)

Кит Томпсон
источник
1
Для этого пришлось вручную установить bash. 4.3 нет в Fedora 20 репо.
Jozxyqk