シェルにマクロを生成しようとしています。
私が自動化したいのは次のとおりです。
Find all the files containing TEXT_TO_SEARCH, and open them with VSCODE
一行でできます。
$ code `git grep TEXT_TO_SEARCH | cut -d: -f1 | sort -u`
だから私の最初のステップは、次の機能を追加することでした。~/.zshrc
cgrep() {
code `git grep "$1" | cut -d: -f1 | sort -u`
}
それから
$ cgrep TEXT_TO_SEARCH
これはうまくいきます。
今、アドインを追加しようとしています。
Before opening each file with VSCode, echo to the console "Opening FILE_NAME"
最初はこれを試しました。
cgrep() {
grep_results=`git grep "$1" | cut -d: -f1 | sort -u`
for file in $grep_results; do
echo "Opening $file"
code $file
done
}
これはgrep_results
「垂直リスト」です。
$ echo $grep_results
src/path1/FILE1.py
src/path2/FILE2.py
src/path3/FILE3.py
このように、forループは最初の項目を全体的に処理しfile
てgrep_results
開きますFILE3.py
(そうではありませんsrc/path3/FILE3.py
)。
私もこれを試しました(GPTの助けを借りて)
cgrep() {
grep_results=`git grep "$1" | cut -d: -f1 | sort -u`
echo "$grep_results" | while read -r file; do
echo "Opening $file"
code "$file"
done
}
これにより、最初のgrepファイルを開くことができ、VSCodeから不要なメッセージを受け取りましたが、実際には理解できません。
$ cgrep TEXT_TO_SEARCH
Opening src/path1/FILE1.py
Run with 'code -' to read from stdin (e.g. 'ps aux | grep code | code -').
答え1
git grep TEXT_TO_SEARCH | cut -d: -f1 | sort -u
これは次のように単純化できます。
git grep -l TEXT_TO_SEARCH
リストには同じファイル名が複数回含まれておらず、実際にはソートされたリストが作成されるため、ソートステップは不要git grep
ですgrep -r
。
grep_results=`git grep …`
ファイル名のリストを文字列に入れます。使用大量に代わりに。入力は改行で区切られたリストなので、zsh(デフォルトではスペース、タブ、およびヌルも区切り文字で処理してスペースまたはタブを含むファイル名を区切ります)に通知するには、次のようにします。f
パラメータ拡張フラグ。
grep_results=( ${(f)"$(git grep -l -- TEXT_TO_SEARCH)"} )
このコードはファイル名の改行で動作するようにすることができます(これはあなたの場合は重要でも重要ではないかもしれません)。リスト要素を分離するためにヌルバイトを使用するように指示し、ヌルバイトからgit grep
出力を分割するようにzshに指示します。
grep_results=( ${(0)"$(git grep -lz -- TEXT_TO_SEARCH)"} )
これでファイル名が配列に保存されたので、配列を繰り返すだけです。
for file in $grep_results; do
print -r Opening $file
code -- $file
done
VSCodeから望ましくないメッセージを受け取りましたが、実際には理解できません。
おそらくcode
標準入力はパイプですが、コマンドラインでファイル名を表示したときにこのメッセージをエクスポートします。その場合は、標準入力がパイプでないcode </dev/null "$file"
ように実行して削除できます。code