vim 명령을 vim으로 파이프 할 수 있습니까?


18

다음 셸을 실행하고 싶습니다.

wea-this is the end of the second word | vim j
exit 0

내가 원했던 것은 키 획을 파이프하고 w(단어 앞으로 이동) 그런 다음 e( 단어 끝) 그런 다음 a(첨부) 그런 다음 -this is the end of the second word(텍스트) j이미 단어가 있는 Vim 문서에 이름 을 붙 입니다.

쉘 스크립트를 실행할 때 다음 오류가 발생했습니다.

/root/bin/tt.sh: line 1: wea-this: command not found
Vim: Warning: Input is not from a terminal

우분투 14.04를 실행 중입니다. 두 가지 유형의 답변이 인정 될 것입니다.

  1. 이 원하는 결과를 얻기 위해 배관을 사용하는 방법.
  2. "Vim 명령"(ed 또는 sed 명령이 아님)을 사용하여 쉘 스크립트에서 텍스트 문서를 편집 할 수있는 또 다른 방법입니다.

1
|문자 파이프 다른 한 명령의 출력. wea-this명령이 아닙니다. 파이핑을 사용하여 원하는 작업을 수행 할 수 없습니다. Vim의 stdin은 키보드가 아닌 왼쪽 응용 프로그램이됩니다. vim의 버퍼에 stdin을 넣으려면 파일 이름의 마이너스로 시작하십시오 echo Hello, world! | vim -.
dash-tom-bang

답변:


15

"hello"파일의 첫 줄에 문자열을 삽입하려면 j셸에 다음 명령을 입력하십시오.

vim +"1 | put! ='hello'" j

  • :1 커서를 버퍼의 첫 번째 줄로 이동
  • :put! ='hello' 현재 행 위에 "hello"문자열을 붙여 넣습니다.

문자열을 삽입 한 "hello"다음 파일을 저장하고 종료하려면

vim +"1 | put! ='hello' | x" j

이전과 마찬가지로 :x저장하고 종료 하는 Ex 명령 을 추가했습니다 .

보다 일반적으로 다음과 같이 파일, 대화식 쉘 또는 bash 스크립트에서 Ex 명령 시퀀스를 실행할 수 있습니다.

vim +'Ex command1 | Ex command2 | ...' file

Ex 명령이 많으면 myExCommands.vim한 줄에 하나씩 전용 파일 (예 :)로 명령을 작성한 다음 셸 또는 스크립트에서이를 Ex 명령 :source또는 짧은 버전으로 작성할 수 있습니다. :so) 이렇게 :

vim +'so myExCommands.vim' file

편집하다

질문을 편집 한 것으로 보입니다.
난 당신이 예 명령과 함께 전 모드에서 모든 일반 명령을 실행할 수 있기 때문에 이전의 대답은 여전히 적용 생각 :normal하고 :execute.

예를 들어, 다음과 같이한다고 가정 해 봅시다.

  • 버퍼의 첫 번째 줄로 커서를 움직입니다 ( 1G)
  • 커서를 줄의 첫 번째 공백이 아닌 문자로 이동하십시오 ( _)
  • 커서를 한 단어 앞으로 이동 ( w)
  • 커서를 새 단어의 끝으로 이동하십시오 ( e)
  • 커서 아래에있는 문자 다음에 삽입 모드로 이동 ( a)
  • 문자열을 삽입 hello
  • 저장 후 종료 ( :x)

파일 j에서 이를 수행하려면 쉘에서 입력하십시오.

vim +"execute 'normal! 1G_weahello' | x" j

자세한 내용은 다음을 참조하십시오.

:help +cmd
:help :normal
:help :execute

목표를 완전히 밝히지 못했습니다. w와 같은 vims 명령을 사용하여 단어를 앞으로 나아갈 수 있기를 원합니다. 수정하기 위해 질문을 편집하겠습니다.
Jason Basanese

@JasonBasanese 내 답변을 편집하고 Ex 명령 :normal:execute수행하고 원하는 작업을 수행합니까?
saginaw

9

다음은 ex 명령이 아닌 일반 모드 명령을 사용하여 stdin에서 Vim에 제공되는 스트림을 편집하는 방법입니다. 이것은 매우 유용한 예는 아니지만 관련된 기술을 보여줍니다. 쉘이 bash라고 가정합니다.

echo "The brown fox jumped." | vim -s <(printf 'wcwred\e:wq! foo\n') -

-끝은 표준 입력에서 텍스트를 (안 명령) 읽기 빔을 알려줍니다. 이 명령 -s은 Vim에게 지정된 파일에서 키 입력을 실행하도록 지시합니다. 이 경우 파일은 bash 프로세스 대체의 출력입니다. 은 <(...)명명 된 파이프의 이름으로 대체됩니다. 파이프의 출력은 괄호 안의 명령 출력입니다. wcwred\e한 단어로 이동 커서 변경 그 다음 단어에 red. 는 :wq! foo\n파일에 결과를 저장 foo하는 파일이 이미 존재하는 경우에도 있습니다. 최종 결과는 foo텍스트를 포함하는 이름의 파일입니다The red fox jumped.

이러한 주제 중 일부에 대한 자세한 내용은

:help -file
:help -s

매뉴얼 페이지 의 Process Substitution섹션 도 참조 bash(1)하십시오.


내 ~ / .zshrc에 추가되었습니다 : vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }. 이제 할 수 있습니다 vimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat foo. 산뜻한!
레너드 파울리

4

하위 쉘에서 리디렉션 된 프로그램의 출력을 얻는 방법이 매우 쉽다는 것을 알았습니다.

vim <( program )

예:

 vim <( grep -nH  hello  myFile.cpp )
 vim <( find . -name '*.cpp' -exec grep -nH code_expr {} \+ )

4

나는 당신과 똑같은 욕망을 가지고있었습니다 : 나는 정상적인 vim 명령을 작성하고 파이프 라인 스트림을 편집하고 싶었습니다. 기본 vim 옵션에서 제공하는 것처럼 일반적인 vim을 사용하는 어려움 (너무 많은 플래그!)에 실망했습니다.

따라서 vim에 https://github.com/MilesCranmer/vim-stream/ 작은 래퍼를 작성했습니다 . 이라고 vims합니다.

랩퍼의 핵심은 다음 명령입니다.

vim - -nes "${vim_cmds[@]}" -c ':q!' | tail -n +2

이것을 명령 생성과 함께 사용하면 매우 간결하게 작동하며 vim은 모달 편집기이므로 vims모달 스트림 편집기를 만들었습니다 . 파이프 라인 편집 사고 방식에 유용한 세 가지 주요 모드가 있습니다.

[-t|--turn-off-mode] - (Default mode)
                       Every string is a vim command line, e.g., '%g/foo/d' deletes
                       all lines with foo.
[-e|--exe-mode] -      Translated to '%g/$1/exe "norm $2"', see examples below
[-s|--simple-mode] -   Like exe-mode, but runs on 1st line only

이것을보세요:

$ echo "Hello World" | vims -s "ea Beautiful"
Hello Beautiful World

따라서 e의 끝으로 이동 Hello한 다음 a추가 를 시작합니다.

exe-mode에서을 포함하는 행을 주석 처리 my_bad_var하고 이전 행을 삭제하는 것이 더 좋습니다.

cat my_script.cpp | vims -e 'my_bad_var' 'I//\<esc>kdd'

어느로 변환 vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'- I라인의 시작 부분에 삽입 시작하는 명령 인 및 //주석 순서 인. \<esc>kddEsc 키를 누르고 줄을 위로 이동 한 다음 줄을 삭제합니다.

레포에 대한 총 11 가지 예가 있습니다. 체크 아웃을 권장합니다. 다시 말하지만, 이것은 vim 위에서 실행되며 스트림 입력을 위해 sed처럼 vim을 더 잘 만드는 방법입니다 (그러나 모든 사랑하는 vim 매크로를 보존하십시오!)


3

이것은 상당히 오래된 질문이지만, 주어진 배포판 / OS가에 액세스 moreutils할 수 있다면 설치 vipe하고 표준 추가로 사용할 수 있음에 기여할 가치가 있다고 생각했습니다 vim.

echo foo | vipe # Now you can edit "foo" to be "bar"!

moreutils다른 도구에도 매우 유용하며, 심각한 명령 줄 사용자라면 강력히 추천합니다! :) 자세한 내용은 저자 소개 (이전 링크)를 참조하십시오.

moreutils패키지 관리자와 Mac의 Homebrew를 통해 대부분의 * nix와 같은 배포판에 일반적으로 제공됩니다 . 예를 들어 ...

# Arch Linux and MSYS2 (more below) as part of the `community` repo
pacman -Sy moreutils


# Mac OS and Homebrew
brew install moreutils

moreutils또한 MSYS2 패키지 저장소일부 이므로 Windows에서도 기술적으로 사용할 수 있습니다. :)

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