在linux下make make的破坏标签完成

时间:2014-11-14 14:53:15

标签: linux bash makefile tab-completion

我不知道标签完成是如何工作的,但突然之间我的一切都被打破了。除了用例之外,我甚至不知道提供什么信息。 makefile中有一个目标clean

$ make c<tab>会产生

$ make c23:set: command not found lean

修改 我相信自从setman set并且No manual entry for set没有报告任何内容以来我内置了which set bash。但是,在终端上调用set会产生结果。

我正在使用: GNU bash,版本4.3.11(1)-release(x86_64-pc-linux-gnu) GNU Make 3.81 < / p>

3 个答案:

答案 0 :(得分:14)

感谢Etan's comment和Aaron指示makefile的位置,我设法调试了这个。

我运行了set -x,因此我可以跟踪完成标签页时发生的情况。 make c<tab>的输出主要包含位于make(1)的/usr/share/bash-completion/completions/make的bash完成文件中的命令。 但是,我注意到输出和文件之间的不一致。接近尾声时,输出说:

+ local mode=--
+ ((  COMP_TYPE != 9  ))
++ set +o
++ grep --colour=auto -n -F posix
+ local 'reset=23:set +o posix'
+ set +o posix

我确定与文件中的这些行对应:

if (( COMP_TYPE != 9 )); then
    mode=-d # display-only mode
fi

local reset=$( set +o | grep -F posix ); set +o posix # for <(...)

因此,输出只有grep --colour=auto -n而不是grep。实际上,我已为grep

设置了此别名

删除别名后立即开始工作。

我希望这有助于其他人调试他们的问题。

编辑:我在此处提交了错误报告:https://alioth.debian.org/tracker/index.php?func=detail&aid=315108&group_id=100114&atid=413095

答案 1 :(得分:2)

查看/etc/bash_completion/etc/bash_completion.d和/或/usr/share/bash-completion/completions。您应该找到一个文件make,其中包含按 Tab 时将调用的脚本。

使用Linux发行版的打包系统验证文件(或者可能还原为旧版本)。

另一个原因可能是Makefile中的某些内容,它会将BASH完成脚本中的解析器抛出轨道。

答案 2 :(得分:1)

这里没有尝试获得任何学分,但最好的解决方案实际上有点隐藏在评论中...... 请投票this comment而不是我的答案!

简单的步骤来解决这个问题:

sudo vi /usr/share/bash-completion/completions/make

找到具有grep指令的行。它应该是这样的:

local reset=$( set +o | grep -F posix ); set +o posix # for <(...)

添加&#34; \ &#34;在&#34; grep&#34;之前指令:

local reset=$( set +o | \grep -F posix ); set +o posix # for <(...)