쉘에 매크로를 생성하려고 합니다.
내가 자동화하려는 것은 다음과 같습니다.
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