【问题标题】:Proper use of readline in order to display history正确使用 readline 以显示历史记录
【发布时间】:2016-03-23 02:23:04
【问题描述】:

我正在制作一个在 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 次,它应该显示我使用的第三个最新命令, 以此类推作为底部键。

我不太擅长 C,但我知道有一个 library readline 和一个 history one,但我不知道如何使用它们来完成这个。

提前致谢

【问题讨论】:

  • 你想要的叫做命令历史,你必须自己实现。每次用户发出命令时,将其附加到列表中,然后当他们点击向上箭头键时,从该列表中提取命令。
  • 列出你可以实现的东西。但是在Linux中处理箭头键会有点棘手
  • 不会像这样让按键被按下if(kbhit()){ c = getch();}
  • 您可以使用setbuf 禁用输入缓冲区 - 使您能够检测光标上/下键,但您必须自己完成所有文本输入处理,例如退格、左和右光标,等等。
  • @OlarAndrei getch() 是特定于 Windows MSVC 的。

标签: c history


【解决方案1】:

考虑使用GNU readline 库(混合可编辑的读取行功能和历史记录功能)。它包含Readline 本身和history 子库的文档。

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

花几个小时阅读文档,代码示例很好地解释了它。

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

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

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

当然,readlinencurses 希望输入是伪tty(所以它不能是管道或文件)。阅读tty demystified 页面以了解更多血腥 详细信息,并查看termios(3)

如果您想要图形用户界面,请访问GTKQt。如果你想要一个 Web 界面,你需要一些 HTTP 服务器库,例如 libonionWt(以及很多关于 Web 相关技术的知识:HTML5、CSS、Javascript、Jquery、AJAX,...参见 @987654334 @ - 这是不完美的)。

【讨论】:

  • 好吧,我会在阅读完所有文档后立即开始工作。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
相关资源
最近更新 更多