web-dev-qa-db-ja.com

ユーザーがbashでオートコンプリートしたときに、シェルからmakeターゲットを非表示にします

ユーザーがMakefileと入力してからmakeを押したときに、シェルにまったく表示されないように、Tab内のいくつかのターゲットにフラグを立てる方法はありますか?レシピが多すぎるMakefileがあり、ユーザーがTabを押してターゲットを探したときに、それらすべてがシェルのオートコンプリートに表示されないようにします。

問題を研究し、最初の答えで書いた解決策を考え出した後、私は別の非常に単純な方法があることに気づきました。

表示したくないターゲットの名前をdotで始めてください。

例:

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

そして、それはあなたが必要とするすべてです!

。HIDDENGOALSという名前のターゲットが誤って呼び出され、すべての隠された目標を実行するのを防ぐ方法を見つけようとした後、私はこのアイデアに思いつきました。 :)

警告何も表示されませんが、次のようなターゲット名を使用しても副作用がないかどうかはわかりません "。targetname"(で始まるドット)。

6
Dr Beco

一部のターゲットを非表示にするには、シェルのオートコンプリート機能をハックする必要があります。 bash/etc/bash_completion/etc/bash_completion.d/*を使用します。

Tcshがどのようにそれを行うか思い出せません。

1
Jan

これは、ターゲットをアンダースコアで開始することでも機能することを確認しました

_hiddentarget:
    @echo "Running hidden target" 
0
Robby McKilliam

[〜#〜] editd [〜#〜]他の回答(ドットで始まるターゲット名)を読むのが最適です。しかし、プログラミングの部分が他の同様の問題を助けるかもしれないので、私はここでこの答えをさせます。

わかりました。解決策を考え出すのに少し時間がかかりました。これは(良い)ドラフトであり、うまくいけば正しく機能します。

ファイルを編集する必要があります/ usr/share/bash-completion/completeions/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の特別なターゲットによく似ています(いくつかの違いがあります)。

注意

(I)このソリューションはgrep -evを介して機能するため、特別なターゲットはそれほどではありません。正規表現と同じように、行内の任意のものを使用して一致させます。

したがって、たとえばcopy2と、別のcopyのターゲットがある場合は、

 .HIDDENGOALS: copy

両方の目標を非表示にします!

読者への演習として、この動作の解決策を紹介します。 ;)

(II)もう1つ注意すべき点は、:.HIDDENGOALS:の隣にハードコードされていることです。つまり、ターゲットでは許可されますがスペース.PHONY :、この特別なハックはしません。

(III)/ usr/share/bash-completion/completes/makeの代わりにローカルファイルを編集する方が良いと思います。アップグレードが来ます。しかし、私はオプションをテストしませんでした。ご存知の方はコメントしてください。この回答を更新します。

(IV)curiousがターゲットを実行する可能性がわずかにあります。HIDDENGOALS with make .HIDDENGOALS。それはすべての隠された目標を実行します。そして、名前を自動入力することはできませんでした。それは私を他の非常に単純な答えに導きました!

0
Dr Beco