如何实现类似bash的标签完成?

时间:2009-10-07 17:44:51

标签: bash printing tab-completion

我正在尝试确定系统如何将字符打印到标准输入 - 也就是说,如果用户点击“Enter”,它如何打印用户可以删除的字符以及哪些字符被视为输入。

我碰巧使用的是C,但如果解决方案依赖于语言,我会非常惊讶。

感谢您的任何见解! :D

4 个答案:

答案 0 :(得分:5)

正如iny所说,bash使用readline作为输入。源可用here,并且有一个名为complete.c。

的文件

要回答你的问题,我认为它们实际上并没有打印到标准输入。 Readline包含用户正在编辑的行内容的某种缓冲区,并且完成打印到此。当用户按下回车键时,缓冲区的内容被发送到想要读取一行的任何程序,并且在bash的情况下,传递给标准输入。 (Readline不会这样做 - 其他使用readline的程序可能只是将值存储到字符串中供以后使用。)

答案 1 :(得分:4)

有些人指出bash使用readline,这是真的,但我认为你真正想问的是在你输入之前它是如何看到你输入的内容的。

答案是ttys(即:终端)可以切换到“原始模式”,终端的输入处理被禁用,然后你会看到每个字符进入。这也会禁用自动回显打字字符。

有关详细信息,请参阅Reading a single character from a file or a terminal上的本指南。

答案 2 :(得分:1)

它使用readline库来处理输入,readline提供历史记录和完成。

要实际实现完成,需要访问键盘输入处理。完成必须能够修改它使用的缓冲区。之后,它只是查看当前输入并检查找到的完成情况。实际的完成逻辑可以在很多方面起作用。

答案 3 :(得分:1)

这是一个通过readline实现制表符完成的C片段:

http://github.com/rupa/el