c - 如何在 Bash C 源代码中实现 Tab 补全

标签 c linux bash

作为 Linux 的初学者,我正在研究 Bash 的源码,并且对 Tab 补全非常感兴趣。

在我看来,Tab 补全有两种可能的实现方式。

  1. Bash 从 TTY 获取字符“\t”并调用相应的完成函数以根据您输入的字符执行某些操作。

  2. 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/

相关文章:

c++ - 优化 C++ 中的大整数减法

c++ - 最小 GCC C++ 编译器

linux - mac OS X 和 linux 之间的 rsync 所有权

bash - 评估每个环境变量并将其设置回 ubuntu

linux - Bash -c awk 给出不同的结果

bash - 在 Bash 中获取日期(当前时间前一天)

c - C 中的随机值保持不变

linux - 如何向USB转并口发送字节来控制LED?

linux - 使用 MDEV-17458 将 galera 集群更新到 10.3.15

c - 将 UUID 结构表示为 char uuid[128]