Vim에서 줄 중간에 텍스트를 여러 줄에 삽입하려면 어떻게해야합니까?


91

10 줄이 있는데 그 줄에 나오는 단어 앞에 텍스트를 추가하고 싶다고 가정 해 보겠습니다. 줄의 시작 부분에있을 필요는 없습니다.

에서:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

에:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

그것은뿐만 아니라 앞에 추가 할 수도 bar(실제로 서라운드 만 foobar(foo)?

또한 //여러 줄에 주석을 추가하는 빠른 방법 (C 스타일 주석)을 원합니다 .

저는 Vim / GVim 7.2를 사용합니다.


1
C 스타일의 코멘트 / * * / BCPL 스타일의 코멘트 //이된다
윌리엄 Pursell

답변:


169

첫 번째로 이동하여 - 를 foo눌러 시각적 차단 모드로 전환하고가있는 모든 줄 이 표시 될 때까지 아래로 누릅니다 . 그런 다음 - 를 눌러 블록의 시작 부분에 삽입합니다. 완료하고를 누르면 삽입 된 문자가 표시된 블록 왼쪽의 각 줄에 추가됩니다.CtrlvfooShiftiEsc

또, 마지막에 눌러 삽입하려면 Ctrl- v영향을받는 모든 라인을 표시하고 다음을 눌러 아래로 / 위로 이동 End또는 $라인이 끝날 때까지 선택 영역을 확장 할 수 있습니다. 지금 당신은 누를 수 Shift- a처럼 이전에, 모든 라인의 끝에 추가 할 Shift- i.

시각적 선택은 일반 이동 명령으로도 수행 할 수 있습니다. 그래서 당신은 여는 중괄호와 종류에 움직일 수 C의 전체 블록을 언급하는 Ctrl- v % Shift- i // Esc.


5
추가 사항 : Windows의 Vim에서 Ctrl-V가 시각적 차단 모드를 시작하지 않으면 Ctrl-Q를 대신 사용해야합니다.
Paul

3
then 대답의 변형은 ex 모드에서 블록을 시프트 + V로 표시하는 것입니다. : '<,'> s / ^ / prexix_text / : '<,'> s / $ / suffix_text / Note than " '< , '> "는": "를 누르면 vim에 의해 자동으로 인쇄됩니다.
dimba

1
주석을 제거하려면 시각적 블록을 사용하십시오 (Ctrl + V로 표시). 주석 기호 "//"가있는 열은 "d"를 눌러 주석을 제거합니다. 그나마 C 잊어 ++ 주석 (/ ** /) 너무 :)
dimba

9
Linux에서는 접두사를 모든 줄에 적용하기 전에 삽입 모드에서 이스케이프해야했으며, Visual 모드에서 삽입 모드로 전환하는 데 필요한 대문자입니다 (예 : Shift + I, 유형 접두사, Escape, Escape).
여호수아 엔필드

6
퍼티에서는 작동하지 않습니다. 누를 때 i아무 일도 일어나지 않습니다. 눌렀을 때 shift+i선택 항목이 사라지지만 텍스트를 삽입 할 수 있습니다 (커서 만있는 현재 위치에).
Jürgen Paul

44

첫 번째 질문에 답하려면 아래

:%s/foo/bar(&)/g

를 찾아서 foo일치하는 패턴을 bar(). 이 /g작업을 한 줄에 여러 번 수행합니다.

당신은 단지 매칭이기 때문에 foo, 당신은 간단한 :s/foo/bar(foo)/g. 그러나 위의 방법은 단순한 단어 (예 :)가 아닌 정규 표현식에서 일치 시키기로 결정한 경우 작동 f[a-z][a-z]합니다. 위의 '&'는 일치하는 항목을 나타냅니다.


나는 매크로에 대한 큰 긴 대답을 가졌습니다. 이것은 더 쉽습니다 :-)
Brian Ramsay

여러 줄에 대해 어떻게합니까? 실용적인 경우는 이러한 대체가 필요한 유사한 줄로 구성된 코드 블록이있는 경우입니다.

모든 줄에서 작동하는 것 같습니다 ... : % s 및 / g에 유의하십시오.
ojrac

흥미로운 점은 : % s / foo / bar (&) / gc가 확인하지 않는다는 것입니다- 'c'는 효과가 없습니다 .. Ugh

1
:와 사이의 텍스트에 따라 s작동하는 줄 이 결정됩니다. 현재 행만 의미하는 것은 없습니다. 1,301 ~ 30 행 (포함)을 의미합니다. '<,'>현재 시각적 선택에있는 선을 의미합니다.
rampion

17

선 집합을 접두사로 지정하려면 두 가지 다른 접근 방식 중 하나를 사용합니다.

한 가지 접근 방식은 블록 선택 (sth에서 언급)입니다. 일반적으로 ctrl-V커서 이동 이 뒤 따르는 직사각형 영역을 선택할 수 있습니다 . 사각형을 강조 표시 한 후을 누르면 사각형 shift-I의 왼쪽에 문자가 삽입되거나 사각형 shift-A의 오른쪽에 추가됩니다. 따라서이 기술을 사용하여 접두사 shift-I를 입력하고를 누르고 접두사를 입력 한 다음 이스케이프 를 누를 줄의 가장 왼쪽 열을 포함하는 사각형을 만들 수 있습니다 .

다른 방법은 (Brian Agnew가 언급 한대로) 대체를 사용하는 것입니다. Brian의 대체는 전체 파일에 영향을줍니다 (명령에서 %는 "모든 행"을 의미 함). 몇 줄에만 영향을 미치려면 가장 쉬운 방법은 shift-V첫 번째 / 마지막 줄에있는 동안 (시각적 라인 모드를 활성화 하는) 치고 마지막 / 첫 번째 줄로 이동하는 것입니다. 그런 다음 다음을 입력하십시오.

:s/^/YOUR PREFIX/

^는 정규식 (이 경우 줄의 시작)입니다. 시각적 선 모드에서 입력하면 s 앞에 자동으로 '<,'>가 삽입 된 것을 볼 수 있습니다. 이것은 대체 범위가 시각적 선택이됨을 의미합니다.

추가 팁 : 접두사에 슬래시가 포함 된 경우 백 슬래시로 이스케이프하거나 다른 구두점 문자를 명령의 구분 기호로 사용할 수 있습니다. 예를 들어 C ++ 줄 주석을 추가하려면 일반적으로 다음과 같이 작성합니다.

:s:^:// :

접미사를 추가하는 경우 모든 행이 정확히 같은 길이가 아니면 대체 방법이 일반적으로 더 쉽습니다. ^ 대신 패턴에 $를 사용하면 문자열이 앞에 추가되는 대신 추가됩니다.

접두사와 접미사를 동시에 추가하려면 다음과 같이 할 수 있습니다.

:s/.*/PREFIX & SUFFIX/

. *는 전체 행과 일치합니다. 대체의 &는 일치하는 텍스트 (전체 줄)를 다시 넣지 만 이제 접두사와 접미사가 추가됩니다.

BTW : 코드를 주석 처리 할 때 나중에 주석을 제거하고 싶을 것입니다. 시각적 블록 ( ctrl-V)을 사용하여 슬래시를 선택한 다음 d를 눌러 삭제하거나 대체 (아마도로 만든 시각적 선 선택 shift-V)를 사용하여 다음과 같이 선행 슬래시를 제거 할 수 있습니다.

:s:// ::

6

: 정상 구조!

:%norm Wibar(

:%norm WEa)

: norm (al)은 명령을 입력 한 것처럼 재생합니다.

W-다음 단어로 이동

i-삽입 모드 시작

bar (- 'bar ('시퀀스 유형

또는 한 줄로 :

:%norm Wibar(ctrlvESCEa)

Windows를 실행하는 경우 ctrlq대신 ctrlv.


3

또 다른 가능성 (아마 테스트 케이스에서는 그다지 유용하지 않지만 다른 상황에서는 유용함)은 마크로 변경하려는 영역을 차단하는 것입니다.

  • 맨 윗줄의 아무 곳에 나 커서를 놓고 'a
  • 마지막 줄의 아무 곳에 나 커서를 놓고 'b
  • 명령 실행 :'a,'b s/foo/bar(&)/

나는 일반적으로 모든 것이 화면에 표시되는 경우 시각적 차단 모드를 좋아하고 시작과 중지가 여러 화면으로 구분되는 경우 일반적으로 표시를 선호합니다.


새 마커를 설정하는 m대신 해야합니다 '. '기존 마커의 라인으로 점프하기위한 것입니다. `해당 마커의 행과 열로 이동합니다.
tiktak


0

C 스타일 주석의 경우 Brian의 regexp 답변을 사용하고 줄 끝 $에서 일치 하고 삽입하십시오.

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