정밀 편집이 중요할 때 사용하는 Vim 명령

발행: (2026년 3월 13일 오후 09:16 GMT+9)
13 분 소요
원문: Dev.to

Source: Dev.to

위 링크에 포함된 텍스트를 번역하려면 해당 내용을 제공해 주세요. 텍스트를 주시면 원본 형식과 마크다운을 유지하면서 한국어로 번역해 드리겠습니다.

실제 작업에서 마찰을 해결하는 Vim 트릭

모든 Vim 사용자는 시간이 흐르면서 자신만의 툴킷을 구축합니다. 아래 명령들은 튜토리얼에서는 잘 다루지 않지만, 실제 작업 중에 보통의 접근법이 한 단계라도 번거로울 때 계속 마주쳤던 것들입니다. 각각은 단순히 멋있기 위해서가 아니라 실제 마찰 지점을 해결해 줍니다.

1) 스스로 멈추는 재귀 매크로

왜 중요한가
N개의 항목을 처리하기 위해 매크로를 기록할 때 보통은 N을 미리 알아야 합니다. 대부분은 99@q처럼 큰 횟수를 사용하고 충분하길 기대하죠. 재귀 매크로는 더 깔끔합니다: 매크로 본문 끝에서 자신을 다시 호출하고, 시퀀스 중 어느 명령이라도 실패하면 자동으로 멈추므로 카운트를 할 필요가 없습니다.

qqq                " clear register q
qq{your commands}@qq   " record macro and finish with @q
@q                " start the loop

실제 상황
각 줄마다 첫 번째 단어를 삭제해야 하는 리스트가 있습니다. 줄 수를 모릅니다. qqdw0j@qq를 기록한 뒤 @q를 누르세요. 매크로는 첫 단어를 삭제하고, 열 0으로 이동한 뒤 한 줄 아래로 내려가며 재귀 호출합니다 — 마지막 줄에서 j가 실패하면 전체 체인이 멈춥니다.

주의점
매크로가 무한 루프에 빠지면 <C‑C>가 이를 중단합니다. 또한, 파일 끝이 아니라 중간 줄에서 명령이 실패하면 매크로가 일찍 멈출 수 있습니다. “멈춤 조건”이 작업이 끝났을 때 자연스럽게 실패하도록 설계했는지 확인하세요.

2) Ex 범위에서 패턴‑상대 오프셋 사용

왜 중요한가
Ex 명령 범위는 보통 행 번호나 마크를 사용하지만, Vim은 검색 패턴에 숫자 오프셋을 붙여 범위를 지정할 수도 있습니다. 이를 통해 “TODO 주석 뒤의 세 줄”이나 “두 섹션 마커 사이 전체”와 같이 행 번호를 전혀 모른 채 작업할 수 있습니다.

:/pattern/+N,/other-pattern/-N  delete

/pattern/+1 형태는 “이 패턴의 다음 매치 바로 아래 행”을 의미합니다. -1 형태는 “바로 위 행”을 의미합니다. 이러한 주소는 범위를 받는 모든 Ex 명령(:delete, :yank, :move, :copy, :substitute, :normal 등)과 함께 사용할 수 있습니다.

실제 상황
설정 파일에 # BEGIN# END 주석으로 구분된 섹션이 있고, 마커 자체는 제외하고 그 사이 전체를 삭제해야 합니다:

:/# BEGIN/+1,/# END/-1delete

이 한 줄 명령만으로 완료됩니다. 행 번호를 찾을 필요도, 시각적 선택을 할 필요도 없습니다. 파일 어디에 블록이 있든 동작합니다.

주의점
검색 패턴이 버퍼에 존재하지 않으면 Vim은 오류를 발생시킵니다. 스크립트에서 이런 범위를 사용할 때는 :silent!로 감싸거나 먼저 패턴 존재 여부를 확인하는 조건을 두세요. 또한 /pattern/은 커서 위치에서 앞으로 검색한다는 점을 기억하세요 — 패턴이 여러 번 나타날 경우 위치가 중요합니다.

3) 명령 입력 중에 명령‑라인 창 열기

왜 중요한가
Vim의 명령‑라인 창(q:를 Normal 모드에서 실행) 은 이전 명령을 편집하고 재실행하기에 훌륭합니다. 덜 알려진 점은 이미 명령을 입력하고 있는 도중에도 이를 열 수 있다는 것인데, Ctrl‑F(또는 <C‑F>)를 :s 치는 중에 누르면 현재 반쯤 입력된 명령이 로드된 상태로 명령‑라인 창으로 전환되어 전체 Vim 편집이 가능해집니다.

   " press <C‑F> while in : / ? mode

이 기능은 모든 명령‑라인 모드(:, /, ?, !)에서 동작합니다. 진행 중인 명령은 창 하단에 표시되고, Normal 모드 동작을 이용해 수정한 뒤 <CR>을 눌러 실행할 수 있습니다.

실제 상황
복잡한 치환을 입력하고 있다고 가정합니다:

:%s/\v(class|module)\s+\zs\w+/

두 그룹 전으로 가서 정규식이 잘못됐다는 것을 깨달았습니다. <Esc>와 화살표키를 쓰는 대신 <C‑F>를 누르세요. 명령이 편집 가능한 버퍼에 열립니다. F( 로 괄호 앞으로 이동하고, ci( 로 수정한 뒤, 라인 끝에서 <CR>을 눌러 실행합니다.

주의점
Normal 모드에서 q:를 실행하면 명령‑라인 창이 열리지만, 이는 히스토리만 보여주고 현재 입력 중인 내용을 잡아내지는 못합니다. <C‑F>입력 중인 명령을 캡처하기 위한 전용 키입니다. 창을 닫을 때는 일반적인 :q 혹은 <Esc>를 사용하면 됩니다.

Source:

4) '^ 마크 – 마지막 삽입 위치로 돌아가기

왜 중요한가
Vim은 Insert 모드를 떠날 때마다 ^ 마크를 자동으로 업데이트합니다. Normal 모드에서 '^ 를 누르면 “ 를 눌렀을 때 커서가 있던 정확한 위치로 점프합니다. gi 와 달리 '^ 는 바로 Insert 모드로 들어가지 않는 단순 마크 점프이며, 도착한 뒤 주변을 살펴보고 언제 편집을 다시 시작할지 결정할 수 있습니다.

'^

실제 상황
함수를 편집 중에 Insert 모드를 빠져나와 위쪽에 있는 관련 블록을 확인하고, /search% 로 조금 탐색합니다. 돌아올 준비가 되면 '^ 가 정확한 열과 행으로 바로 되돌려 줍니다—검색도, “ 체인도 필요 없습니다. 그때 ai 를 눌러 실제로 타이핑을 시작하면 됩니다.

주의점
이미 gi 가 워크플로에 맞는다—점프하고 바로 타이핑을 시작한다—면 굳이 바꿀 필요가 없습니다. '^ 은 먼저 위치를 확인하고 싶거나, Insert 모드에 들어가지 않고 해당 위치에서 연산자를 사용하고 싶을 때 적합합니다. 이 마크는 버퍼 전역이므로 파일을 바꿨을 경우 '^ 가 다른 버퍼로 돌아갑니다.

5) gP — 커서 앞에 붙여넣고, 뒤에 놓기

왜 중요한가
표준 P 는 텍스트를 커서 앞에 붙여넣고 커서를 삽입된 텍스트의 첫 문자 위에 둡니다. gP 는 같은 위치에 붙여넣지만 커서를 삽입된 텍스트 뒤 로 이동시킵니다. 사소해 보이지만, 붙여넣은 뒤 바로 타이핑을 계속하고 싶을 때 불필요한 “ 나 l 입력을 줄여줍니다.

gP    " 커서 앞에 붙여넣고, 붙여넣은 텍스트 뒤에 커서를 둠

실제 상황
yiw 로 단어를 복사하고 다른 곳으로 이동한 뒤, 현재 문자 앞에 삽입하고 싶을 때 흐름을 끊지 않고 삽입하고 싶을 때 gP 를 사용하면 삽입 후 커서가 다음 입력을 받을 준비 상태가 됩니다.

주의점
gPP 와 동일하게 라인 단위/문자 단위 레지스터에 대해 동작하므로 공백 및 줄바꿈에 대한 규칙은 동일합니다. 차이점은 최종 커서 위치뿐입니다.

gP – 커서 뒤에 붙여넣기

여러 번 붙여넣기를 조합하거나 붙여넣기 직후에 바로 입력할 때, gP는 원래 필요했던 수동 $ 또는 e 움직임을 없애줍니다.

gP

전체 화면 모드 진입
전체 화면 모드 종료

소문자 gpp와 동일한 동작을 하지만, 커서가 붙여넣은 텍스트 에 위치한다는 점에서 after‑cursor 버전입니다.

실제 시나리오

세 개의 명명된 레지스터를 순서대로 붙여넣어 한 줄을 만들고 있습니다:

"agP"bgP"cgP

각 붙여넣기 후 커서는 다음 붙여넣기를 위한 위치에 남아 있어, 중간에 움직임 키를 누르지 않고도 세 조각 모두 뒤에 커서가 위치하게 됩니다.

주의사항

gP에 개수를 지정하면 (3gP) 연속으로 세 번 붙여넣고 커서는 세 개 전체 뒤에 남습니다. 첫 번째 뒤가 아니라는 점을 유의하세요. 이는 의도된 동작이며 보통 원하는 바이지만, 매크로 안에서 사용할 때는 미리 알아두는 것이 좋습니다.

정리

이 다섯 가지 명령은 Vim의 서로 다른 영역—매크로, Ex 범위, 명령줄 편집, 마크, 붙여넣기 작업—에 존재하지만 공통된 흐름을 가지고 있습니다: 각각 수동으로 해야 할 단계를 없애줍니다.

  • 재귀 매크로는 카운팅을 없애줍니다.
  • 패턴 오프셋은 행 번호 조회를 없애줍니다.
  • “ 은 어색한 명령줄 탐색을 없애줍니다.
  • '^ 은 위치를 다시 찾는 과정을 없애줍니다.
  • gP 은 붙여넣기 후 커서 재배치를 없애줍니다.

이 수준에서 설명되는 더 실용적인 Vim 트릭을 원한다면, 저는 이를 에서 공개하고 있습니다.

Vim 작업 흐름 중 아직도 건너뛰고 싶은 단계가 있나요?

0 조회
Back to Blog

관련 글

더 보기 »

tmux 시작하기

소개 tmux에 대한 소개, 터미널 멀티플렉서. 세션 관리 - tmux 시작: `bash tmux` 또는 `tmux new-session` - 새로운 세션을 생성…