Автозаполнение Bash с добавлением пробелов - почему и как исправить?

29

Я использую табуляцию больше, чем набираю буквы. Я использовал для ввода, rm ~/De<TAB>и это будет завершено, чтобы rm ~/Desktop/я мог перейти на следующий уровень.

В последнее время это поведение изменилось. Завершение теперь дает rm ~/Desktop<SPACE>, что означает, что я должен вернуться назад и набрать косую черту, если я хочу продолжить. Это заставляет меня плакать.

Изменения, похоже, находятся в функции _longopt()in /etc/bash_completion, однако это насколько я могу следить. Является ли это изменение преднамеренным, и если да, то для чего оно нужно? Можно ли вернуть старое поведение, желательно с помощью параметра конфигурации, а не просто скопировать старый код из какой-либо другой системы?

Редактировать: функция для справки.

_longopt()
{
    local cur prev split=false
    _get_comp_words_by_ref -n = cur prev

    _split_longopt && split=true

    case "$prev" in
        --*[Dd][Ii][Rr]*)
            _filedir -d
            return 0
            ;;
        --*[Ff][Ii][Ll][Ee]*|--*[Pp][Aa][Tt][Hh]*)
            _filedir
            return 0
            ;;
    esac

    $split && return 0

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W "$( $1 --help 2>&1 | \
            sed -ne 's/.*\(--[-A-Za-z0-9]\{1,\}\).*/\1/p' | sort -u )" \
            -- "$cur" ) )
    elif [[ "$1" == @(mk|rm)dir ]]; then
        _filedir -d
    else
        _filedir
    fi
}
MPi
источник
Единственный способ понять, что это имеет смысл, - это если ~ / Desktop - это файл или пустой каталог. А во втором случае это полезно только для таких команд, как rmdir, а не для mkdirили touch.
2010 года
Не могли бы вы опубликовать тело вашей _longopt()функции?
Александр Левчук
@MPi: помните, что завершение может зависеть от команды (первое слово командной строки). Также это может зависеть от readlineнастроек (у вас есть ~/inputrcфайл?) И от того факта, что элемент является реальным каталогом или символической ссылкой на каталог.
энзотиб
Конечно завершение зависит от первого слова строки. Вот почему я иногда использую фантазийную команду, чтобы обмануть завершение, и только перед тем, как отправить ее, меняю ее на настоящую. И у меня нет .inputrcв этой системе больше. (Это были дни, исправление backspace и клавиш курсора ...) И это происходит для всех элементов, каталога или файла, символической ссылки или нет.
MPi
1
Отличный вопрос, я наблюдал точно такое же поведение, и это меня раздражает. Хотя понятия не имею о причине.
Кристоф

Ответы:

22

Это известная ошибка. Смотрите этот вопрос LP и эти ошибки 1 2 .

Этот комментарий кажется исправлением. Если вы не можете дождаться исправления, чтобы проскочить по обычным каналам, отредактируйте /etc/bash_completionстроку 1587, измените defaultна filenames(сначала сделайте резервную копию).

Christoph
источник
3
Описание: Это ошибка, вы можете исправить ее локально, пока не появится патч, отредактировав /etc/bash_completionстроку 1587, изменив defaultна filenames.
MPi
отредактировал мой ответ
Кристоф
9

У меня была и решена та же проблема после установки Adobe Reader на Ubuntu 12.04.

Я закомментировал _filedirблок, /etc/bash_completion.d/acroread.shи он снова работал нормально.

hiteshradia
источник
На сегодняшний день это то, что сработало и для меня.
Джон Мёллер
1
То же самое здесь: acroread вызвал его и закомментировал _filedirблок (справа вверху) исправил это. Вы должны выйти или запустить exec bash во всех своих оболочках, чтобы увидеть эффект, см. Этот вопрос .
dirkjot
2

У меня была такая же проблема, и я исправил ее, удалив каталог /etc/bash_completion.d/, а затем переустановил bash_completion. Я думаю, что старый файл был в этом каталоге ... Надеюсь, это решит и вашу проблему.

PatrickM
источник
как этот парень: timlabath.com/words/2011/05/10/…
введите
2
Это - действительно - исправило это. Однако этот метод слишком радикальный, так как он отбрасывает многие дополнения. После удаления пакета bash-completionодин из оставшихся файлов /etc/bash_completion.d/должен быть виновником. Это было acroread.shв моем случае - это переопределяет _filedir.
MPi