ユーザーがbashでオートコンプリートしたときにシェルでmakeターゲットを隠す

ユーザーがbashでオートコンプリートしたときにシェルでmakeターゲットを隠す

Makefileユーザーが入力して押したときにシェルにまったく表示されないように、特定のターゲットを表示する方法はありますか?レシピが多すぎるため、ユーザーが検索先をタップしたときにレシピがすべてシェルオートコンプリートに表示されることは望ましくありません。makeTabMakefileTab

答え1

この問題を研究し、最初の答えに書いた解決策を考えた後、別の問題があることに気づきました。とても簡単です方法。

表示したくないターゲット名で始めてください。指す

例:

.PHONY: foo .hiddentarget
foo: foo.x .hiddentarget
foo.x: foo.c
        touch foo.x
.hiddentarget: foo.x
        echo foo.x ok, I believe

それはあなたが必要なすべてです!

というターゲットをブロックする方法を悩んで、このアイデアを思い出しました。.隠しターゲット誤って呼び出され、すべての隠しターゲットを実行します。 :)

警告するこのようなターゲット名の使用に副作用があるかどうかはわかりませんが、見たことはありません。.ターゲット名「(ドットで始まる)。

答え2

特定のターゲットを非表示にするには、シェルのオートコンプリート機能をハッキングする必要があります。bash用途/etc/bash_completion/etc/bash_completion.d/*目的。

tcshが何をしているのか覚えてはいけません。

答え3

私はこれが下線でターゲットを始めることによって達成されるかもしれないことを発見しました

_hiddentarget:
    @echo "Running hidden target" 

答え4

編集する他の答えを読むことをお勧めします(ターゲット名はドットで始まります)。しかし、プログラミング部分が他の同様の質問に役立つ可能性があるので、ここでこの質問に答えます。

まあ、解決策を見つけるのに時間がかかりました。これは(良い)ドラフトで、作業が完了することを願っています。

このファイルを編集する必要があります。 /usr/share/bash-完成/完成/make (Debian Wheezy またはあなたに似たものの場合)

現在のバージョンでは、70〜73行は次のとおりです。

70         COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
71             awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
72             {split($1,A,/ /);for(i in A)print A[i]}' )" \
73             -- "$cur" ) )

次に、次のコードに置き換えます。

 70         HIDDENGOALS="$(make -qp | grep '^\.HIDDENGOALS:' | cut -d' ' -f2- | sed 's/ /\\|/g')"
 71         if [[ "$HIDDENGOALS" == "" || "$HIDDENGOALS" == ".HIDDENGOALS:" ]]; then
 72             COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
 73                 awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
 74                 {split($1,A,/ /);for(i in A)print A[i]}' )" \
 75                 -- "$cur" ) )
 76         else
 77             COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
 78                 awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
 79                 {split($1,A,/ /);for(i in A)print A[i]}' \
 80                 | grep -ve "$HIDDENGOALS" )" \
 81                 -- "$cur" ) )

これでmakefile、次のものが利用可能です特別な目標Bashオートコンプリートターゲットを隠す:

 .HIDDENGOALS: somegoal anothergoal goalstohide

特別な目標と非常によく似ています.PHONY(わずかな違いがあります)。

注意深い:

(私)このソリューションはを通じて機能するため、特別なgrep -evターゲットは正確ではありません。正規表現の方法と一致するように、行内のすべてを使用します。

copy2したがって、1つの目標があり、別の目標がある場合は、次のようにcopy書いてください。

 .HIDDENGOALS: copy

2つの目標が隠されています!

私は読者に練習としてこの動作の解決策を提供します! ;)

(二)注目すべきもう一つのことは、それが:隣にあるようにハードコーディングされていることです.HIDDENGOALS:。これはターゲットが許可してもスペース同様に.PHONY :、この特定のハッカーはそうではありませんでした。

(サム)私の考えでは、ローカルファイルを編集するよりも/usr/share/bash-完成/完成/make、アップグレード中の情報の損失を防ぎます。しかし、私はどのオプションもテストしていません。ご存知の方はコメントをつけていただければ、この回答を更新いたします。

(4)多少の可能性があります気になる目標を実行.隠しターゲットを使用すると、make .HIDDENGOALSすべての隠された目標を達成することができます。そして名前を自動補完することは不可能です。これは別の非常に簡単な答えにつながります!

関連情報