vim에서 명령의 결과로 주어진 파일을 엽니 다


34

나는 거의 매일 다음과 같은 일을하고있다

  1. 찾기 실행 ( find -name somefile.txt)
  2. 결과를 엽니 다 vim

문제는 결과를 복사 find하여 vim명령에 붙여 넣어야한다는 것입니다 . 이를 피할 수있는 방법이 있습니까? 나는 약간 ( find -name somefile.txt | vim) 을 실험 했지만 작동하는 것을 찾지 못했습니다.

미리 감사드립니다

답변:


31

명령 대체를 사용할 수 있습니다.

vim $(find -name somefile.txt)

또는

find -name somefile.txt -exec vim {} \;

1
승인. 이것이 필요한 것이라면, -name somefile.txt | xargs vim
balki

3
아니요, 제대로 작동하지 않으며 터미널을 망칠 수도 있습니다! vim은 대화식 터미널에서 입력이 올 것으로 예상하므로 xargs vim으로 파이프 할 수 없습니다.
dogbane


4
또 다른 대안은 다음과 같습니다 vim `find -name somefile.txt`. @StuartPowers 또는 vim `!-1`이 찾기를 이미 사용한 경우 이전 명령 인 경우에도 사용할 수 있습니다.
Bernhard

1
이 시나리오에서 xargs를 사용하려면 @balki를 사용해야합니다. -o 플래그를 사용해야합니다. -o 명령을 실행하기 전에 자식 프로세스에서 stdin을 / dev / tty로 다시여십시오. 이는 xargs가 대화식 응용 프로그램을 실행하도록하려는 경우에 유용합니다.
davidmh

7

이 시도:

  1. vim을 시작하다
  2. vim에서 다음을 사용하십시오.

:r!find /<path> -name 'expression'

검색이 완료되면 결과가 vim에 나타납니다.

또는

시험:

find /<path> -name > results.txt
vim results.txt 

내 솔루션은 정확히 동일하지만 왜 투표가 거부됩니까?
balki

5

명령을 다시 실행하지 않아도되는 경우 :을 누르고 명령을 Up추가하십시오 xargs. 또는 역사 대체를 사용하고 실행하십시오.

!! | xargs vim          # won't work with file names containing \'" or whitespace
!! | xargs -d \\n vim   # GNU only (Linux, Cygwin)

ksh 및 zsh에서는 작동하지만 bash에서는 작동하지 않는 명령의 출력을 저장하는 간단한 방법이 있습니다 (파이프 라인의 출력 측을 상위 셸에서 실행해야 함). 파이프 함수에 명령 K(이하 zsh을 정의), K는 변수의 출력을 eeps $K.

function K {
    K=("${(@f)$(tee /dev/fd/3)}") 3>&1;
}
find  |K
vim $K

쉘만으로는 각 명령의 출력을 자동으로 저장할 수 없으며, 에뮬레이트 터미널에서 명령을 실행해야합니다. 내부에서 실행 script하면 (BSD 유틸리티이지만 Linux 및 Solaris를 포함한 대부분의 유니스에서 사용 가능) 파일을 통해 세션의 모든 출력을 저장합니다 (타입 스크립트에서 마지막 프롬프트를 안정적으로 감지하는 데 약간의 노력이 필요합니다 ).


2

나는 백틱을 사용하고 싶다`(그것과 같은 키에 ~)

> vim `find . -name somefile.txt`

백 틱은 틱 내부의 명령을 실행 한 다음 명령에서 출력을 사용할 수 있습니다. 위의 모든 파일 somefile.txt를 찾을 수 있으므로 모든 파일 :next을 이동하는 데 사용할 수 있습니다.

히스토리 대체를 사용하여 편집기에 대한 명령을 반복 할 수 있기 때문에 명령 수정을 두 번 시도하면 매우 유용합니다.

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`

2

나는 다음을 사용할 것이기 때문에 여기서 요점을 놓쳤을 것입니다.

:find **/somefile.txt

(내에 하나만 있음을 알고있는 경우 :echo &path ) 또는 모두 원하는 경우 :

:args **/somefile.txt

편집 : 우와! 좋아, 그래서 미스 지점을 - 당신 찾기 목록, 실제 파일이 열리지 줄까? Vim에서 다시 시도하십시오.

!!find . -name somefile.txt

-- 내 잘못이야 :)


1

주석에서 @davidmh가 지적했듯이 대화 형 응용 프로그램을 사용 xargs하려면 플래그와 함께 사용할 수 있습니다 -o.

find . -name somefile.txt | xargs -o vim

를 사용하지 않으면 -ovim을 떠난 후 터미널 상태가 엉망이 될 수 있습니다. 완료 한 경우 다음 명령을 사용하여 터미널을 재설정 할 수 있습니다.

reset

0

나는 pvim당신이 원하는 것을 하는 함수 를 썼습니다 . 여러 줄을 파이프로 연결 pvim하면 첫 번째 줄을 제외한 모든 줄을 무시하고 vim에서 여러 파일을 열어서 확장 할 수 있습니다.

stu@sente ~ $ function pvim() { read -r somefile; exec < /dev/fd/1; vim "$somefile"; }
stu@sente ~ $ type pvim
pvim is a function
pvim ()
{
    read -r somefile;
    exec < /dev/fd/1;
    vi "$somefile"
}

다음과 같이 사용하십시오.

stu@sente ~ $ find . -name "foo.txt" | pvim

입력 한 것처럼 첫 번째 "foo.txt"를 vim에로드합니다.

vim $(find . -name "foo.txt | head -n1")


0

다음은 xargs이미 언급 한 것보다 간단한 솔루션입니다.

find -name somefile.txt | xargs vim -p

-p옵션은 vim각 파일을 별도의 탭에서 열도록 지시 합니다. 버퍼를 사용하는 것보다 이것이 더 편리하다는 것을 알았습니다.


0

locatevim 의 도움으로 파일을 여는 것이 매우 편리하고보다 빠릅니다 find.

다음 명령 app.py은 디렉토리를 포함하는 경로에서 호출 된 파일을 검색합니다 MyPythonProject.

:args `locate '*MyPythonProject*app.py'`
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.