phdru.name / Russian / Software
Автодополнение в 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 была сгенерирована 16.06.2024 в 13:04:27 из шаблона CheetahTemplate bash_mc_completion.tmpl; Некоторые права зарезервированы. Вы можете узнать о технических аспектах этого сайта.