问题标签 [compgen]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
179 浏览

bash - Compgen 无法正确完成包含冒号的单词

当命令应该包含冒号时,我在创建 Bash 完成函数时遇到了问题。当您键入命令并按 Tab 键时,Bash 会将命令行的内容插入到一个数组中,只有这些数组由冒号分隔。所以命令:

假富:苹果

将变为:('dummy''foo'':''apple')

我知道一种解决方案是更改 COMP_WORDBREAKS,但这不是一个选项,因为它是一个团队环境,我可能会通过弄乱 COMP_WORDBREAKS 来破坏其他代码。

然后这个答案建议使用_get_comp_words_by_refand__ltrim_colon_completions变量,但是从答案中我并不清楚如何使用这些变量。

所以我在下面尝试了不同的解决方案。基本上,将命令行读取为字符串,并通过计算“偏移量”来确定用户光标当前正在选择的单词。如果命令行中有一个冒号,其左侧或右侧有文本,它将在偏移量上各加 1,然后从COMP_CWORD变量中减去它。

问题是,这仍然无法正常工作。如果我输入:

然后它将正确完成dummy pineapple。如果我输入:

然后它将显示三个可用选项,foo:apple foo:banana foo:mango。到目前为止,一切都很好。但如果我输入:

然后我得到的输出是dummy foo:foo:And then further tabs don't work,因为它解释foo:foo:为 cur,它不匹配任何完成。

当我自己测试 compgen 命令时,如下所示:

然后它将返回三个匹配结果:

所以我假设正在发生的是 Bash 补全看到它有一个空字符串和三个可用的补全候选,所以将前缀添加foo:到命令行的末尾 - 即使foo:已经是要完成的光标。

我不明白如何解决这个问题。当不涉及冒号时,这很好用——“pine”总是会变成菠萝。如果我去更改数组以添加更多选项:

然后当我打字时dummy pine<TAB>它仍然很高兴地显示给我pineapple pinecone pinetree,并且不会尝试在pine最后添加多余的东西。

这种行为有什么解决办法吗?

0 投票
1 回答
142 浏览

bash - 如何在我自己的脚本选项中使用 bash `compgen`?

我是新手compgen,想将它用于我正在处理的脚本。该脚本可以将“命令”和“选项”作为参数,如下所示:

我写了一个完成脚本,看起来像这样:

该脚本对“add”命令运行良好,但在“--path”选项上失败。例如:当我输入:

我得到:

如何正确添加我自己的脚本选项的补全?

0 投票
0 回答
24 浏览

bash - compgen 没有显示所有预期的建议

我需要使用从 json 文件中读取的单词添加一些 bash shell 补全:

要获取单词列表,我可以运行此命令行,它会从我的文件中返回所有预期的单词:

例如,使用附加的“grep R20”它会返回:

现在我把它放在这个 compgen 文件中,并在我的 bash 会话中获取它。

问题是当我输入

我得到了这些建议:

它错过了我的第一次 grep 测试中的 R20_B1002_ORDERSB1_FROMB1。我不认为它涉及下划线,因为其他带有“./d.py R10”的测试确实建议“R10_xxxx”。

0 投票
1 回答
53 浏览

bash - Compgen and make:有没有办法compgen make recipes?

compgen -c make 在 mac 上的 BASH 中运行并得到以下返回值:

但我想要什么和应该做什么?得到(并且在完成时得到)是:

这代表了我的各种 PHONY 制定规则来做自动的事情。


通常,如何使用可执行工具从 SHELL 生成此列表compgen

(这是一个理想的问题,因为从 python3 开始,subprocess无法模拟交互,我将不得不做更多的事情)


这与重复的候选者“我如何在 make 中获取目标(释义)”不同,因为我认为(非工作)命令不是一个好的答案,这个问题是关于compgenandmake而不是makeand the的内部运作make

但是我可以使用正则表达式为我的高级目的找到某种解决方案吗?

在我看来,不,因为 compgen 很容易且令人难忘,而这个 kludge 很难,并且会在我堆在上面的任何代码上引入拖累。


此外,该副本允许对 makefile 进行更改。

在我的情况下,make 文件必须被认为是给定的,否则我所做的将不太有用。

因此,更具体地说,给定任何makefile,是否存在涉及 make 之外的工具的解决方案,可以查看 make 并让 make 输出其配方列表,就像 bash 完成一样。

换句话说:可以为任何makefile(不失一般性)做到这一点,而不需要对makefile的写权限,也不需要使用tty模拟器模拟tab-tab?

0 投票
3 回答
247 浏览

bash - 模拟 Bash 的 COMPREPLY 响应而不实际完成它

重现步骤

  • 在 tmp 上创建目录,在里面添加 1 个文件。

  • 粘贴下面的脚本/tmp/completion.sh

  • 那就采购吧。


预期结果

相反会发生什么

我希望该建议显示为可能的完成,但实际上并未完成(出于显示目的)。以前有人问这个问题,但到目前为止还没有给出答案。

关于-o nosort

我研究了那个选项,它只在 Bash 4.4+ 上可用,我在我的 16.04 机器上试过,但它失败了。寻找更全球化的解决方案