파일 목록을 기록하고 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 루프는 첫 번째 항목을 전체적으로 처리 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

관련 정보