2015-11-17 26 views
5

MakefileのターゲットはLinuxでは完了していますが、AFAICSではMac OS(10.8.5)では使用できません。Macでメイクファイルの自動補完

このOSで作業を完了できますか?

+1

は、あなたが(インストールおよび/または有効)を見つけることができるかどうかを確認する必要がapproprate bashの補完を:に触発


あなたのマシンで。 OS Xを搭載して出荷されているのか、BREWなどで入手できるのか分かりません。 –

+0

@EtanReisner Mac OS 10.8でその補完について言及しておいたはずです。 'cd'。したがって、私はいくつかのbash補完が既にコンピュータ上で利用可能であると思う。 –

答えて

13

これはエルキャピタンに私のために簡単な、bashの補完を達成するようだ:

# .bashrc 
function _makefile_targets { 
    local curr_arg; 
    local targets; 

    # Find makefile targets available in the current directory 
    targets='' 
    if [[ -e "$(pwd)/Makefile" ]]; then 
     targets=$(\ 
      grep -oE '^[a-zA-Z0-9_-]+:' Makefile \ 
      | sed 's/://' \ 
      | tr '\n' ' ' \ 
     ) 
    fi 

    # Filter targets based on user input to the bash completion 
    curr_arg=${COMP_WORDS[COMP_CWORD]} 
    COMPREPLY=($(compgen -W "${targets[@]}" -- $curr_arg)); 
} 
complete -F _makefile_targets make 

ここでは、これがどのように動作するかです:

  • 完全-F [関数名] [コマンド名] - - このbash組み込み関数は、bash関数[関数名]によって生成される[コマンド名]の新しい補完を登録します。上記の私のコードでは、シェルにmake [TAB][TAB]と入力すると、_makefile_targets()関数がトリガーされます。

  • [[-e "$(pwd)/ Makefile"]]; - 現在のディレクトリにMakefileがあることを確認します。そうしないと、bash補完を試みません。

  • はgrep -oe '^ [-ZA-Z0-9 _-] +' のMakefile - "テスト:" のようなターゲット名に正規表現を使用したMakefileのすべての行をフィルタリングします。 -oは、一致する行の一部のみを返すことを意味します。例えば、 "test:build package"のようなMakefileターゲットが与えられた場合、 "test:"だけが返されます。

  • | sedの/:// ' - grep結果を取得し、行末からコロンを削除します。

  • | TR「\ n」を「」は - 1行にすべてのターゲットsmoosh、あなたのためのいくつかの環境変数を設定しますcomplete 1つのスペースbashの補完機能インサイド

、で区切られています。 COMP_WORDSは、ユーザが入力した内容に基づいて利用可能なbash補完チョイスのリストの配列です。 COMP_CWORDは現在選択されている単語のインデックスです。

もう一つの非常に魔法の組み込みcompgenは、スペースのリストを別々の文字列として受け取り、現在選択されている単語を使用してそれらをフィルタリングします。私はその仕組みがはっきりしていない。

最終行は、関数内の最後の2行がmakefileターゲットのリスト($targetsの中に格納されている)をフィルタリングし、それらを配列COMPREPLYに移動することです。 bash補完によって、シェル内の選択肢としてCOMPREPLYが読み込まれ、表示されます。

  1. https://gist.github.com/tlrobinson/1073865
  2. http://www.thegeekstuff.com/2013/12/bash-completion-complete/(ESP 9)
+0

'.bashrc'に' Makefile'の代わりに 'makefile'を追加すると、小文字の名前を持つメークファイルを十分に考慮することができます。 –

+1

@DenisBitouzéはい!お使いのOSに応じてメイクファイルを作成する可能性がかなりあります。 – Rustavore