11 Vim 기본 - 명령 n번 반복하기

반응형

Vim n번 명령 반복하기

Normal 모드에서 숫자를 입력한다는 것

Vim Normal Mode 에서 숫자를 입력하면 상태표시줄에 숫자가 입력되는 것을 확인할 수 있다. 이것은 이렇게 입력된 숫자 이후에 입력되는 명령이 반복될 횟수를 지시한다. 이런 방식으로 Vim 에서는 대부분의 명령어를 n회 반복할 수 있다. 명령어를 수행하기 전에 숫자를 미리 입력하고 명령을 수행하면, 해당 명령이 입력한 숫자만큼 반복되는 것이다.

붙여넣기 반복하기

다음 예제는 한 줄을 복사하여 13회 붙여넣는 예제이다.

붙여넣는 명령어 `p` 앞에 13을 먼저 타이핑했고, 실제로 `p` 명령어가 13회 수행되는 것을 확인할 수 있다.

yy -> 13p, Vim 에서는 모든 명령의 앞에 반복할 횟수를 지정할 수 있다.

줄 삭제 반복하기

5줄을 연이어 삭제하고자 할 때는 어떻게 할지 상상해보자.

가장 직접적인 방법은 `dd` 명령어를 총 5회 입력하는 것이다. 총 10회의 키스트로크가 발생한다.

앞서 살펴본 'Vim 의 마이크로 매크로' 를 활용하면 최초 수행시 `dd` 이후 `.` 명령어를 연이어 4회 입력할 수 있다. 총 6회의 키스트로크가 발생한다.

 

이 포스팅의 주인공인 '명령어 반복' 기능을 활용하면 총 3번의 키스트로크로 위와 동일한 목적을 이룰 수 있다.

다음 예제는 라인을 삭제하는 예제이다. `dd` 명령어를 총 5회 반복하기 위하여 `5dd`를 입력한다.

5dd, Vim 에서는 명령을 반복할 수 있다. 한 줄 지우기 명령을 5번 반복하게 했다.

n번째 출현하는 문자로 이동하기

앞선 포스팅에서 우리는 한 줄에서 특정 문자로 이동하는 방법을 살펴보았다. `f`, `t` 명령어로 가능했다는 점을 기억하자. 다음 문장처럼, 동일한 문자가 여러개 나타나는 경우 명령 반복을 활용하여 단번에 해당 문자로 이동할 수 있다.

 

"show me the money please"라는 문장이 있다. 현재 커서는 s 에 위치하고 있다. e 는 총 5번 등장하는데, 각 위치로 단번에 이동해야할 필요성이 생길 수 있다.

 

앞서 살펴본것처럼`f`명령어를 이용해 `fe`로 다음 'e' 로 이동한 다음 `.` 을 입력하면 순차적으로 다음 e로 이동한다. 하지만, 때때로 '단번에 이동해야할 필요성'이 생길 수 있는데, 특히 이후에 살펴볼 '매크로'기능과 조합될 때 그 진가가 발휘된다. 

 

여기서는 '단번에' 원하는 'e' 위치로 이동해보도록 할 것이다.

간단히, 커서를 위치시키고자 하는 n번째 e 로 이동하기 위해서 `f{n}e` 명령어를 입력해보자. 

명령 반복 기능을 활용하여 커서를 특정 문자로 '단번에' 이동시키기

`c`나 `d` 명령을 모션과 조합해서 사용하는 경우에, 모션 입력 전에 숫자 n을 입력함으로써 n번째 모션까지 명령(삭제 또는 삭제하고 입력하기 등)을 수행할 수도 있다. 다시 말할 필요도 없지만, 이러한 명령은 '마이크로 매크로' 또는 '매크로'와 조합될 때 더 유용하다.

 

e.g. `c4fk` - 현재 커서로부터 다음 4번째 k 까지 삭제한 뒤, insert 모드로 진입

e.g. `v3Tc` - 현재 커서로부터 이전 3번째 c 직전 위치까지 블록 씌우기(비주얼모드)

숫자 증감시키기

사실 이 조합을 눈으로 바로 확인할 수 있는 가장 적절한 조합은 '숫자 증가시키기 ctrl + a' 명령과 '숫자 감소시키기 ctrl + x' 명령이다. (사실 윈도우에서 두 단축키는 각각 전체선택, 잘라내기를 의미하는데, 어떤 것으로 맵핑해둘지는 당신의 선택에 달렸다.)

 

커서 바로 뒤에 오는 숫자를 n 만큼 증가시키고 싶다면, n + ctrl + a 명령어를 사용해주면 된다. 

반대로 커서 뒤에 오는 숫자를 n 만큼 감소시키고자 한다면, n + ctrl + x 명령어를 사용해주면 된다.

Vim 에서 숫자를 늘이고(ctrl + a), 줄이기(ctrl + x) 그리고 명령 반복과의 조합

 

이는, 동일한 수치만큼 올려야 하는 숫자가 코드상에 여러개 존재할 경우, 마이크로 매크로와 함께 유용하게 사용할 수 있다. 다음 스크린샷과 같이, 직원들의 봉급이 책정되어 있고, 모두 10000 씩 봉급을 인상해야하는 상황이라면 어떻게 처리할 수 있을까? 마이크로매크로와 조합하여 다음과 같이 처리할 수 있다.

명령 반복과 숫자 증감시키기를 적용하고, 마이크로매크로로 반복하기

Vim 숫자 증감시키기

이 포스팅의 주제와는 상당히 동떨어진 주제이지만, 숫자 증감시키기는 10진수 뿐만 아니라, 2진수, 8진수, 16진수에 대해서도 동작한다.(그만큼 필자는 이 기능을 중요하다고 생각하지 않는다.) 단 해당 리터럴이 명확하게 표현되어있어야만한다. 또, Vim 라이브러리마다 그 동작 방식이 다를 수 있으니 유의한다. 가령, VSCode Vim Extension 에서는 8, 10, 16진수에 대해서는 증감명령이 동작하지만, 2진수에 대해서는 동작하지 않는다. 반면, 오리지널 Vim 에서는 해당 동작이 모두 정상적으로 수행되는것을 확인할 수 있다.

Vim 에서의 숫자 증감시키기는 2, 8, 16진수에 대해서도 동작한다. 단, VSCode Vim 익스텍션에서 2진수는 인식하지 못한다.
 오리지널 vim 에서는 8진수에 대해서 숫자 증감시키기 동작하지 않음을 확인할 수 있었다. 16, 2진수에 대해서는 동작하는 모습.

응용하기

사실 이 기능은, 모든 명령어와 조합이 되기 때문에, 노멀모드에서의 특정 동작을 수차례 반복하고 싶은 경우 대부분 유효하다. 그렇기에 이 포스팅에서 모든 조합을 소개할 수 없는 이유이기도 하다.


이번 포스팅에서는 Vim 에서의명령어 반복기능에 대해서 살펴보았다. 여기까지, Vim 의 기본이랄 수 있는 대부분의 기능을 살펴보았다. 이 기본을 잘 조합하여 응용하면, 코딩하는 즐거움이 한 층 더 쌓이지 않을까 기대해본다. 드디어 다음 포스팅부터는 Vim Cheat Sheet 를 살펴보면서, '기본 조작'에서는 다루지는 않았지만, 필자가 생각하기에 마이너한 기능들을 한번 정리하고 넘어가려고 한다. 

반응형

Designed by JB FACTORY