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是文件还是目录。在第二种情况下,这仅对rmdirmkdir或等命令有用touch
l0b0

您能张贴您的_longopt()职能的身体吗?
2011年

@MPi:请注意,完成可能取决于命令(命令行的第一个单词)。它还取决于readline设置(是否有~/inputrc文件?)以及该项目是真实目录还是目录的符号链接。
enzotib

当然,完成度取决于该行的第一个单词。这就是为什么我有时使用幻想命令来欺骗完成,并且仅在发送前将其更改为真实命令的原因。我已经没有.inputrc这个系统了。(那是过去的日子,正在固定退格键和光标键……)并且它发生在所有元素,目录或文件,是否有符号链接上。
MPi

1
很好的问题,我观察到了完全相同的行为,这使我很烦。不过,不知道原因。
Christoph

Answers:


22

这是一个已知的错误。请参阅 LP问题和这些错误1 2

此评论似乎可以解决。如果您迫不及待想修复正常频道的问题,请编辑/etc/bash_completion第1587行,更改defaultfilenames(先进行备份)。


3
简介:这是一个错误,您可以在本地修复它,直到通过编辑/etc/bash_completion第1587行(更改default为)到达补丁为止filenames
MPi

编辑了我的回答
Christoph

9

在Ubuntu 12.04上安装Adobe Reader之后,我遇到并解决了相同的问题。

我注释掉了该_filedir/etc/bash_completion.d/acroread.sh,它再次正常工作。


截至今天为止,这对我也起作用。
约翰·穆勒

1
此处相同:acroread触发了它,并注释掉了该_filedir块(在顶部)修复了它。您必须注销或在所有shell中运行'exec bash'才能看到效果,请参阅此问题
dirkjot

2

我遇到了同样的问题,并通过删除/etc/bash_completion.d/目录来解决此问题,然后重新安装bash_completion。我猜这个目录中有一个旧文件...希望它也能解决您的问题。



2
这-的确-固定它。但是,该方法过于激进,因为它丢弃了许多补全。删除软件包后bash-completion,剩下的文件之一/etc/bash_completion.d/必须是罪魁祸首。就acroread.sh我而言–重新定义_filedir
MPi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.