【问题标题】:Catch arrow keys using TermCaps使用 TermCaps 捕捉箭头键
【发布时间】:2016-06-08 09:06:39
【问题描述】:

我目前正在开发一个用 C 语言构建的完整 shell。

我想通过我的双链表使用箭头键实现 bash 历史记录和导航,但我在使用 TermCaps 时遇到了一些问题 设置read()函数。

这是我设置终端的方式:

static int      set_terminal_mode(t_shell *shell, const int mode)
 {
   char          *term_name;

   if (mode == 0)
     {
       if ((term_name = getenv("TERM")) == NULL)
         return (-1);
       ioctl(0, TCGETS, &shell->term);
       shell->term.c_lflag &= ~ICANON;
       shell->term.c_cc[VMIN] = 1;
       shell->term.c_cc[VTIME] = 0;                                         
       ioctl(0, TCGETS, &shell->term_save);
       ioctl(0, TCSETS, &shell->term);
     }
   if (mode == 1)
     ioctl(0, TCSETS, &shell->term_save);
   return (0);
 }

我可以在按下左键或右键时捕捉到,然后我使用\r 擦除该行(这实际上不起作用)但主要问题是我不能再使用返回键了(只显示@987654324 @) 我该如何解决这个问题?

【问题讨论】:

    标签: c termcap


    【解决方案1】:

    这一行

           shell->term.c_lflag &= ~ICANON;
    

    关闭 canonical 模式,according to POSIX 做了几件事,包括关闭行缓冲,其中包括对回车的特殊处理:

    在非规范模式输入处理中,输入字节不组装成行,不会发生擦除和终止处理。

    CR
    输入时的特殊字符,如果设置了 ICANON 标志,则可以识别该字符;它是回车符。当 ICANONICRNL 设置且 IGNCR 未设置时,此字符应翻译为 @ 987654328@,并应与 NL 字符具有相同的效果。

    如果要读取单字节(用于光标键),则必须处理单字节控制字符,例如回车符 (CR) 和换行符(称为 NL 或换行符)。

    顺便说一句,您的示例似乎将保存/修改的设置颠倒了:调用

         ioctl(0, TCSETS, &shell->term_save);
    

    使用保存在中的终端设置

           ioctl(0, TCGETS, &shell->term_save);
    

    这是在您已经修改了终端设置之后。

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2012-04-30
      • 1970-01-01
      • 2012-01-27
      • 2013-11-19
      • 1970-01-01
      相关资源
      最近更新 更多