作为 Linux 的初学者,我正在研究 Bash 的源码,并且对 Tab 补全非常感兴趣。
在我看来,Tab 补全有两种可能的实现方式。
Bash 从 TTY 获取字符“\t”并调用相应的完成函数以根据您输入的字符执行某些操作。
Tab 按键会触发 bash 的信号(事件?)。然后 bash 处理这个信号并回调完成处理程序。
我做了一些搜索并从 Bash 源 http://sources.debian.net/src/bash/4.3-7 查找相关代码,但我找不到任何与处理 Tab 信号或从 TTY 获取字符 '\t' 相关的代码。
谁知道Tab补全的机制并能指出相关代码的位置吗?谢谢。
最佳答案
您在bash
处输入的每一次按键提示绑定(bind)到 readline
定义的函数图书馆。 (即使是字母(大写和小写)也绑定(bind)到 self-insert
函数,该函数只是将键入的字符放在命令行上。未绑定(bind)到函数的键根本没有任何作用并被忽略。) Tab 键默认绑定(bind)到 complete
功能。 complete
的效果功能是尝试完成当前光标位置(用 readline
来说,点)之前的文本。来自bash
手册页。
complete (TAB) Attempt to perform completion on the text before point. Bash attempts completion treating the text as a variable (if the text begins with $), username (if the text begins with ~), hostname (if the text begins with @), or command (including aliases and functions) in turn. If none of these produces a match, file- name completion is attempted.
(我相信,在适用的情况下,会尝试使用可编程完成来代替文件名完成。)
关于c - 如何在 Bash C 源代码中实现 Tab 补全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23453676/