Автоматичне завершення Bash для змінної середовища, що містить ім'я каталогу


10

Я використовую, серед іншого, баш 4.2.37 на Linux Mint 14.

Коли я автоматично заповнюю ім'я змінної середовища, набравши текст Tab, воно розширюється до імені змінної, після чого пробіл.

Якщо значення змінної буває іменем каталогу, я хочу, щоб вона розширилася до імені змінної, після чого /.

Наприклад, якщо я набираю:

$ ls $HOM<tab>

він розширюється до:

$ ls $HOME _

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

Тому я хочу, щоб вищезазначене розширилося на:

$ ls $HOME/_

Те саме відбувається, коли я набрав всю назву змінної; після ls $HOME, tabдодає пробіл, і я хочу, щоб він додав /.

(І звичайно, я не хочу, щоб він додавав а, /якщо значення змінної не є ім'ям каталогу.)

Чи я можу підказати bash поводитись так, як я хочу, або через команди bash, або оновивши свою $HOME/.inputrc?

Примітка. Я спеціально шукаю спосіб змусити tabсебе вести себе так, як я хочу. Способи досягнення однакової поведінки різними натисканнями клавіш були б цікавими, але не відповіли б на моє запитання.

(Я відключив /etc/profile.d/bash_completion.shсвою систему, оскільки вона погано взаємодіє з set -o nounset. Швидкий експеримент вказує, що це, мабуть, не стосується мого питання.)

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


+1 Якщо ви відчуваєте пригоди, ось код .
l0b0

@ l0b0: (a) У мене вже є. (б) Я не відчуваю себе такою авантюрністю. (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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.