vim 편집기를 호출하고 bash로 파이프 출력하는 방법


34

때로는 텍스트를 작성한 다음 해당 텍스트를 다른 명령으로 파이프해야합니다. 내 평소 작업 과정은 다음과 같습니다.

vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example 
rm file.txt

나는이 성가신 것을 발견하고 bash 스크립팅을 배우려고 노력하고 편집기를 여는 명령을 작성하여 편집기를 닫을 때 편집기의 출력을 stdout으로 파이프 처리하여 프로세스를 훨씬 간단하게 만들고 싶습니다. 그런 다음로 명령을 실행할 수 있습니다 quickedit | pandoc -o file.pdf.

이것이 어떻게 작동하는지 잘 모르겠습니다. 위의 정확한 워크 플로우와 몇 가지 추가 사항을 수행하여이를 자동화하는 기능을 이미 작성했습니다. 파일 이름으로 작동하는 임의의 문자열을 생성하고 함수가 호출 될 때 vim에 전달합니다. 사용자가 파일을 저장하여 vim을 종료하면이 기능은 파일을 콘솔에 인쇄 한 다음 파일을 삭제합니다.

function quickedit {
    filename="$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32)"
    vim $filename
    cat $filename
    rm $filename
}
# The problem:
# => Vim: Warning: Output is not to a terminal

내가 만난 문제는 quickedit | commandvim 과 같은 것을 할 때 모든 출력이 파이프에 제한되어 있기 때문에 편집기로 사용할 수 없다는 것입니다.

이에 대한 해결 방법이 있는지 궁금해서 quickedit함수 의 출력을 파이프 할 수 있습니다. 차선책은 별도의 편집기를 실행하는 것입니다. 예를 들어 숭고한 텍스트이지만 터미널에 머물고 싶습니다.


vim 내에서 :w !pandoc -o file.pdf? (사이의 공간을 참고 w하고 !필수적이다.)
John1024

좋아 그거 좋군. vim 자체에서 vim 출력을 파이프 할 수 있다는 것을 몰랐습니다. 이것은 내 목적에 도움이되지만 미래의 지식을 위해 문제를 해결하려는 방식으로 정확하게 내 문제를 해결할 수 있습니까?
theideasmith

함수를 게시 할 수 있습니까? 곧 발생한 문제 (마지막 두 번째 단락)에 대해 이야기 할 때 무엇을 의미합니까? 나는 그것을 얻지 못한다.
Lucas

5
따로, 안전하지 않은 방식으로 재창조 하기mktemp 보다는 사용해야 합니다 .
와일드 카드

새로운 bash 사용자로서 mktemp를 재창조 할 때의 보안 위험은 무엇입니까?
theideasmith

답변:


42

vipe 파이프 라인을 편집하기위한 프로그램입니다.

command1 | vipe | command2

의 전체 출력으로 편집기를 가져 command1오고 종료 command2하면 파이프 를 통해 컨텐츠가 전달됩니다 .

이 경우에는이 없습니다 command1. 그래서 당신은 할 수 있습니다 :

: | vipe | pandoc -o foo.pdf

또는:

vipe <&- | pandoc -o foo.pdf

vipeEDITORVISUAL변수를 선택하여 Vim을 열 수 있습니다.

설치되어 있지 않은 경우 패키지 vipe에서 사용할 수 있습니다 moreutils. sudo apt-get install moreutils또는 귀하의 풍미에 상응하는 것이 무엇이든간에.


1
여기에 도착한 Mac 사용자의 경우 : moreutilsHomebrew에서 사용할 수 있습니다.
vergenzt

FreeBSD 사용자의 경우 : pkg (8)을moreutils 통해 설치할 수 있습니다 .
Mateusz Piotrowski

20

Vim에서이 작업을 수행 할 수 있습니다.

:w !pandoc -o file.pdf

또는 복잡한 파이프 라인에 버퍼를 쓸 수도 있습니다.

:w !grep pattern | somecommand > file.txt

그런 다음 저장하지 않고 Vim을 종료 할 수 있습니다.

:q!

그러나 특정 사용 사례를 고려하면 vi명령 줄 편집기로 사용하여 더 나은 솔루션이있을 수 있습니다. 당신이 사용한다고 가정 bash:

set -o vi

키 바인딩이로 설정됩니다 vi. 기본적인 명령 행에서 바로 명령을 편집 할 수 있도록 vi눌러 키 바인딩 <Esc>하고 입력 vi과 같은 명령 x, cw등 (당신은 눌러 삽입 모드로 돌아갈 수 있습니다 i.)

이 질문과 관련하여 더 좋고 관련성이 높은 Vim을 열어 명령 줄 컨텐츠를 직접 만들 수 있습니다. 그냥 입력 <Esc>v하면 빈 Vim 버퍼가 생깁니다. 당신이 저장하고 종료 할 때, 그것은 이다 명령 행에서 명령하고 즉시 실행됩니다. 원하는 경우 전체 미니 스크립트를 작성할 수 있으므로 명령 줄에서 직접 편집하는 것보다 훨씬 유연합니다.


예를 들어, 까다로운 텍스트를 작성하여 즉시 pandoc에 파이프하려면 다음과 같이 입력하면됩니다.

<Esc>v

그런 다음 Vim 버퍼를 편집하십시오.

cat <<EOF | pandoc -o file.pdf
stuff for pandoc
more stuff for pandoc
EOF

그런 다음 ()를 저장하고 종료 :x하면 모든 것이 쉘 명령으로 실행됩니다.

쉘의 명령 히스토리에서도 사용할 수 있습니다.


1
Emacs 키 바인딩을 유지하려면 Vim을 사용 하여 명령 행을 편집하는 동안 EDITOR환경 변수를 로 설정하고을 vim누른 Ctrl-X다음 Ctrl-E명령 행을 편집 할 수 있습니다.
Anthony G-Monica의 정의

18

파이프 라인에서 실행

시험:

quickedit() (  trap 'rm ~/temp$$' exit; vim ~/temp$$ >/dev/tty; cat ~/temp$$ )

열쇠는 vim정상적으로 사용하기 vim위해서는 stdout이 터미널이되어야한다는 것입니다. 우리는 여기서 리디렉션으로이를 달성합니다 >/dev/tty.

보안을 위해 임시 파일을 사용자의 홈 디렉토리에 넣습니다. 이에 대한 자세한 내용은 Greg의 FAQ 질문 062를 참조하십시오 . 따라서 모호한 파일 이름을 사용할 필요가 없습니다.

예:

vim열리고, 나는 입력 This function succeeded.하고 파일을 저장합니다. 화면의 결과는 다음과 같습니다.

$ quickedit | grep succeeded
This function succeeded.

의 출력이 quickedit파이프 라인으로 리디렉션 되더라도에 vim직접 액세스 할 수 있기 때문에 여전히 정상적으로 작동합니다 /dev/tty.

vim 내에서 프로그램 실행

주석에서 언급했듯이 vim은 파일을 명령으로 파이프 할 수 있습니다. 예를 들어, vim 내에서 명령을 실행하십시오 :w !pandoc -o file.pdf(참고 : w와! 사이의 공백은 필수입니다).


2
좋은 대답입니다. 이것은 사용자의 질문을 직접 다루고 빠르고 우아한 솔루션을 제공합니다. vim을 / dev / tty로 리디렉션하십시오! 단순한!
Mike S

Zsh를 사용하고 있습니다. trap '...' exit실패했지만 trap '...' EXIT작동하는 것 같습니다. 트래핑에 대해 잘 모르지만 임시 파일에 대한 일반적인 접근 방식은을 사용하는 것 mktmp [--suffix=...]입니다. 또한 vim <outfile> -c '...' >/dev/tty파일이로드 될 때까지 정상적으로 실행 된 다음 :wq편집 단계를 건너 뛰려는 경우를 포함하여 지정된 명령 체인을 실행합니다 . 나는 또한 사용 set | grep -a EXIT하고 발견했다 signals=(EXIT ... DEBUG).
John P

5

확인이 vim기본 편집기로 설정되어 있습니다 (예를 들어, export EDITOR=vim귀하 .bash_profile또는 .bashrc그런 어떤 프롬프트에서, 당신은 입력 할 수 있습니다. Ctrl- X다음 Ctrl- E. 이것은 당신의 구성 편집기 (예에서 현재 명령 줄을 엽니 다 vim.) 편집 한 내용을 확인 저장 및 exit를 누르면 파이프 라인 등을 포함하여 명령 줄에 입력 한 것처럼 명령이 실행됩니다.

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