Vim에서 여러 줄에 편집을 반복하려면 어떻게합니까?


122

Vim에서 명령 앞에 숫자를 추가하여 명령을 반복 할 수 있다는 것을 알고 있습니다. 예를 들어 다음과 같은 방법으로 5 줄을 삭제할 수 있습니다.

5dd

예를 들어 명령을 적용 할 줄 범위를 지정할 수도 있습니다.

:10,20s:hello:goodbye:gc

'수직 편집'은 어떻게 수행합니까? 예를 들어, 특정 기호 (예 : 쉼표)를 지정된 모든 줄의 시작 부분 (공백 건너 뛰기, 즉 명령 모드에서 Shift-I 뒤에 쉼표를 입력하면 얻을 수있는 것)을 삽입하고 싶습니다. 범위. 어떻게 이것을 달성 할 수 있습니까 (하강 기간 하락 기간에 의존하지 않고)?

답변:


107

:10,20s/^/,/

또는 매크로를 사용하여 다음과 같이 기록하십시오.

q a i , ESC j h q

함께 사용 :

@ a

설명 : q a매크로 등록 기록 시작 a, q끝이 기록. 이를 a위해 z사용할 수 있는 레지스터 가 있습니다.


감사. shift-i에 해당하는 것을 원하면 어떻게합니까? 즉, 초기 공백을 건너 뛰는 것입니까?
saffsd

2
설명 : ^\(\s*\)초기 공백을 캡처하여 레지스터에 저장 한 다음 \1.
Svante

136

Ctrl- v블록 단위로 시각 모드로 들어갑니다. 그런 다음 이동 ( hjkl-wise, 평소대로) 할 수 있으며 여러 줄에 무언가를 삽입하려면 Shift-를 사용하십시오 i.

따라서 텍스트의 경우 :

abc123abc
def456def
ghi789ghi

당신이 충돌하는 경우 Ctrl- v커서와 함께 1 이상, 명중 j두 개의 열이 내려 가고 두 번, 다음 Shift- i,ESC이 같을 것이다 텍스트 :

abc,123abc
def,456def
ghi,789ghi

(여러 줄 삽입은 약간의 지연이 있으며를 누른 후까지 렌더링되지 않습니다 ESC.)


3
좋은. Ctrl-V는 대문자를 의미하며 Ctrl-Shift-v
Svante

8
실제로 CTRL-v 또는 CTRL-V입니다. Vim은 CTRL- 코드에서 대소 문자를 구분하지 않습니다 (: help CTRL- {char} 참조).
rampion

2
이 방법이 작동하지 않는 이유를 조금 검색 한 후 i 대신 대문자 I (shift-i)를 사용하기 때문입니다 (또한 ctrl-shift-v가 나를 끝으로 이동 시켰기 때문에 ctrl-v뿐이었습니다)
Willyfrog

4
궁금해. iShift 키없이 그냥 사용하지 않는 이유는 무엇 입니까?
off99555 16.11.

1
시프트없이 i는 현재 위치에 삽입됩니다. shift + i는 줄 시작 부분에 삽입
Kevin P


44

이미 '.'를 사용하고있는 경우 마지막 명령을 많이 반복하려면 이것이 지금까지 가장 편리한 솔루션이라는 것을 알았습니다 . 다음을 사용하여 시각적 블록의 각 줄에서 마지막 명령을 반복 할 수 있습니다.

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
이것은 도움이되지만 .시각적 모드에서 라인 방식으로 작동 하므로 제한적 입니다. 이 경우 시각적 모드가 선 범위를 선택하는 데 때때로 편리 할 수 ​​있다고 생각합니다. 그러나이 경우 명령과 매크로가 더 유연하고 강력합니다.
Bohr

23

이 작업을 수행하는 가장 쉬운 방법은

1) 한 줄에 매크로를 기록하고 'a'라고 부릅니다. 이 경우 하나의 유형

qa I, ESC jq

2) 매크로를 적용 할 줄 블록을 선택합니다.

3) 'norm'함수를 사용하여이 행 블록에 대해 매크로 'a'를 실행합니다.

:'<,'>norm@a

17

가장 쉬운 방법은 매크로를 기록한 다음 원하는만큼 매크로를 반복하는 것입니다. 예를 들어 모든 줄의 시작 부분에 쉼표를 추가하려면 다음을 입력합니다.

q a I , ESC j q

5 번 반복하려면

5 @ a


2

.운영자 에 편집 내용이 이미 저장된 상태에서 다음을 수행하십시오.

  1. 시각적 모드를 사용하여 연산자를 적용 할 텍스트를 선택하십시오.
  2. 그런 다음 명령을 실행하십시오. :norm .

1

이미 답변했듯이 매크로를 제외하고 행 범위 (예 : 10 ~ 20 행)에 쉼표를 삽입하는 특정 경우에 대해 다음과 같이 할 수 있습니다.

:10,20s/\(.*\)/,\1

즉, \ (및 \)를 사용하여 번호가 매겨진 그룹 일치를 만들고 교체 문자열에 \ 1을 사용하여 "일치 내용으로 교체"라고 말할 수 있습니다.

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