文本在命令行中使用Tab自动完成

时间:2015-06-26 13:07:24

标签: c shell command-line autocomplete

我想知道如何在C中实现一个程序,它可以自动完成您在命令行输入的命令或文本。例如,假设您的程序提示用户输入文件名。大多数人会使用scanf()或者其他人来做这件事。然后在命令行中,用户会像please input the file name:_一样提示。

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

修改:让其更清晰,另一个例子:

如果您在命令行中使用grep,例如grep -i "shakespeare" shakespeare.txt,在自己完成shakespeare.txt之前,如果您只是使用Tab,则会有一些候选人出现

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

3 个答案:

答案 0 :(得分:2)

如果您考虑使用现有的实用程序, 看看GNU readline library,它提供了一个非常巧妙的实施,你正在寻找什么 还有一些其他有用的功能,例如在输入中移动光标,提供输入历史记录和类似输入shell的提示。

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

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

#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;
}

答案 1 :(得分:0)

因为在C中没有便携式解决方案来知道你在promt中键入的内容而没有按Enter键,你需要逐个字符地阅读。

  • 在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

答案 2 :(得分:0)

目前尚不清楚您是否要求完成

  1. 程序本身在运行时。大概你会实现一些自定义命令行。
  2. 在您启动程序之前的操作系统命令行(例如bash),您只想自动完成传递给它的参数
  3. 你的grep示例建议你询问shell的完成情况。 Here就是一个例子。