표준 입력에서 컨텐츠를 편집하는 방법은 무엇입니까?


15

vim에서 아직 파일이 없어도 명령 줄에서 동적으로 생성 된 내용을 편집하고 싶습니다.

예를 들면 다음과 같습니다.

$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin

그러나 오류가 발생하여 실패합니다.

Vim : 경고 : 입력이 터미널이 아닙니다

Vim : 입력을 읽는 중에 오류가 발생했습니다. 종료하는 중 ...

그것을 달성 할 수 있습니까?


:help stdin... 내장 된 문서에 대한 질문을함으로써 답변을 얼마나 빨리 찾을 수 있는지 놀랍습니다.
dash-tom-bang

답변:


24

-명령 행에서 파일 이름 대신 사용해야 합니다.

echo This is example. | vim -

위의 명령은 표준 입력에서 읽은 텍스트로 채워진 명명되지 않은 버퍼를 엽니 다.


7
-for stdin을 사용하는 것은 명령 행 도구에 거의 표준입니다.
Martin Tournoij

6

이것은 단지 대부분에 대한 재미 노트입니다 bashreadline하지만 당신이 설정 한 경우 EDITOR에 환경 변수를 vim타격, Ctrl+ x+는 e에서 현재 행을 열 것이다 vim. 또한 Meta(Alt/Opt/Esc)+ Ctrl+ 를 입력하면 ebash는 현재 명령 줄에서 인플레 이스 확장을 수행합니다.

$ echo $EDITOR # Assuming EDITOR was set

Meta(Alt/Opt/Esc)+ Ctrl+ e될 것

$ echo vim # Assuming EDITOR was set

Ctrl+ x+ e될 것

1 echo vim # Assuming EDITOR was set
~
~
/tmp/sometmpbufferfile

vim을 종료하면 vim 버퍼의 내용이 명령 줄에서 실행됩니다.

이 기능은 루프 또는 here 문을 필요로하는 프로그램과 같이 bash에서 여러 줄 명령을 원할 때 매우 유용하며 나중에 사용할 수 있도록 약간의 명령 줄 기록을 파일에 저장하는 흥미로운 방법을 제공합니다.

원래 질문에 답하기 위해 다음과 같이 쓸 수도 있습니다.

$ This is an example

다음 히트 Ctrl+ x+ e에서 그것을로드 vim. 또한 당신은 할 수 있습니다

 $ $(cat /etc/hosts)

그리고 어떻게 Meta(Alt/Opt/Esc)+ Ctrl+ eCtrl+ x+ e, 한 줄에 호스트 파일을 모두 넣고 그것을로드 것이다 vim이러한 기능 중 아마 최고의 사용 (- 그러나, 이러한 방법의 유용성은 논의 된 몇 가지 예에서 추정 할 수있다 여기).

귀하의 모드 readline가 설정된 것으로 가정 emacs합니다. 모드 readline로 설정되어 있으면 다음 vim명령을 사용하여 관련 바인딩을 쉽게 찾을 수 있습니다.

bind -p

및를 검색 edit-and-execute-command하거나 shell-expand-line각각 바인딩과 관련이있는 Ctrl+ x+ eMeta(Alt/Opt/Esc)+ Ctrl+ e.


bash에게 emacs 대신 vi 키 바인딩을 사용하도록 지시 할 수 있습니다. set -o vi켜려면 사용하십시오 . 그런 다음 v일반 모드 에서 매핑을 사용 하여 편집기에서 현재 명령을 편집 할 수 있습니다 .
Quincy Bowers

1
vi를 사용하여 명령 행을 편집하는 것은 좋은 방법이지만, stdin에서 텍스트를 읽는 데이 방법을 사용하는 데에는 두 가지 문제점이 있습니다. 1. shell-expand-line확장 된 텍스트에서 개행을 제거하고 2. edit-and-execute-command버퍼에 작성된 명령을 실행하십시오. vi를 종료하면 저장 여부에 관계없이 vi.
toro2k

우와, 대단해. 나는 readline에 대해 매일 새로운 것을 배우고있는 것 같습니다.
Doorknob

2

bash에서 <(command)구문 을 사용하여 프로세스 대체를 사용하는 것이 유용하다는 것을 알았습니다 .

vim <(echo This is example.)
vim <(cat /etc/hosts)

또한보십시오:


4
참고이 의지 하지 않습니다 모든 쉘에서 작동합니다. 나는에서만 작동합니다 생각 bash하고 zsh(그리고 sh, ksh, dash, fish, csh, tcsh, 등)
마틴 Tournoij

@Carpetsmoker ksh88 이상에서 작동해야한다고 생각하지만 프로세스 대체는 POSIX가 아닙니다.
muru

4
자신을 속이지 않도록주의하십시오! 이 방법으로 Vim을 시작하면 다음과 같은 파일에 대한 버퍼가 열립니다 /proc/PID/fd/FD. 버퍼를 작성하고 종료하면 Vim은 불평하지 않지만 작성한 파일은 OS에 의해 제거됩니다. -열린 버퍼에 파일 이름으로 사용 하는 파일과 관련된 파일이 없으므로 Bang 명령을 사용하지 않는 한 종료하려고 시도하면 Vim을 저장하면 경고합니다.
toro2k

1
이것은 일반화되기 때문에 좋습니다 vimdiff <(echo foo) <(echo bar).
wchargin

@ toro2k 후속 조치 는 스트림을 사용 :next하고 :prev다시 읽은 것으로 보이지만 아무것도 얻지 못합니다. 또한 프로세스가 서로 병렬 적이 지 않다 (예 : cat <(sleep 3; echo a) <(echo b)순서대로 인쇄)하고 cat인터리브가 쓰기 및 읽기를 하는 동안 vim외부 프레임을 제외한 모든 것을 표시하기 전에 파일에서 "읽기 완료"를 기다립니다.
John P

-1

새로운 Vim에 파이프 라인을 사용하는 것이 요구 사항이 아닌 경우 Vim의 명령 출력을 현재 버퍼로 가져 오는 기능을 사용하여 파일이없는 백업 버퍼 ( :new존재하지 않는 파일의 편집 또는 편집)와 결합 할 수 있습니다

:read!cat /etc/hosts 명령 모드에서 출력은 현재 커서 위치 아래의 현재 버퍼에 출력됩니다.

비어있는 버퍼에서 수행 될 때 남아있는 비어있는 첫 번째 행을 삭제해야하는 것과는 별도로 Vim이 이미 실행중인 경우에는 매우 편리합니다.


1
이 질문에 어떻게 대답합니까?
muru

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