Vim을 '쓰는 척'만 하셨나요? 생각의 속도로 코딩하는 Vim 핵심 원리

Vim을 '쓰는 척'만 하셨나요? 생각의 속도로 코딩하는 Vim 핵심 원리

Vim, 참 애증의 관계인 에디터거든요.

분명 강력하다고 해서 쓰기 시작했는데, 어느새 방향키와 마우스를 더 자주 쓰고 있는 자신을 발견하곤 합니다.

Vim에 익숙해졌다고 생각했지만, 여전히 코딩의 흐름이 뚝뚝 끊기는 느낌을 받는다면, 아마 Vim의 '진짜 힘'을 놓치고 있을 가능성이 큰데요.

이건 Vim을 쓰는 게 아니라, 그냥 Vim이라는 '메모장'을 쓰고 있는 것과 같습니다.

저 역시 오랫동안 Vim을 '어설프게' 사용해왔는데요.

그러다 최근에야 Vim의 철학을 관통하는 몇 가지 핵심 원리를 깨닫고 나서야 비로소 '생각의 속도'로 편집한다는 말이 무엇인지 체감하게 되었습니다.

이 글에서는 수많은 명령어를 외우는 대신, 여러분의 Vim 사용법을 뿌리부터 바꿔줄 몇 가지 근본적인 테크닉과 사고방식을 공유하고자 합니다.

1. 모든 것의 시작, 점(.) 커맨드의 재발견

Vim의 세계에서 '알파이자 오메가'를 꼽으라면 저는 주저 없이 '점(.) 커맨드'를 선택할 겁니다.

점 커맨드는 '직전의 변경 사항을 그대로 반복'하는, 아주 단순한 기능이거든요.

하지만 이 단순함 속에 Vim 효율성의 모든 것이 담겨 있습니다.

예를 들어, 아래 코드의 모든 쉼표(,) 뒤에 공백을 추가해야 하는 상황이라고 해볼까요.

// 원본 코드
let arr = [1,2,3,4,5]

대부분은 삽입 모드에 들어가서 공백을 하나씩 추가할 텐데요.

점 커맨드를 아는 사람은 이렇게 접근합니다.

  1. f, : 첫 번째 쉼표(,)로 커서를 이동합니다.
  2. a <Esc> : 쉼표 뒤에 공백을 '추가(append)'하고 노멀 모드로 돌아옵니다.
  3. ; : 다음 쉼표(,)로 이동합니다.
  4. . : 직전의 변경, 즉 '공백 추가'를 반복합니다.
  5. ;. 를 끝까지 반복합니다.

처음 한 번만 '어떻게' 바꿀지 Vim에게 알려주면, 그 다음부터는 '다음 대상'으로 이동하고 점(.)만 찍으면 되는 거죠.

이것이 바로 책 'Practical Vim'에서 말하는 '점의 공식(The Dot Formula)'입니다.

'이동에 한 키, 실행에 한 키'라는, 더 이상 줄일 수 없는 가장 이상적인 편집 패턴입니다.

반복 vs 횟수 지정, 무엇이 더 Vim스러운가?

여기서 한 가지 질문이 생길 수 있습니다.

"그냥 dd를 6번 누르는 것보다, 6dd로 6줄을 한 번에 지우는 게 더 효율적이지 않나요?"

놀랍게도, 많은 Vim 고수들은 전자를 선호하는데요.

왜냐하면 '몇 줄인지 세는 행위' 자체가 코딩의 흐름을 방해하는 '인지적 비용'이기 때문입니다.

6이라는 숫자를 세고, 6을 누르고, dd를 누르는 것보다, 생각 없이 리드미컬하게 dd, dd, dd...를 누르다가 원하는 지점에서 멈추는 게 훨씬 더 직관적이고 안전합니다.

실수를 해도 u로 한 단계만 되돌리면 되니 부담도 없죠.

Vim은 단순히 키스트로크를 줄이는 도구가 아니라, 생각의 흐름을 코드로 옮기는 도구라는 점을 기억해야 합니다.

2. 노멀 모드, 진짜 작업이 이뤄지는 곳

Vim의 심장은 단연코 '노멀 모드'입니다.

코드를 작성하는 '삽입 모드'는 잠시 머물다 가는 정거장일 뿐, 모든 편집과 조작은 노멀 모드에서 이뤄져야 합니다.

Undo 단위를 지배하는 자가 Vim을 지배합니다

혹시 삽입 모드에서 함수 하나를 처음부터 끝까지 쭉 작성하고 나서야 <Esc>를 누르시나요?

이건 아주 위험한 습관이거든요.

만약 u를 눌러 실행 취소를 하면, 공들여 작성한 함수 전체가 한 번에 사라져 버리기 때문입니다.

Vim 고수들은 논리적으로 의미가 있는 단위로 코드를 작성한 뒤, 습관적으로 <Esc>를 눌러 노멀 모드로 빠져나오는데요.

이렇게 하면 'Undo의 단위'가 잘게 쪼개져서 훨씬 정교하고 안전하게 코드를 수정할 수 있습니다.

// 좋은 예: 논리적 단위로 노멀 모드 전환
function calculate(a, b) {  // 여기서 Esc
  const result = a + b      // 여기서 Esc
  return result             // 여기서 Esc
}                           // 여기서 Esc

이제 u를 누르면 }만 지워지고, 한 번 더 누르면 return 문만 지워집니다.

작업 단위를 스스로 제어할 수 있게 되는 겁니다.

Vim의 언어 배우기 동사 + 명사

Vim이 강력한 진짜 이유는 바로 '오퍼레이터(동사)'와 '텍스트 오브젝트(명사)'를 조합해 문장을 만들 수 있다는 점인데요.

예를 들어, d는 '삭제하라(delete)'라는 동사이고, w는 '다음 단어의 시작까지(word)'라는 명사입니다.

이 둘을 합친 dw는 "단어 하나를 삭제하라"는 완벽한 문장이 됩니다.

우리가 익혀야 할 것은 수많은 명령어가 아니라, 바로 이 'Vim의 문법'입니다.

특히 '텍스트 오브젝트'를 알게 되면 Vim의 세계가 완전히 달라지는데요.

aw: 현재 커서가 위치한 단어 (a word)

i": 쌍따옴표 안의 내용 (inner double quotes)

a": 쌍따옴표와 그 안의 내용 전체

i(: 소괄호 안의 내용 (inner parenthesis)

a(: 소괄호와 그 안의 내용 전체

i{: 중괄호 안의 내용 (inner curly brace)

a{: 중괄호와 그 안의 내용 전체

it: 태그 안의 내용 (inner tag)

at: 태그와 그 안의 내용 전체

이제 이 명사들을 d(삭제), c(변경), y(복사), gU(대문자화) 같은 동사와 조합하면 무한한 가능성이 열립니다.

ci": "쌍따옴표 안의 내용을 지우고 삽입 모드로 변경하라."

dat: "HTML 태그 하나를 통째로 삭제하라."

yi{: "중괄호 안의 코드 블록을 복사하라."

이 문법을 이해하면, 마우스로 드래그해서 범위를 선택하는 행위가 얼마나 비효율적인지 깨닫게 됩니다.

3. 삽입 모드의 숨겨진 무기, 삽입-노멀 모드

삽입 모드에서 코드를 작성하다 보면, 잠시 노멀 모드의 명령을 딱 한 번만 쓰고 싶을 때가 있거든요.

예를 들어 긴 줄을 작성하다가 화면 중앙으로 스크롤을 맞추고 싶을 때 말이죠.

이때 <Esc>를 눌러 노멀 모드로 갔다가 zz를 누르고 다시 ia로 돌아오는 건 너무 번거롭습니다.

이럴 때 사용하는 것이 바로 '삽입-노멀 모드'인데요.

삽입 모드에서 <C-o> (Ctrl + o)를 누르면, 딱 한 번 노멀 모드 명령을 실행하고 즉시 삽입 모드로 돌아옵니다.

마치 '한 발짜리 저격총'을 쏘는 것과 같습니다.

<C-o>zz: 화면을 중앙으로 정렬하고 계속 타이핑

<C-o>dd: 현재 줄을 삭제하고 계속 타이핑

이 작은 트릭 하나가 모드 전환의 번거로움을 크게 줄여줍니다.

4. 비주얼 모드, 필요하지만 남용은 금물

비주얼 모드는 텍스트를 눈으로 직접 보면서 선택할 수 있어 초심자에게 매우 친숙한 기능이거든요.

하지만 비주얼 모드에 너무 의존하면 '점 커맨드'의 위력을 제대로 활용할 수 없게 됩니다.

비주얼 모드로 범위를 선택하고 어떤 작업을 했다고 해봅시다.

그 다음 점(.)을 누르면, Vim은 '같은 내용'이 아니라 '같은 위치(좌표)'에 그 작업을 반복하려고 하는데요.

이는 대부분 우리가 원하는 결과가 아닙니다.

기억하세요.

'반복이 필요한 작업'은 반드시 '오퍼레이터 + 텍스트 오브젝트' 조합을 사용해야 합니다.

비주얼 모드는 예측 불가능한 범위나, 딱 한 번만 실행할 일회성 작업에만 제한적으로 사용하는 것이 좋습니다.

물론 비주얼 모드에도 유용한 팁은 있는데요.

gv: 직전에 선택했던 범위를 다시 선택합니다.

o: 범위 선택 중 시작점과 끝점을 맞바꿉니다.

5. 커맨드라인 모드의 점 커맨드, @:

노멀 모드에 점(.)이 있다면, 커맨드라인 모드(콜론 :으로 시작하는)에는 @:가 있습니다.

@:는 직전에 실행했던 Ex 커맨드를 그대로 반복 실행해주거든요.

예를 들어, :%s/foo/bar/g 명령으로 현재 파일의 모든 'foo'를 'bar'로 바꿨다고 해봅시다.

다른 파일로 이동해서 @:를 입력하면, 똑같은 치환 명령이 즉시 실행됩니다.

여러 파일에 걸쳐 동일한 작업을 해야 할 때 엄청난 시간 절약을 가져다주는 숨은 보석 같은 기능입니다.

마무리하며

Vim을 배운다는 것은 수백 개의 명령어를 암기하는 '지식 게임'이 아니거든요.

그것은 코드를 바라보는 관점과 편집하는 습관을 통째로 바꾸는 '패러다임의 전환'입니다.

오늘 소개해드린 원리들의 핵심은 하나로 통하는데요.

바로 '어떻게 반복할 것인가'입니다.

'점 커맨드'를 최대한 활용할 수 있는 방식으로 코드를 편집하고, '오퍼레이터와 텍스트 오브젝트'라는 Vim의 언어로 생각하며, 각 '모드'의 역할을 명확히 이해하고 사용하는 것.

이 세 가지만 의식적으로 연습해도 여러분의 Vim 생산성은 이전과는 비교할 수 없을 정도로 향상될 겁니다.

이제 방향키와 마우스에서 손을 떼고, Vim의 진짜 힘을 경험해볼 시간입니다.