作为Linux的初学者,我正在研究Bash的来源,并对Tab完成非常感兴趣。
在我看来,Tab完成有两种可能的实现方式。
Bash从TTY获取char'\ t'并调用相应的完成函数,根据您键入的字符执行某些操作。
Tab键击发出一个信号(事件?)进行重击。然后bash处理此信号并回调完成处理程序。
我进行了一些搜索并查找了来自Bash源http://sources.debian.net/src/bash/4.3-7的相关代码,但我找不到任何与处理Tab信号相关的代码或从TTY获取char'\ t'。
任何人都知道Tab完成的机制并且可以指出相关代码的位置?感谢。
答案 0 :(得分:2)
您在bash
提示符下键入的每个键击都绑定到readline
库定义的函数。 (甚至字母 - 大写和小写 - 都绑定到self-insert
函数,它只是将键入的字符放在命令行上。未绑定到函数的键只是没有效果而被忽略。 )默认情况下, Tab 键绑定到complete
函数。 complete
函数的作用是尝试在当前光标位置之前完成文本(点,在readline
用语中)。来自bash
手册页。
完成(TAB) 尝试在点之前对文本执行完成。 Bash尝试完成将文本视为a 变量(如果文本以$开头),用户名(如果文本以〜开头),主机名(如果文本开头) 用@)或命令(包括别名和函数)依次。如果这些都没有产生匹配,则归档 - 尝试完成名称。
(我相信,可编程完成,如果适用,则尝试代替文件名完成。)