도움에서 :help backtick-expansion
:
On Unix and a few other systems you can also use backticks for the file name
argument, for example:
:next `find . -name ver\\*.c -print`
:view `ls -t *.patch \| head -n1`
The backslashes before the star are required to prevent the shell from
expanding "ver*.c" prior to execution of the find program. The backslash
before the shell pipe symbol "|" prevents Vim from parsing it as command
termination.
도움말에서 가져온 명령을 입력하면 오류가 발생합니다.
:next `find . -name ver\\*.c -print
E79: Cannot expand wildcards
도움말의 예제가 왜 하나 대신 두 개의 백 슬래시를 사용합니까? 왜 작동하지 않습니까?
다음과 같은 일 :
find
프로그램 전에 쉘에 의해 별이 확장되는 것을 방지하는 두 개의 백 슬래시 중 하나를 제거하면 ::next `find . -name ver\*.c -print`
백 슬래시를 모두 제거하고 패턴 주위에 작은 따옴표를 넣으면
ver*.c
::next `find . -name 'ver*.c' -print`
이 시점까지 규칙은 다음과 같습니다.
쉘 명령에 별표가 포함되어 있고 명령 전에 쉘을 확장하지 않으려면 명령 앞에 백 슬래시를 넣거나 패턴 주위에 작은 따옴표를 넣으십시오 .
그러나 도움이 또 다른 예를 제공합니다.
:view `ls -t *.patch \| head -n1`
이 명령은 수정없이, 작은 따옴표 나 백 슬래시가 필요하지 않습니다.
그것이 작동하는 이유는 ls
명령 (명령 -name
인수와 달리 find
)이 여러 파일 인수를 허용하고 쉘 확장에 문제 가 없기 때문이라고 가정합니다 *.patch
.
자,하자 내가 확장자를 가진 모든 파일을 찾아하고 싶은 말은 .conf
내부 /etc
의 폴더 및 파이프 출력 find
에 grep
문자열을 포함하는 경우에만 일치를 얻을 input
.
셸에서 모든 작업 디렉토리에서 다음을 입력합니다.
find /etc -name '*.conf' | grep input
그리고 작동합니다.
vim에서는 역동적 인 명령을 입력하고 파이프 기호 앞에 역 슬래시를 입력하여 vim이 명령 종료로 해석하지 못하도록합니다.
:next `find /etc -name '*.conf' \| grep input`
그리고 작동합니다.
이제 파이프와을 사용하지 않고 동일한 명령을 입력 grep input
하면 오류가 발생합니다.
:next `find /etc -name '*.conf'`
E79: Cannot expand wildcards
작은 따옴표로 별을 보호 했는데도이 경우 오류가 발생하는 이유는 무엇입니까?
그리고 왜 지금 오류가 grep input
있습니까? 그러나 파이프와 ?
이해를 시도하기 위해 더 간단한 명령을 생각해 냈습니다.
find . -name '*.conf'
.conf
작업 디렉토리에서 확장자 가있는 모든 파일을 찾습니다 . 이 명령은 쉘에서 작동합니다.
vim에서 테스트하려면 다음 :next `find . -name '*.conf'`
과 같이 입력하십시오 . 이 경우 점은 vim 세션을 시작한 이후 :pwd
내 홈 디렉토리 인 Ex 명령으로 표시되는 현재 작업 디렉토리를 나타 /home/username
냅니다.
현재 작업 디렉토리에서 검색을 요청할 때 왜 작동 /etc
합니까? 와 같은 임의의 폴더에서 검색을 요청하면 작동하지 않습니까?
이제 vim Ex 명령으로 작업 디렉토리를에서 /home/username
로 변경 하고 이전과 동일한 명령을 다시 시도하면 오류가 다시 발생합니다./etc
:cd /etc
:next `find . -name '*.conf'`
E79: Cannot expand wildcards
홈 폴더에있을 때 동일한 명령이 작동하는 이유는 무엇 /etc
입니까?
나는 어떤 논리가 있다고 확신하지만 그것을 찾을 수는 없습니다.
arglist를 임의의 쉘 명령 (별표, 파이프 포함, 작업 디렉토리에서 디렉토리 검색)으로 채우는 일반적이고 올바른 구문은 무엇입니까?
vim 버전 7.4.942를 사용 하고 있으며 zsh가 기본 쉘입니다. vim -u NORC -N
bash와 zsh에서 최소한의 초기화 ( )로 이러한 명령을 테스트했습니다 .
zsh가 아닌 bash를 호출하도록 vim을 구성해야합니까?
vim $(find . -name ver\*.c -print)
, vim $(ls -t *.patch | head -n1)
, vim $(find /etc -name '*.conf' | grep input)
, vim $(find /etc -name '*.conf')
,vim $(find . -name '*.conf')
--remote
: 참조 vi.stackexchange.com/a/5618/4939을 하지만 난 방법을 알고 궁금 해요) 현재 세션에서 직접 수행하십시오. 가능하지 않다면 괜찮지 만 도움말을 읽은 후에는 가능할 것 같습니다. 그렇다면 vim이 왜 비슷한 명령에 다르게 반응하는지 이해하고 싶습니다.
find /etc -name '*.conf'
작동하지 않는 경우 재미있는 이름이 해당 명령에서 나온 것으로 생각되며 이것이 파이프를 통과했을 때 작동하는 이유 일 수 있습니다 grep
.
vim $(find . -name ver*.c)