代码之家  ›  专栏  ›  技术社区  ›  Joe Mastey

bash完成防止退格

  •  2
  • Joe Mastey  · 技术社区  · 15 年前

    我正在尝试为我编写的实用程序脚本设置bash completion,因此我在/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(或源代码脚本)时,我可以成功地完成tab,但如果这样做,我就不能再后退超过已完成的字符。

    另外,如果我尝试列出所有选项(例如,我尝试在没有单词的情况下完成制表符),bash会向命令添加一个制表符,这也是我不能退格的。

    如何使bash模拟正常的文件完成行为?感谢您的帮助。谢谢!


    #!/usr/bin/env php
    <?php
    
    print "one two three four five six seven eight nine";
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   fvue    15 年前

    这里有一个简化的测试用例;即使是空的“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-3ubuntu 4。在另一台使用bash-3.2.39&php-5.2.6-1+lenny9的机器(debian)上,完成和退格操作正常。

    使用 perl -e "" 而不是 php -r "" 也行。

    不知道发生了什么,PHP和readline有冲突吗?也许你可以试试Bug-Bash邮件列表?

    推荐文章