Vim : 여러 줄에 같은 문자를 삽입


306

때로는 여러 줄에 걸쳐 특정 시각적 텍스트 블록을 편집하고 싶습니다.

예를 들어 다음과 같은 텍스트를 사용합니다.

name
comment
phone
email

그리고 이렇게 보이게

vendor_name
vendor_comment
vendor_phone
vendor_email

현재 내가 지금 할 방식은 ...

  1. 를 누른 V다음 j4 번 을 눌러 블록의 4 행을 모두 선택하십시오 .
  2. 와 들여 쓰기 >.
  3. 로 한 글자 뒤로 이동합니다 h.
  4. 로 시각 모드 차단으로 이동합니다 Ctrlv.
  5. j4 번 눌러 4 행을 선택하십시오 . 이 시점에서 공백의 4x1 시각적 블록 (4 행 1 열)을 선택했습니다.
  6. 를 누릅니다 C. 이것은 하나의 열만큼 왼쪽으로 들여 쓰기되어 있습니다.
  7. " vendor_"따옴표없이 입력 하십시오. 추가 공간을 다시 확보해야합니다.
  8. 를 누릅니다 Esc. 이것은 Esc삽입 모드를 종료 하는 데 사용 하는 횟수 중 하나입니다 . Ctrlc첫 번째 줄만 편집합니다.
  9. 1 단계를 반복하십시오.
  10. 로 다른 방법으로 들여 쓰기하십시오 <.

단어 앞에 공백이 하나 이상 있으면 들여 쓰기 할 필요가 없습니다. 를 사용하여 시각적 블록을 지우지 않아도 공백이 필요하지 않습니다 c.

그러나 분명히해야한다면 들여 쓰기로 필요한 공백을 만들지 않고 위에서 수행 한 작업을 수행 할 수 있습니까?

또한 이유와 삽입 모드 밖으로 종료에 의해서만 작업을 한 번에 여러 줄을 편집 않는 Esc이상 Ctrlc?


보다 복잡한 예는 다음과 같습니다.

name    = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone   = models.CharField( max_length = 135, blank = True )
email   = models.EmailField( blank = True )

name    = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone   = models.whatever.CharField( max_length = 135, blank = True )
email   = models.whatever.EmailField( blank = True )

이 예에서는에 대해 수직 비주얼 블록을 수행 .한 다음 삽입 모드 (예 : type) 동안 다시 삽입합니다 .whatever.. 바라건대 이제이 방법의 단점을 볼 수 있습니다. 수직 위치에서 모두 동일한 텍스트 열만 선택하는 것으로 제한됩니다 .


9
더 좋은 방법 : ": % s / ^ / vendor_ /"
Paul Tomblin

1
답변 주셔서 감사합니다. 모든 줄에 단어를 추가하려는 경우에만 작동합니다. 그러나 내가 사용하는 방법은 모든 위치에서 수행 할 수 있습니다. 좀 더 복잡한 예제로 다른 예제를 추가하겠습니다.
hobbes3

3
그런 다음 shift-V로 변경하려는 행을 강조 표시하고 적절한 검색 및 바꾸기 명령을 입력하십시오 (두 번째 예):s/models\./\0whatever./
Paul Tomblin

위를 달성하는 많은 방법. 질문의 모든 부분에 완전히 대답하려면 파트 1) 정규식 또는 시각적 모드 esc를 편집하면 답변에 제공된대로 훌륭하게 작동합니다 (GVIM에서 시각적 선택을 선호합니다). 2) 부분의 경우 매크로는 Brian Neal이 제공하는 가장 쉬운 방법입니다. 이러한 모든 "방법"에 대해 내가 아는 최고의 자료는 Drew Neil의 Practical Vim입니다. 수식을 잊어 버릴 때마다 빠른 읽기 및 가벼운 참조가 가능합니다. 이 권장 사항이 누군가에게 도움이되기를 바랍니다. 많은 vim 사용자에게는 노력의 가치가 있습니다.
arcseldon

@Paul : 키 스트로크를 세는 경우로 대체 할 수 \0있습니다 &.
icktoofay

답변:


912
  1. 받는 커서를 이동 n에서 name.
  2. 비주얼 블록 모드 ( Ctrlv)로 들어갑니다.
  3. j세 번 누릅니다 (또는 3j).
  4. I(자본 i)를 누릅니다 .
  5. 을 입력하십시오 vendor_. 참고 :를 누를 때까지 (6.) 모든 줄이 업데이트 될 때까지 첫 번째 줄 의 화면 만 업데이트 Esc됩니다.
  6. 를 누릅니다 Esc.

방법을 시연하는 미니 스크린 캐스트

소문자 는 텍스트 객체 의 시작으로 해석 되기 때문에 I소문자 대신 대문자를 사용해야합니다 . 예를 들어 태그 블록 ( ) 내부에서 선택하는 경우 자체적으로 유용합니다 .iiit

'it'텍스트 객체의 유용성을 보여주는 미니 스크린 캐스트


12
CTRL + V가 클립 보드 붙여 넣기에 매핑되어 있기 때문에 Windows 에서이 작업을 수행 할 수 없습니다. 그러나 Vim은 이것을 Windows 버전의 경우 Ctrl + Q 로 매핑했습니다 .
Arnestig

2
@Ven : Vim은 그 시간 동안 실제로 바쁘지 않습니다. 다른 키를 누를 때까지 기다리다가 결국 시간이 초과됩니다. 두 가지 실험 : 먼저, escape를 누른 다음 j또는 같은 다른 키를 즉시 누르십시오 ^L. Vim이 결국 바쁘지 않았다는 것을 알 수있을 것입니다. 그냥 기다리고 있었다. 둘째, (기본값이 아닌) 'timeout'낮은 값으로 변경 하여 시간이 초과되는 것을 관찰하십시오. 801000
icktoofay

1
@icktoofay 설정하려는 변수가 timeoutlen아닌 것 같습니다 timeout.
jez

4
@ANjaNA : 당신이 삽입 할 위치의 경우 같은 열에있는 모든 (예를 들어, 숫자가 모두 같은 길이의 경우), 당신은 눌러 제외하고는 동일한 기술을 사용할 수 있습니다 A보다는 I선택된 블록 후가 아닌 전에 삽입하는 것이다. 그러나 줄 길이가 다르면 작동하지 않습니다. 나는 그것을 위해 각 줄의 끝과 일치하는 대체를 사용하고 싶습니다 :s/$/inserted/.
icktoofay

3
esc를 누른 후 아래쪽 화살표를 눌러야 작동합니다.
GeoSword

69

또 다른 방법은 .( dot) 명령을와 함께 사용하는 것입니다 I.

  1. 시작하려는 위치로 커서를 이동하십시오
  2. 프레스 I
  3. (예를 들어, 당신이 원하는 접두사에 입력 vendor_)
  4. 를 누릅니다 esc.
  5. 누르면 j줄을 아래로 이동
  6. .접두사를 자동으로 다시 삽입하여 마지막 편집을 반복하려면 입력 하십시오.
  7. j와 사이를 빠르게 교체.

이 기술은 종종 적은 수의 추가에 대해 시각적 블록 모드보다 빠르며 범위 내의 모든 한 줄에 텍스트를 삽입 할 필요가 없으면 여분 j의 키 를 눌러 쉽게 건너 뛸 수 있다는 이점이 있습니다. .

많은 수의 연속 된 추가의 경우 블록 접근 또는 매크로가 우수 할 수 있습니다.


다른 접근 방식을 만나서 반갑습니다.
Ibn Saeed

나는 몇 줄만 선호합니다. IMO를 훨씬 쉽게 실행할 수 있습니다.
Dan Bechard

원하는 접두사를 입력 한 후 Esc 키를 누를 필요가 없습니까?
iamnotsam

41
  1. 을 사용하여 수정하려는 줄을 선택하십시오 CtrlV.
  2. 프레스:

    • I: 선택한 항목 앞에 삽입합니다.
    • A: 선택한 후 추가합니다.
    • c: 선택한 내용을 바꿉니다.
  3. 새 텍스트를 입력하십시오.

  4. Esc선택한 모든 줄에 변경 사항을 적용하려면 누릅니다 .

4
우수한! EscVIM 멍청한 놈 의 마지막 단계 를 강조 하겠습니다. 변경 사항이 "나중에"전파되는 것을 알아내는 데 시간이 걸렸습니다!
버그 버니

1
"A"와 "C"옵션에 대해서도 몰랐습니다.
hobbes3

왜 이것이 작동하지 v않습니까? 나는 그것을 할 수 Ctrl+V --> A있지만 v텍스트를 선택하는 것은 효과가 없으며 A그 줄에 추가합니다. 둘 다 선택하지 않습니까? 또한 매우 이상 A합니다. 시각적 블록을 줄의 끝까지 확장하면 줄의 끝에 만 추가됩니다. 그렇지 않으면 시각적 블록이 각 줄의 끝 부분에 추가됩니다. 이 차이 인식하지 못하는 것입니다 aA.
Alex G

1
c대신 대신 사용해야 C했지만 완벽하게 작동했습니다. 감사합니다
Tarol

29

매크로를 사용하여 내 작업을 기록한 다음 반복합니다.

  1. name 의 첫 글자에 커서를 놓습니다 .
  2. qqq 버퍼에 기록을 시작하려면 누르십시오 .
  3. 히트는 i삽입 모드를 입력로 이동합니다 vector_ 다음 공격 Esc모드 삽입 떠날.
  4. 이제 0라인의 시작 부분으로 돌아갑니다.
  5. 이제 j내려갑니다.
  6. 이제 q다시 기록을 중지하십시오.

이제 멋진 매크로가 생겼습니다.

3@q나머지 행을 수행하려면 매크로를 세 번 실행하도록 입력 하십시오.


"q"가 특별합니까 ( "빠른 매크로"의 경우)?
Peter Mortensen

매크로를 어떻게 지속적으로 만들 수 있습니까 (여러 세션에서 작동)?
Peter Mortensen

@PeterMortensen Vim에는 세션이라고하는 기능이 있는데,이 기능은 사용자가 볼 수있는 버퍼 (및 기타 여러 가지)를 유지합니다.
브라이언 닐

27
:%s/^/vendor_/

아니면 뭔가 빠졌습니까?


vender_접두사를 원하지 않는 다른 줄이 많은 파일의 하위 텍스트 일 ​​가능성이 없습니다 .
Dan Bechard

9
@dan 하위 텍스트 만 필요한 경우 검색을 일련의 행 번호로 제한 할 수 있습니다. 예 :1,4s/^/vendor_/
Brad Koch

1
@BradKoch 재미있는. 나는 줄 번호 제한을 알지 못했다.
Dan Bechard

8
흥미롭지 만 더 실용적인 것은 select with Vand type 을 시각적으로 차단하는 것 :입니다. ed 표현식 앞에 ed 표현식을 :'<,'>적용하여 ed가 선택된 항목에만 적용되도록:'<,'>s/^/vendor_/
Dolanor

12

2016 년 1 월 업데이트

허용되는 답변이 훌륭한 솔루션이지만 실제로는 키 입력이 약간 적으며 허용되는 답변에 따라 원칙적으로 더 잘 확장됩니다.

  1. 받는 커서를 이동 n에서 name.
  2. 비주얼 블록 모드 ( ctrlv)로 들어갑니다.
  3. 프레스 3j
  4. 를 누릅니다 I.
  5. 을 입력하십시오 vendor_.
  6. 를 누릅니다 esc.

시각적 인 그림

제공된 답변보다 키 입력 횟수가 적습니다 (3 단계 비교). 수행 할 j 작업 수만 계산합니다.

라인 번호가 활성화되어 있고 (위 그림 참조) 이동하려는 라인 번호를 알고 있다면 3 단계를 #으로 변경할 수 있습니다. G여기서 #은 원하는 라인 번호입니다.

위의 예에서 이것은입니다 4G. 그러나 몇 줄 번호를 처리 할 때 명시 적 카운트가 잘 작동합니다.


7

vi (나노가 아님) 만있는 서버의 일부 구성 파일에서 많은 줄 을 주석 처리하고 싶었 으므로 시각적 방법도 번거로 웠습니다.

  1. 파일 열기 vi file
  2. 줄 번호 표시 :set number!또는:set number
  3. 그런 다음 줄 번호를 사용하여 줄 시작을 "#"으로 바꾸십시오. 어떻게?

:35,77s/^/#/

참고 : 숫자는 포함되며 35 ~ 77 행이며 둘 다 수정됩니다.

주석 처리를 제거하거나 취소하려면 간단히 :35,77s/^#//

모든 코드 줄 뒤에 텍스트 단어를 주석으로 추가하려면 다음을 사용할 수도 있습니다.

:35,77s/$/#test/ (Python과 같은 언어의 경우)

:35,77s/;$/;\/\/test/ (Java와 같은 언어의 경우)

크레딧 / 참조 :

  1. /unix/84929/ 주석 해제-다중-라인-코드-지정-바이-라인-숫자 -using-vi-or-vim

  2. /unix/120615/how-to-comment-multiple-lines-at-once


나는 종종 vim-tiny 만 사용하므로 완벽한 솔루션이었습니다.
JSON C11

7

텍스트 블록을 삭제하고 바꾸려는 사용 사례가있을 수도 있습니다.

이렇게

Hello World

Hello World

Hello Cool

Hello Cool

두 줄 모두에서 "월드"를 시각적으로 선택하면됩니다.

c변경 유형 -이제 삽입 모드에있게됩니다.

원하는 것을 넣고 탈출하십시오.

둘 다 세로로 반영됩니다. 블록을 삽입하는 대신 새 텍스트로 대체한다는 점을 제외하면 'I'와 동일하게 작동합니다.


6

이 파일이 있다고 가정하십시오.

something

name
comment
phone
email

something else
and more ...

"name", "comment", "phone"및 "email"앞에 "vendor_"를 파일의 위치에 상관없이 추가하려고합니다 .

:%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc

c플래그는 확인을 묻는 메시지가 표시됩니다. 프롬프트를 원하지 않으면 삭제할 수 있습니다.


5

더 유연 할 수있는 대안 :

예 : 줄의 시작 부분에 텍스트 XYZ를 입력하려면

:%norm IXYZ

여기서 무슨 일이야?

  • % == 모든 라인에서 실행
  • norm == 일반 모드에서 다음 키를 실행
  • I == 줄의 시작 부분에 삽입
  • XYZ == 입력하려는 텍스트

그런 다음을 누르면 Enter실행됩니다.

귀하의 요청에 따라 :

:%norm Ivendor_

특정 범위를 선택할 수도 있습니다.

:2,4norm Ivendor_

또는 선택한 가시 범위에서 실행하십시오.

:'<,'>norm Ivendor_

1
더 흥미로운 것들을 수행하기 위해 삽입 모드 (norm Iabc <ESC>)에서 <Esc>와 같은 키 시퀀스를 보낼 수 있습니까?
batbrat

1
@ batbrat 방금 이것을 알아 냈습니다! 당신은 칠 수 ctrl-v ctrl-[정상적인 명령의 목적을 위해 다시 "정상 모드"로 당신을 끌어에 "탈출 Esc 키를"삽입 할 수 있습니다. 방금 탈출 한 Esc가있는 '<,'>norm Iaa^[ysiw"곳으로 이것을 테스트했습니다 ^[.
Aubrey Lavigne

4
Use Ctrl+V to enter visual block mode
Move Up/Down to select the columns of text in the lines you want to comment.
Then hit Shift+i and type the text you want to insert.
Then hit Esc, wait 1 second and the inserted text will appear on every line

이 방법은 모든 버전의 vim에서 작동합니까 아니면 vim 플러그인이 필요합니까? 내가 묻는 이유는 b / c이기 때문에 때로는 일부 컴퓨터에서 작동하지만 때로는 작동하지 않습니다. 차이점을 알 수 없습니다. Windows에서 git과 함께 제공되는 vim-작동하지 않습니다. 일부 우분투 및 centos Linux 시스템에서는 작동하지 않습니다. 몇 가지 드문 경우에 성공했지만 성공을 재현 할 수 없었습니다. 미스터리입니다. 내가 ESC를 친 후에는 아무 일도 일어나지 않는 것 같습니다.
davidj411

이상하게도, 그것은 나를 위해 지금 작동합니다. 별을 제외하고 아무것도 변경되지 않았습니다 :) 내 문제에 대한 해결책을 찾는 동안이 페이지에서 무언가를 찾았습니다 . : version 명령을 입력하여 블록 연산자 (I, A 등)를 사용할 수 있습니다. 출력은 + visualextra를 포함해야합니다.
davidj411

귀하의 답변이 아닌 일반적인 의견을 추가하려고했습니다. 이 답변의 대부분은 같은 말을하지만 다른 단어를 사용합니다. 광산은 다른 것을 제공하고 링크를 포함했습니다.
davidj411

2
  1. Ctrl + v 비주얼 블록 모드로 이동
  2. 위 아래 화살표를 사용하여 선을 선택하십시오
  3. 소문자를 입력하십시오 3i( 소문자를 I 세 번 누르 십시오 ).
  4. I(자본을 누르면 I삽입 모드로 이동합니다.)
  5. 추가하려는 텍스트를 작성하십시오
  6. Esc
  7. 아래쪽 화살표를 누르십시오
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.