ファイルのリストを記録し、VSCode CLIを使用して開きます。

ファイルのリストを記録し、VSCode CLIを使用して開きます。

シェルにマクロを生成しようとしています。

私が自動化したいのは次のとおりです。

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ループは最初の項目を全体的に処理しfilegrep_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

関連情報