bash完成makefile目标

Gui*_*ssé 43 makefile bash-completion

假设我有一个简单的makefile,如:

hello:
   echo "hello world"

bye:
   echo "bye bye"
Run Code Online (Sandbox Code Playgroud)

然后在bash我想要的东西:

make h <tab>

所以它可以完成

打招呼

我发现了一种简单的方法,比如创建空文件hello,bye但我正在寻找更复杂的东西.

Cib*_*eph 46

〜/ .bash_profile文件或〜/ .bashrc文件中添加它

complete -W "\`grep -oE '^[a-zA-Z0-9_.-]+:([^=]|$)' ?akefile | sed 's/[^a-zA-Z0-9_.-]*$//'\`" make
Run Code Online (Sandbox Code Playgroud)

这将使用grep 在Makefile中搜索标题为" Makefile " 的目标(注意大写字母M),并将其传递给bash中的完整命令,该命令用于指定参数的完成方式.所述-W标志表示输入到"完整的"命令将其通过使grep的结果通过完成了单词表的sed其安排成所希望的单词表格式.

警告和陷阱:

  1. 您的make文件名为'GNUMakefile'或'makefile'或除'Makefile'以外的任何其他内容.如果您经常遇到这样的标题,只需添加另一行,其格式与上面相同,但在〜/ .bashrc或〜/ .bash_profile文件中使用所需的makefile标题代替'Makefile'.

  2. 在进行更改后忘记发送〜/ .bash_profile或〜/ .bashrc文件.我添加了这个看似微不足道的细节,因为对于不熟悉的人来说,这是不熟悉的.对于任何改变你的bash文件生效,它们使用命令

    source ~/.bashrc
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    source ~/.bash_profile
    
    Run Code Online (Sandbox Code Playgroud)

PS.您现在还可以通过按[Tab]两次来显示可能的制作目标,就像在bash完成时一样.只需确保在命令make之后添加一个空格,然后再键入[Tab]两次.

  • 我个人使用:`complete -W"\`make -qp | sed -n -E's/^([^.#\ s] [^:=]*)(:$ |:\ s +.*$) /\1/p'| sort -u'\`"make` (4认同)
  • 我认为在cwd中处理没有Makefile的情况会很好:完成-W"\`([[-r Makefile]] && grep -oE'^ [a-zA-Z0-9 _-] + :( [[ ^ =] | $)'Makefile || cat/dev/null)| sed's/[^ a-zA-Z0-9 _-]*$ //'\`"make (2认同)
  • 您的解决方案未检测到包含点“”的命令。 (2认同)
  • 他们不应该考虑 .PHONY 和 .env 等,所以这是我的建议完成 -W "\`grep -oE '^[a-zA-Z0-9_-][a-zA-Z0-9_.-]+:( [^=]|$)' Makefile | sed 's/[^a-zA-Z0-9_-]*$//'\`" make (2认同)

Kos*_*Kos 11

这可能是你想要的吗?

http://freshmeat.net/projects/bashcompletion/

make [Tab]将在Makefile中的所有目标上完成.该项目旨在为最常见的Linux/UNIX命令生成可编程完成例程,减少系统管理员和程序员每天需要输入的数量.

  • 链接已损坏。 (3认同)
  • 哎哟,这是一个古老的答案.我现在用oh-my-zsh (2认同)

Pau*_*sex 5

大多数操作系统都有一个名为bash-completion的有用包。它包括 Makefile 完成。

(如果您使用的是 macOS 和Homebrew,则可以通过 获得brew install bash-completion。)

  • 对于 macOS - 有 bash-completion@2 直接与 bash-completion 冲突。如果您的 bash &gt;= 4.1,则鼓励使用 @2 版本。它似乎没有包含 Makefile 完成,因此在 bashrc 中添加自定义规则(如其他答案中提出的)可能会有所帮助。 (4认同)