1

我想为我的 CLI 应用程序实现自动完成功能。getc() 的默认行为仅在输入以下字符列表时返回:NEW_LINE 或 EOF。我想将 TAB 添加到此列表中,以便触发我的自动完成算法。

有没有办法做到这一点,例如,使用termios?编辑线库(http://www.thrysoee.dk/editline/)可以做到,但我不知道它是怎么做的?

4

3 回答 3

1

不需要tcsetattr()或根本不需要的最简单方法tcgetattr()是使用cbreak()将终端置于“cbreak”模式,该模式不缓冲或处理控制字符,然后nocbreak()在您完成重置时使用。

cbreak用于记录各种相关功能的手册页raw(),包括noecho()您可以用来控制终端而无需完全了解 termios。

如果你想要更好的控制,你需要直接使用termios。我不久前写了一篇博客文章,应该可以帮助您入门。

于 2010-12-23T22:09:34.727 回答
0

你应该使用gnu readline而不是用 getc() 杀死自己... ;)

于 2010-11-12T10:05:43.870 回答
0

终端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);
于 2010-11-12T12:33:00.113 回答