Я бы хотел поручить bash использовать специальный метод для выполнения определенных имен каталогов. Например, bash будет вызывать мою программу для выполнения завершения, если путь начинается с «$$», и, как правило, выполнять завершение в противном случае.
Это вообще возможно? Как бы вы это реализовали?
Баунти : я действительно ценю ответ на этот вопрос. Цель состоит в том, чтобы позволить autojump завершать пути для всех команд, когда пользователь запускает их с определенным префиксом. Так, например, при копировании файла из удаленного каталога вы можете набрать:
cp $$patern + <Tab>
и автопрыжки будут завершены
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
и вам просто нужно добавить, куда вы хотите поместить файл. Конечно, я могу использовать комментарий Отта, чтобы добавить его к нескольким конкретным командам, но если у кого-то есть идея получше, я был бы очень благодарен.
источник
Ответы:
Вы можете сделать это, переопределив привязку по умолчанию для TAB (^ i). Сначала вам нужно переопределить привязку TAB, затем вам нужно создать функцию, которая вызывает вашу команду, и, наконец, вам нужно взять вывод этой команды и обновить переменную, которая содержит текущую командную строку.
Эта функция берет текущую командную строку и заменяет последние два символа на «huugs».
Для вашего примера вы, вероятно, захотите изменить строку new_argument, чтобы она выглядела следующим образом:
Теперь переопределите привязку ^ i:
Теперь проверьте, что это работает:
поэтому нормальное завершение все еще работает, вы можете проверить часть $$, выполнив команду cd $$ ... и т. д.
Если вы столкнулись с проблемами, включите подробный режим:
Он распечатает все, что делает функция.
Я проверил это на Ubuntu 11, используя bash 4.2.8 (1) -релиз (по умолчанию).
источник
Процедура завершения bash может быть запрограммирована как сценарий оболочки.
Вот пример shell-скрипта, который в любом параметре будет заменен
$$[Tab]
наmy replacement string
, но только для конкретной командыmycommand
и только если параметр в точности равен «$$»:Вы должны получить исходный текст сценария для
source <file-name>
запуска через (или команду dot), чтобы он заработал, а затем:Чтобы он всегда работал для некоторых или всех пользователей, включите его в одну из процедур профиля bash .
Проблема с
complete
командой заключается в том, что она будет работать только для одного или нескольких имен команд, указанных в качестве параметров. Можно было просто дать ему список всех команд, которые могли бы быть использованы пользователями, или в отчаянных случаях расширяться/bin/* /usr/bin/* ~/bin/*
.Протестировано на CentOS 5.5.
Этот простой сценарий основан на источниках, которые я перечислил в другом ответе, который был удален модератором studiohack. Если интересно, просто попроси его восстановить его.
источник