代码之家  ›  专栏  ›  技术社区  ›  ar2015

bash自动完成选项而不运行应用程序

  •  2
  • ar2015  · 技术社区  · 6 年前

    我发现这段代码是bash自动完成的。但我觉得很奇怪。如果我根本不喜欢运行代码怎么办?如果我想打字 ./a.out 然后按空格键(不输入),然后按Tab键,我只想看到两个选项 apple cherry 如果我打字 a 然后按Tab键,它会自动完成选项。 苹果 同样地 c . 假设两个选项中只有一个是可以接受的:

    ./a.out apple
    ./a.out cherry
    

    在哪里? 苹果 樱桃 是选项,而不是目录中文件的名称。在第一种情况下,我希望程序类型 your option is apple 在第二种情况下 your option is cherry . 在任何其他情况下,程序应打印一个错误,说明该选项无效。

    我在互联网上找到的所有例子,比如下面的例子,你应该先运行程序,然后它会做出反应。while循环 main 函数与程序的正常功能冲突。我误解了 readline 图书馆?是否可以通过编辑以下代码来实现上述应用程序?

    // sudo apt-get install libreadline-dev
    // g++ -std=c++11 main.cpp -lreadline
    
    #include <iostream>
    
    #include "readline/readline.h"
    #include "readline/history.h"
    
    using namespace std;
    
    int main(int argc, char** argv)
    {
        const char *line;
        while ((line = readline("? ")) != nullptr) {
            cout << "[" << line << "]" << endl;
            if (*line) add_history(line);
            free(line);
        }
    // if(argc!=2)
    // {
    //  cout<<"<exe> one_parameter"<<endl;
    //  return 1;
    // }
    // string option=argv[1];
    // if(option=="apple" || option=="cherry")
    //  cout<<"Your option is "<<option<<endl;
    // else
    // {
    //  cout<<"Error: invalid option "<<option<<endl;
    //  return 1;
    // }
    
        return 0;
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   ar2015    6 年前

    这与可执行文件无关。你需要把这个放在一个文件和源中( source autocomplete_file . autocomplete_file )在狂欢中。

    _a_complete_()
    {
        local word=${COMP_WORDS[COMP_CWORD]}
        local files='apple cherry'
    
        COMPREPLY=( $( compgen -W "${files}" -- ${word} ) )
    }
    
    complete -F _a_complete_ ./a.out
    

    Here 可以找到一个很好的文档。

        2
  •  1
  •   bobah    6 年前

    //部分回答-为什么在执行自动完成时调用应用程序

    为应用程序实现自动完成的一种方法是让应用程序二进制配置它(通过具有一个标记来打印自动完成配置的指令,或者只通过解析 --help 应用程序的输出)。

    Schemataically:

    complete -F $(./a.out --generate-autocomplete-config) ./a.out
    

    这就是为什么您可能会看到二进制文件实际上是作为自动完成实现的一部分调用的。

    推荐文章