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


29

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

Останнім часом така поведінка змінилася. Тепер завершення приносить результат rm ~/Desktop<SPACE>, а це означає, що я повинен повернути простір і ввести косу рису, якщо хочу продовжувати. Це змушує мене плакати.

Зміни, здається, знаходяться у функції _longopt()в /etc/bash_completion, однак, наскільки я можу дотримуватися. Чи є ця зміна навмисною, і якщо так, то для чого це добре? Чи можу я повернути стару поведінку, бажано за допомогою параметра config, а не просто копіювати старий код з якоїсь іншої системи?

Редагувати: функція для довідок.

_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
}

Єдиний спосіб я бачив, що це має сенс, якщо ~ / Desktop - це файл або порожній каталог. А у другому випадку це корисно лише для команд типу rmdir, а не для mkdirчи touch.
l0b0

Чи можете ви опублікувати основу своєї _longopt()функції?
Олександр Левчук

@MPi: майте на увазі, що завершення може залежати від команди (перше слово командного рядка). Також це може залежати від readlineналаштувань (у вас є ~/inputrcфайл?) Та від того, що цей елемент є справжнім каталогом або символьним посиланням на каталог.
enzotib

Звичайно, завершення залежить від першого слова рядка. Ось чому я іноді використовую команду fantasy, щоб обманути завершення, і лише змінити її на реальну команду, перш ніж я її надсилаю. І я більше не маю .inputrcцієї системи. (Це були дні, виправлення зворотної області та клавіш курсору…) І це відбувається з усіма елементами, каталогами чи файлами, символьними посиланнями чи ні.
MPi

1
Відмінне запитання, я спостерігав саме таку поведінку, і це мене дратує. Хоча поняття про причину, хоча.
Крістоф

Відповіді:


22

Це відома помилка. Дивіться це запитання щодо LP та ці помилки 1 2 .

Цей коментар, здається, виправлений. Якщо ви не можете дочекатися виправлення, щоб спустити звичайні канали, відредагуйте /etc/bash_completionрядок 1587, змініть defaultна filenames(спочатку зробіть резервну копію).


3
Резюме: Це помилка, її можна виправити локально, поки патч не з'явиться, редагуючи /etc/bash_completionрядок 1587, змінити defaultна filenames.
MPi

редагував мою відповідь
Крістоф

9

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

Я прокоментував _filedirблок, /etc/bash_completion.d/acroread.shі він знову працював нормально.


На сьогоднішній день це те, що працювало і для мене.
Джон Моллер

1
Те саме тут: acroread запустило його і коментуючи _filedirблок (справа вгорі) виправив його. Вам потрібно вийти або запустити 'exec bash' у всіх своїх оболонках, щоб побачити ефект, дивіться це запитання .
dirkjot

2

У мене була така ж проблема, і я її виправив, видаливши /etc/bash_completion.d/ каталог, а потім перевстановив bash_completion. Я думаю, старий файл був у цьому каталозі ... Сподіваємось, він вирішить і вашу проблему.



2
Це - справді - це виправило. Однак цей метод є занадто радикальним, оскільки він викидає багато завершень. Після видалення пакета винуватцем повинен бути bash-completionодин із файлів, що залишився /etc/bash_completion.d/. Це було acroread.shв моєму випадку - переосмислює _filedir.
MPi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.