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

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

때로는 텍스트를 작성한 다음 해당 텍스트를 다른 명령으로 연결해야 할 때도 있습니다. 내 일반적인 작업 흐름은 다음과 같습니다.

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 스크립팅을 배우고 싶습니다. 편집기를 열고 편집기가 닫힐 때 편집기의 출력을 표준 출력으로 파이프하는 명령을 작성하여 프로세스를 더 간단하게 만들고 싶습니다. 그런 다음 명령을 실행할 수 있습니다 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

내가 빨리 직면한 문제는 vim과 같은 작업을 할 때 quickedit | command모든 출력이 파이프로 제한되어 있기 때문에 vim 자체적으로 편집기로 사용할 수 없다는 것입니다.

함수의 출력을 파이프할 수 있는 해결 방법이 있는지 궁금합니다 quickedit. 차선책은 서브라임 텍스트 같은 별도의 편집기를 실행하는 것이지만 저는 정말 터미널에 머물고 싶습니다.

답변1

vipe파이프를 편집하는 프로그램입니다:

command1 | vipe | command2

전체 출력이 포함된 편집기가 제공되며, 종료하면 콘텐츠가 해당 편집기로 파이프됩니다 command1.command2

이 경우에는 다음과 같이 command1할 수 있습니다.

: | vipe | pandoc -o foo.pdf

또는:

vipe <&- | pandoc -o foo.pdf

vipeVim을 여는 데 사용할 수 있는 변수를 EDITOR가져 옵니다 .VISUAL

아직 설치하지 않았다면 패키지 또는 귀하의 취향에 맞는 패키지에서 찾을 vipe수 있습니다 .moreutilssudo apt-get install moreutils

답변2

Vim에서는 다음과 같이 할 수 있습니다.

:w !pandoc -o file.pdf

또는 복잡한 파이프에 버퍼를 작성할 수도 있습니다.

:w !grep pattern | somecommand > file.txt

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

:q!

vi그러나 특정 사용 사례에 따라 명령줄 편집기를 사용하는 더 나은 솔루션이 있을 수 있습니다. 다음을 사용한다고 가정합니다 bash.

set -o vi

이렇게 하면 키 바인딩이 로 설정됩니다 vi. 따라서 기본 키 바인딩을 사용하여 명령줄에서 와 같은 명령을 직접 vi입력하여 명령을 <Esc>편집 할 수 있습니다. ( 를 눌러 삽입 모드로 돌아갈 수 있습니다 .)vixcwi

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


예를 들어, 까다로운 텍스트를 작성하고 즉시 pandoc로 연결하려면 다음을 입력하면 됩니다.

<Esc>v

그런 다음 다음과 같은 내용이 나타날 때까지 Vim 버퍼를 편집합니다.

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

그런 다음 저장하고 종료하면( 사용 :x) 전체 프로세스가 쉘 명령으로 실행됩니다.

이는 쉘의 명령 기록에서도 찾을 수 있습니다.

답변3

파이프라인에서 실행

노력하다:

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

요점은 vim제대로 작동 하려면 vimstdout이 터미널로 필요하다는 것입니다. 여기서는 리디렉션을 통해 이를 달성합니다 >/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와 ! 사이의 공백이 중요합니다).

답변4

vim, vi, vile, emacs는 모두 버퍼와 심지어 버퍼 조각(예: 줄 선택)을 필터와 명령으로 파이프하는 것을 지원합니다. 이는 매우 강력하며 파일을 편집하는 데 도움이 될 수 있으며(클래식 유틸리티가 편집 도우미가 됨) 편집기에서 작업을 수행하고 텍스트 파일을 사용하여 커서 선택이나 이동 등에 의해 수행되는 전체 명령을 기억할 수 있습니다. 이 !캐릭터는 고전적인 트리거입니다. vi 매뉴얼을 읽고 이 항목을 찾으십시오. 휴대용 사용자 정의 구성을 사용하면 이러한 편집기는 열악한 네트워크 또는 그래픽 기능에도 불구하고 사용할 수 있고 시간이 지나도(수명) 안정성을 유지하는 편리한 오프로드 툴킷이 됩니다. 그것들은 깊이 공부할 가치가 있으며, 그 중 하나가 당신의 가장 친한 친구가 될 수도 있습니다.

관련 정보