55

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

hello:
   echo "hello world"

bye:
   echo "bye bye"

然后在 bash 我想要类似的东西:

制作 h <标签>

所以它可以完成

打个招呼

我找到了一种简单的方法,比如创建空文件hellobye但我正在寻找更复杂的.

4

6 回答 6

66

将此添加到您的~/.bash_profile文件或~/.bashrc文件中

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

这会使用 grep 在 Makefile 中搜索标题为“Makefile”或“makefile”(注意 中的大写?通配符?akefile)的目标,并将其通过管道传递给completebash 中的命令,该命令用于指定如何自动完成参数。该-W标志表示complete命令的输入将是一个词表,它是通过传递 grep 的结果来完成的,grepsed将其排列成所需的表格式。

警告和陷阱:

  1. 您的 make 文件名为“GNUMakefile”或“Makefile”或“makefile”以外的任何其他名称。如果您经常遇到此类标题,请考虑相应地更改正则表达式?akefile

  2. 进行更改后忘记获取您的 ~/.bash_profile 或 ~/.bashrc 文件。我添加了这个看似微不足道的细节,因为对于外行来说这是不熟悉的。要使对 bash 文件的任何更改生效,请使用命令获取它们

    source ~/.bashrc
    

    或者

    source ~/.bash_profile
    

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

于 2016-07-16T21:51:38.380 回答
14

这可能是你要找的吗?

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

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

于 2010-11-15T20:09:58.930 回答
7

几乎每个操作系统都有一个有用的名为bash-completion的包。它包括 Makefile 完成。

(如果你使用的是 macOS 和Homebrew,你可以通过brew install bash-completion.)

于 2019-01-08T15:27:44.750 回答
3

这似乎至少在 Debian Lenny 中是默认的:

$ grep Makefile /etc/bash_completion
    # make reads `GNUmakefile', then `makefile', then `Makefile'
    elif [ -f ${makef_dir}/Makefile ]; then
        makef=${makef_dir}/Makefile
    # before we scan for targets, see if a Makefile name was
    # deal with included Makefiles

该文件的标题指出:

#   The latest version of this software can be obtained here:
#
#   http://bash-completion.alioth.debian.org/
#
#   RELEASE: 20080617.5
于 2010-11-15T20:18:11.317 回答
2

这是一个查看 .PHONY: 声明的完成脚本。

_make_phony_words() {
  local opt_revert

  if [ -n "${BASH_VERSION:-}" ]; then
    shopt -q nullglob || {
      opt_revert=1 ; shopt -s nullglob ;
    }

  elif [ -n "${ZSH_VERSION:-}" ]; then
    [[ -o nullglob ]] || {
      opt_revert=1 ; setopt nullglob
    }
  fi

  for f in ./?akefile ./*.make ; do
    sed -nEe '/^.PHONY/ { s/^.PHONY:[ ]?// ; p ; } ' "$f" | tr ' ' $'\n' | sort -u
  done

  if [ -n "$opt_revert" ]; then

    [ -n "${ZSH_VERSION:-}" ] && unsetopt nullglob
    [ -n "${BASH_VERSION:-}" ] && shopt -u nullglob
  fi
  unset opt_revert

}

_make_phony_complete() {
  local cur="${COMP_WORDS[COMP_CWORD]}"

  COMPREPLY+=( $(compgen -W "$( _make_phony_words )" -- ${cur}) )

}
complete -F _make_phony_complete make
于 2020-03-04T04:17:47.320 回答
-3

在 Ubuntu 10.04 中,获取以下文件:

. /etc/bash_completion

或取消注释

/etc/bash.bashrc
于 2014-08-06T18:17:22.180 回答