我想为我的 CLI 应用程序实现自动完成功能。getc() 的默认行为仅在输入以下字符列表时返回:NEW_LINE 或 EOF。我想将 TAB 添加到此列表中,以便触发我的自动完成算法。
有没有办法做到这一点,例如,使用termios?编辑线库(http://www.thrysoee.dk/editline/)可以做到,但我不知道它是怎么做的?
不需要tcsetattr()
或根本不需要的最简单方法tcgetattr()
是使用cbreak()
将终端置于“cbreak”模式,该模式不缓冲或处理控制字符,然后nocbreak()
在您完成重置时使用。
cbreak
用于记录各种相关功能的手册页raw()
,包括noecho()
您可以用来控制终端而无需完全了解 termios。
如果你想要更好的控制,你需要直接使用termios。我不久前写了一篇博客文章,应该可以帮助您入门。
你应该使用gnu readline而不是用 getc() 杀死自己... ;)
终端IO的处理在《UNIX环境下的高级编程》第二版中大约用了40页……很快,你可以将eol和eol2(termios.c_cc[EOL]和termios.c_cc[EOL2])字符设置为有其他字符的行为类似于 \n。
你甚至可以用 stty 试试这个
$ cat -
abc\tdef
abc\tdef
^d
$stty eol ^i
abc\tabc\tdef
def
^d
如何在程序中执行此操作的示例(在实践中,不要忘记错误处理和在结束时、挂起时、发出信号时等恢复原始状态……这就是为什么使用打包库来执行此操作更好的原因, 有很多细节可以让一个健壮的应用程序正确)。
struct termios term;
tcgetattr(STDIN_FILENO, &term);
term.c_cc[EOL] = '\t';
tcsetattr(STDION_FILENO, TCSAFLUSH, &term);