Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用命令行中的制表符自动完成文本_C_Shell_Command Line_Autocomplete - Fatal编程技术网

C 使用命令行中的制表符自动完成文本

C 使用命令行中的制表符自动完成文本,c,shell,command-line,autocomplete,C,Shell,Command Line,Autocomplete,我想知道如何用C语言实现一个程序,它可以自动完成您在命令行中输入的命令或文本。例如,假设您的程序提示用户输入文件名。人们通常会使用scanf()或其他方法来完成此操作。然后在命令行中,用户会得到提示,如请输入文件名: 假设在同一个目录中有一个shakespeare.txt。现在我已经输入了shakes,然后我希望计算机能自动为我完成shakespeare.txt,就像用户点击选项卡时大多数程序一样。如何实现这一点 编辑:为了更清楚,另一个例子是: 如果您在命令行中使用grep,比如grep-i“

我想知道如何用C语言实现一个程序,它可以自动完成您在命令行中输入的命令或文本。例如,假设您的程序提示用户输入文件名。人们通常会使用
scanf()
或其他方法来完成此操作。然后在命令行中,用户会得到提示,如
请输入文件名:

假设在同一个目录中有一个
shakespeare.txt
。现在我已经输入了
shakes
,然后我希望计算机能自动为我完成
shakespeare.txt
,就像用户点击
选项卡时大多数程序一样。如何实现这一点

编辑:为了更清楚,另一个例子是:

如果您在命令行中使用
grep
,比如
grep-i“shakespeare”shakespeare.txt
,在您自己完成
shakespeare.txt
之前,如果您只使用
Tab
,就会出现一些候选项


当我尝试在使用函数(如
scanf()
)时提示用户输入时,我如何实现我的程序以使其拥有这些实用程序?

,因为在C语言中,没有可移植的解决方案可以不按enter键就知道在promt中键入了什么。您需要逐字阅读

  • 在windows中,您可以使用_getch()函数读取一个字符,而无需按enter键。该函数在conio.h中定义
  • 在linux中,可以使用getch()函数
注意:您可能需要使用getche()来回显字符

您需要定义一个缓冲区,在该缓冲区中,您将逐个字符地存储用户按的所有内容,直到用户按enter键或按enter键为止。当您找到\t时,您将分析缓冲区中的内容并基于此做出决定

以下代码是一个过于简化的示例:

char c;
int i = 0;

 do {
     c = _getche();
         if (c == '\t') {
             // Autocomplete
             // Print the rest of the word here
         }
    else {
        buff[i++] = c;
    }

 } while (c != '\n' && c!='\r');
 buff[i] = '\0'; // Let's keep the standard

现在还不清楚你的请求是否由

  • 程序在运行时自动运行。大概您将实现一些自定义命令行
  • 在启动程序之前,操作系统命令行(例如bash),您只想自动完成传递给它的参数

  • 您的grep示例建议您询问shell完成情况。是一个例子。

    如果您考虑使用现有的实用程序, 请看一看,它提供了一个非常简洁的实现,可以满足您的需求。
    还有其他一些有用的功能,如在输入中移动光标、提供输入历史记录和类似输入shell的提示

    此库的功能在不同的平台上工作相同

    正如维基百科所示,指示完成的键可以轻松设置:

    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <readline/readline.h>
    #include <readline/history.h>
    
    int main()
    {
        char* input, shell_prompt[100];
    
        // Configure readline to auto-complete paths when the tab key is hit.
        rl_bind_key('\t', rl_complete);
    
        for(;;) {
            // Create prompt string from user name and current working directory.
            snprintf(shell_prompt, sizeof(shell_prompt), "%s:%s $ ", getenv("USER"), getcwd(NULL, 1024));
    
            // Display prompt and read input (NB: input must be freed after use)...
            input = readline(shell_prompt);
    
            // Check for EOF.
            if (!input)
                break;
    
            // Add input to history.
            add_history(input);
    
            // Do stuff...
    
            // Free input.
            free(input);
        }
        return 0;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    int main()
    {
    字符*输入,shell_提示符[100];
    //将readline配置为在按下tab键时自动完成路径。
    RLU绑定密钥('\t',RLU完成);
    对于(;;){
    //从用户名和当前工作目录创建提示字符串。
    snprintf(shell_提示符,sizeof(shell_提示符),“%s:%s$”,getenv(“用户”),getcwd(NULL,1024));
    //显示提示和读取输入(注意:使用后必须释放输入)。。。
    输入=读取行(外壳提示);
    //检查EOF。
    如果(!输入)
    打破
    //将输入添加到历史记录中。
    添加历史记录(输入);
    //做些事情。。。
    //免费输入。
    免费(输入);
    }
    返回0;
    }
    
    您是否可以简单地捕获用户的
    选项卡
    并将当前输入字符串与当前工作目录中的内容以及可能的一组硬编码关键字进行比较?您是否对整个算法感兴趣,或者只是对如何在已退出的方式上使用选项卡事件来自动完成某些内容感兴趣?