55

次のような単純なmakefileがあるとします。

hello:
   echo "hello world"

bye:
   echo "bye bye"

次に、bashで次のようなものが必要です。

h<タブ>を作成します

完了できるように

こんにちは

空のファイルhelloを作成するような簡単な方法を見つけましたが、もっと洗練されbyeたものを探しています。

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内のターゲットを検索し、引数のオートコンプリート方法を指定するために使用されるbash?akefileのコマンドにパイプします。フラグは、コマンドへの入力が、grepの結果を渡すことによって実行されるワードリストであることを示しますcomplete。これにより、コマンドが望ましいワードリスト形式に配置されます。-Wcompletesed

警告と落とし穴:

  1. makeファイルの名前は「GNUMakefile」または「Makefile」または「makefile」以外の名前です。このようなタイトルに頻繁に遭遇する場合は、?akefileそれに応じて正規表現を変更することを検討してください。

  2. 変更を加えた後、〜/ .bash_profileまたは〜/.bashrcファイルのソースを忘れています。初心者にはなじみがないので、この一見些細な詳細を追加します。bashファイルへの変更を有効にするには、コマンドを使用してそれらをソースします

    source ~/.bashrc
    

    また

    source ~/.bash_profile
    

PS。また、bashの完了と同じように、[Tab]を2回押すことで、可能なmakeターゲットを表示する機能が追加されました。[Tab]を2回入力する前に、コマンドmakeの後にスペースを追加してください。

于 2016-07-16T21:51:38.380 に答える
14

これはあなたが探しているものでしょうか?

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

make [Tab]は、Makefile内のすべてのターゲットで完了します。このプロジェクトは、最も一般的なLinux / UNIXコマンドのプログラム可能な完了ルーチンを作成し、システム管理者やプログラマーが日常的に行う必要のある入力の量を減らすために考案されました。

于 2010-11-15T20:09:58.930 に答える
7

ほとんどすべてのOSで利用可能なbash-completionと呼ばれる便利なパッケージがあります。Makefileの完了が含まれます。

(macOSとHomebrewを使用している場合は、を介してこれを取得できますbrew install bash-completion。)

于 2019-01-08T15:27:44.750 に答える
3

これは、少なくともDebianLennyではデフォルトのようです。

$ 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 に答える