正确使用 readline 以显示历史记录

Proper use of readline in order to display history

我正在制作一个程序,它应该像 linux (ubuntu) 中的真实终端一样工作。

我的是这样的:

int main(int argc, char *argv[]){

   char cmd[500];

   do{
       printf("$ > ");
       fgets(cmd, 499, stdin);
       //executeCommands(cmd);
   }while(strcmp(cmd, "exit\n") != 0);

   return 0;
}

我想做的是:当我按下向上键时,它应该显示我之前输入的内容,依此类推...如果我按向上键 3 次,它应该显示最新的第 3 个使用的命令,依此类推。

我对 C 不是很好,但我知道有一个库 readline 和一个 history ,但我不知道如何使用它们来完成这个。

提前致谢

考虑使用 GNU readline library (mixing both editable readline feature and history feature). It has documentation for the Readline itself and for the history 子库。

您将使用 readline 函数读取该行,并使用 add_history 将一些“已接受”行添加到历史列表中。您可能还想自定义 completer.

花几个小时阅读文档,代码示例对其进行了很好的解释。

readline 库是 GPL 许可的,通常在 Linux 上可用。例如,在 Debian 上安装 libreadline6-dev 包;我不知道如果 readline 适用于 Windows。)

你可能不应该明确地使用(在你的程序中)signal(7)-s 和 readline。如果这样做,请深入研究文档和源代码。

您可能需要考虑 ncurses 库。它使您能够编写全屏终端应用程序代码(如 vimemacs)。

当然,readlinencurses希望输入是伪tty (so it cannot be a pipe or a file). Read the tty demystified page to understand more the gory details, and see termios(3)!

如果您想要图形用户界面,请深入研究 GTK or Qt. If you want a web interface, you'll need some HTTP server library like libonion or Wt (and a lot of knowledge about web related technologies: HTML5, CSS, Javascript, Jquery, AJAX, ... see w3schools - 这是不完美的)。