有关termios设置的一个问题

energumen1 2006-03-28 09:16:58
自己用C写的一个Shell,希望能够立刻响应键盘事件(不想采用Curses,而是自己编写),所以采用了设置termios的方式。
由于需要立刻响应键盘事件,所以将ICANON设置为否,也就是工作在非标准模式(标准模式下会有行缓冲,这样就无法立刻响应了)
但是这样设置以后,无法正确响应Backspace(也就是光标可以回退,但是字符不会消失)

我设置VERASE 为true依然没有效果

不知道有什么好的建议吗?
...全文
80 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
energumen1 2006-03-28
  • 打赏
  • 举报
回复
基本确定了两种方式实现:
1、投机取巧的方式:回退的键盘功能自己实现,由于担心的是回退以后无法清除上一个字母在界面的显示,所以,可以将回退分解为三个连环动作“回退、空格、回退”,这样就人为的清空了那个字母
2、重新编写readline的方式 仿照bash的readline
fierygnu 2006-03-28
  • 打赏
  • 举报
回复
这就是一个自己造轮子还是做总装的问题:)
energumen1 2006-03-28
  • 打赏
  • 举报
回复
是啊,正在考虑实现一个简单的readline,会需要多少时间

毕竟,这里的readline也有自动补齐和历史记录等功能,而且还有已经定义好的快捷键映射表,功能很强大

还有其他的实现建议吗?fierygnu(va_list) ?感觉你在这个方面研究的很深入
fierygnu 2006-03-28
  • 打赏
  • 举报
回复
bash用的是readline包。
energumen1 2006-03-28
  • 打赏
  • 举报
回复
getline好像是不行的,因为不会即时响应按键,譬如tab自动补齐(不过我正在看bash的代码,好像bash用的也是getline)

其实,:),我只是希望补充一个tab自动补齐的功能而已
fierygnu 2006-03-28
  • 打赏
  • 举报
回复
那就没有必要用RAW模式。getline可以很好的满足命令行编辑的需求。
具体的需求说一下?
energumen1 2006-03-28
  • 打赏
  • 举报
回复
赞同fierygnu(va_list) 的发话

但是确实需要这个功能,就像Cisco的登录界面,也是支持键盘事件(譬如tab)和一些特殊按键的,譬如del

bash本身也是支持这个功能的,只是好像不是使用C编写的代码。不过可以参考一下,只是觉得很麻烦,有什么好建议没?
fierygnu 2006-03-28
  • 打赏
  • 举报
回复
只有ICANON模式下才会处理EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, STATUS, and WERASE。
你为什么还需要backspace?

23,127

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧