30

I use tab completion more than typing letters. I used to type rm ~/De<TAB> and it would be completed to rm ~/Desktop/ so that I could continue on the next level.

Recently, that behaviour changed. The completion now yields rm ~/Desktop<SPACE>, which means I must backspace and type the slash if I want to continue. This makes me cry.

The changes seem to be located in the function _longopt() in /etc/bash_completion, however that is as far as I can follow. Is this change intentional, and if so, what is it good for? Can I have the old behaviour back, preferably by a config option instead of just copying the old code over from some other system?

Edit: The function for reference.

_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
}
6
  • The only way I could see that this would make sense is if ~/Desktop is a file or an empty directory. And in the second case, that's only useful for commands like rmdir, not for mkdir or touch.
    – l0b0
    May 10, 2011 at 8:08
  • Could you post the body of your _longopt() function? May 10, 2011 at 8:58
  • @MPi: be aware that completion could depends on the command (first word of the command line). Also it can depends on readline settings (have you a ~/inputrc file?) and on the fact that the item is a real directory or a symlink to a directory.
    – enzotib
    May 10, 2011 at 9:24
  • Of course the completion depends on the first word of the line. Which is why I sometimes use a fantasy command to trick completion, and only change it to the real command before I send it. And I have no .inputrc on this system anymore. (Those were the days, fixing backspace and cursor keys…) And it happens for all elements, directory or file, symlink or not.
    – MPi
    May 10, 2011 at 11:11
  • 1
    Excellent question, I've observed the exact same behaviour, and it annoys me. No idea about the reason, though.
    – Christoph
    May 10, 2011 at 11:14

3 Answers 3

22

This is a known bug. See this LP question and these bugs 1 2.

This comment seems to be the fix. If you can't wait for a fix to trickle down the normal channels, edit /etc/bash_completion line 1587, change default to filenames (make a backup first).

4
  • 3
    Summary: It is a bug, you can fix it locally until the patch arrives by editing /etc/bash_completion line 1587, change default to filenames.
    – MPi
    May 10, 2011 at 11:47
  • edited my anwer
    – Christoph
    May 10, 2011 at 11:57
  • The comment that you've linked to no longer exists. Is your answer a complete summary of the linked solution?
    – Lou
    Nov 10, 2020 at 11:15
  • The bug got transferred to another package; see bugs.launchpad.net/ubuntu/+source/acroread/+bug/769866/comments/… but confirm that this is still relevant, probably a lot of things have changed in the meantime
    – Christoph
    Nov 11, 2020 at 7:47
9

I had, and solved, the same problem after installing Adobe Reader on Ubuntu 12.04.

I commented out the _filedir block in /etc/bash_completion.d/acroread.sh and it worked normally again.

2
  • As of today's date this is what worked for me as well. Mar 26, 2013 at 5:52
  • 1
    Same here: acroread triggered it and commenting out the _filedir block (right on top) fixed it. You have to log out or run 'exec bash' in all your shells to see the effect, see this question.
    – dirkjot
    Jun 14, 2013 at 20:37
2

I had the same problem and I fixed it by removing /etc/bash_completion.d/ directory, then reinstall bash_completion. I guess an old file was in this directory... Hopefully it will solve your problem too.

2
  • like this guy: timlabath.com/words/2011/05/10/…
    – type
    May 18, 2011 at 14:37
  • 2
    This – indeed – fixed it. However, that method es much too radical, as it throws away many completions. After deleting the package bash-completion, one of the files remaining /etc/bash_completion.d/ must be the culprit. It was acroread.sh in my case – it redefines _filedir.
    – MPi
    Jun 6, 2011 at 12:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.