shurain

Harmless stuff is for the weak.

도구 - VIM macros

Nov 29, 14

보통 VIM 키바인딩을 지원하는 프로그램들은 최소한의 움직임만 지원할 뿐 VIM을 강력하게 만들어주는 기능을 거의 지원하지 않는다. 단순히 hjkl의 키를 사용해서 움직이거나 단어 단위 혹은 특정 글자 단위로 움직이는 종류의 키만 지원하는 정도이다.

사용이 그다지 어렵지 않지만 알면 크게 다가오는 기능으로 마크, 레지스터와 매크로가 있다. 각각에 대한 자세한 설명은 아래의 명령으로 살펴볼 수 있다.

:help mark-motions
:help copy-move
:help complex-repeat

마크는 코드의 특정 위치를 지칭할 수 있게 해준다. 레지스터는 복사용 클립보드가 여러 벌 있다고 생각할 수 있으며 매크로는 레지스터에 들어있는 내용을 실행할 수 있게 해준다. 이 세 가지 기능을 섞어서 사용하면 매우 강력한 텍스트 조작이 가능해진다.

정규표현식 대신 매크로를 사용하는 예를 들어보자. 정규표현식은 무척 강력하지만 너무 복잡한 관계로 한 번에 원하는 것을 얻기가 쉽지 않다. 언어마다 자기만의 정규표현식 규칙을 따로 둔다는 점도 이런 문제를 악화시킨다. 약간만 원하는 조작이 복잡해져도 정규표현식은 무척 복잡해진다. 매크로는 작은 조작의 단위로 구성되어 이를 재생하는 식이기 때문에 훨씬 쉽게 문제를 해결할 수 있는 때가 많다.

<obj param="2542">
<obj param="2333">
<obj param="6433">

위의 예에서 숫자 부분을 일정 크기만큼 증가시키고 싶다고 하자. 각각의 엔트리는 예쁘게 나와 있지만 실제로는 여기저기에 해당 엔트리들이 흩어져 있고, 결국 검색을 통해 하나씩 수정을 해야 한다. 제일 먼저 떠오르는 것은 정규표현식이지만 숫자를 증가시키는 등의 규칙은 자주 사용하지는 않기에 쉽사리 떠오르지 않는다.1 하지만 매크로를 사용하면 쉽게 해결할 수 있다.

<obj param=" 을 검색했다고 하자. 이제 n 키를 사용해서 언제든지 다음 매치로 갈 수 있다. 매크로를 시작하기 위해 q를 누르고 a 버퍼에 해당 매크로를 저장한다고 하자. 이제 n으로 다음 매치로 이동한다. f"를 사용해서 따옴표로 이동한 뒤에 l로 숫자 위로 올라간다. 이제 <CTRL>a를 사용해서 숫자를 증가시키면 된다. 가령 10만큼 증가시키고 싶다면 10<CTRL>a를 사용하면 된다. 이제 q로 매크로 녹화를 끝내고 @a 명령을 사용해서 위의 작업을 여러 번 반복할 수 있다. 단순히 숫자를 증가시키는 것보다 더 복잡한 연산은 CTRL-R과 expression register를 사용하면 된다.

글로 적으니 무척 복잡해 보이지만 실제로는 하나의 항목을 처리하는 것을 기억한 뒤 이를 재생하는 것에 불과하다. 이편이 복잡한 정규표현식을 만드는 것보다 훨씬 쉬울 수가 있다.2 위의 예는 무척 작은 예에 불과하고 위에서 언급만 한 마크와 레지스터를 함께 활용하면 훨씬 많은 것들을 할 수 있다.


  1. Any text editor that can apply some math to replacement text? %s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g

  2. 정규표현식은 상대적으로 매크로에 비해 안정적이다. 매크로는 실행 도중에 에러가 나면 갑자기 멈춰버리는 등의 문제가 있을 수 있다.