Завершение Bash предотвращает возвращение
-
02-10-2019 - |
Вопрос
Я пытаюсь настроить завершение Bash для скрипта утилиты, который я написал, поэтому я добавил следующий скрипт для /etc/bash_completion.d:
_mcd()
{
local cur words
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
words=`mcd-completion-words`
COMPREPLY=( $(compgen -W "${words}" -- "$cur") )
return 0
}
complete -F _mcd mcd
То mcd-completion-words
Сценарий программно находит доступных операторов для команды. Когда я перезагружаю Bash (или исходный скрипт), я могу успешно вкладить завершено, но если я это сделаю, я больше не могу отступить в последнее время завершенного персонажа.
Кроме того, если я попытаюсь перечислить все варианты (например, я пытаюсь вкладывать вкладку W / No Word на месте), Bash добавляет вкладку в команду, которую я также не могу отступить.
Как я могу заставить Bash Mimic Normal File Completion поведение файлов? Любая помощь ценится. Спасибо!
Вот уменьшенный тест-тест для MCD-завершения - слов, которые по-прежнему проявляют одно и то же поведение. Кейс любопытно, черт Денниса также работает для меня (при замене словами = «один два три», например).
#!/usr/bin/env php
<?php
print "one two three four five six seven eight nine";
Решение
Вот уменьшенный тестовый случай; Даже пустая команда `php 'вызывает ошибочное поведение завершения:
$ _mcd() { php -r ""; COMPREPLY=( one ); }
$ complete -F _mcd mcd
$ mcd <TAB> # Becomes 'mcd one' all right
$ mcd one <BACKSPACE> # ERROR: doesn't work
Это на машине (Ubuntu) с обеим Bash-3.2.48 / Bash-4.0.33 & PHP-5.2.6-3UBUNTU4. На другой машине (Debian) с Bash-3.2.39 & PHP-5.2.6-1 + Lenny9, Завершение и Backspace идут в порядке.
С использованием perl -e ""
вместо php -r ""
Также идет все в порядке.
Не знаю, что происходит, PHP противоречит с помощью readline? Может быть, вы можете попробовать список рассылки Bug-Bash?