phdru.name / Russian / Software

Автодополнение в bash и mc

Автодополнение в bash (точнее, в readline) и прочих программах - весьма удобная функциональность, сильно облегчающая набор большой командной строки. Из "прочих программ" я имею ввиду в основном Midnight Commander и vim; bash, mc, vim и python - 4 основных программы, которыми я пользуюсь; bash и python используют readline, а mc и vim имеют свои механизмы ввода, имитирующие readline, и имитирующие довольно хорошо.

Недостатком настройки автодополнения readline по умолчанию является то, что автодополнение выполняется только по именам файлов в текущей директории, за исключением первого слова в строке, для которого, конечно, автодополнение выполняет поиск программ в PATH. Но если, например, первым словом является exec, то после него опять должно идти имя программы, а вот этого readline уже по умолчанию не делает. Ещё хуже автодополнение после команд ping, traceroute и тому подобных - после них должно идти имя хоста. В readline есть для этого возможности - по умолчанию сочетания клавиш [Meta]+[/] выполняет автодополнение имени файла, [Meta]+[!] выполняет автодополнение имени программы, [Meta]+[@] выполняет автодополнение имени хоста, [Meta]+[~] выполняет автодополнение имени пользователя, [Meta]+[$] выполняет автодополнение имени переменной окружения (на клавиатурах без [Meta] её роль играет [Esc]). Но насколько было бы удобнее, если бы readline понимала бы, в каком месте командной строки происходит ввод, и выполняла бы автодополнение именно того, что надо дополнить, по одной клавише [Tab].

Это можно настроить! Достаточно вставить в .bashrc несколько команд.

Этап первый - научить readline выполнять автодополнение имени программы после exec:

complete -A command exec

Этап второй - научить readline выполнять автодополнение имени хоста для команд, требующих имени хоста. Шаг первый:

complete -A hostname dig host nslookup ping traceroute tcptraceroute telnet ftp lftp ssh scp rsync

Шаг второй:

export HOSTFILE="$HOME"/lib/config/hosts

Эта команда определяет, из какого файла readline будет брать список хостов для автодополнения. По умолчанию он берёт их из /etc/hosts.

Шаг третий - создать файл hosts. У меня он выглядит приблизительно так:

0 localhost.localdomain localhost
0 iskra iskra.aviel.ru iskra-aviel.phdru.name
0 phdru.name home.phdru.name git.phdru.name zope.phdru.name

В первой колонке в /etc/hosts стоят адреса IP, а в моём файле hosts - нули. Для readline эта колонка вообще не имеет значения.

Midnight Commander, увидев эту переменную окружения и этот файл hosts, тоже её использует, а в их отсутствие - опять-таки обращается к /etc/hosts. Но увы, в mc нельзя настроить, в каком месте командной строки использовать автодополнение имени хоста, поэтому mc использует трюк, сходный с клавишами [Meta]+[@] - в mc автодополнение имени хоста выполняется командой автодополнения ([Meta]+[Tab], [Esc]+[Tab]) после символа '@'; символ '@' потом приходится стирать, если он не нужен.


Эта страница https://phdru.name/Russian/Software/bash_mc_completion.html была сгенерирована 26.02.2023 в 19:14:56 из шаблона CheetahTemplate bash_mc_completion.tmpl; Некоторые права зарезервированы. Вы можете узнать о технических аспектах этого сайта.