Vimscript 배우기 cho.books
제 5 장 · 원서 §15–18

연산자 대기 매핑과 상태줄

연산자와 모션 — Vim 효율의 가장 큰 원천. 나만의 모션을 만들면 기존 연산자 전부와 자동으로 결합됩니다. 그리고 상태줄을 정보로 채우고, 책임 있게 코딩하는 법.

onoremap 연산자 + 모션 statusline 코드 폴딩 책임 있는 코딩

Section 01연산자와 모션

연산자와 모션이라는 개념은 Vim의 가장 중요한 개념 중 하나이며, Vim이 그토록 효율적인 가장 큰 이유입니다.

연산자는 당신이 모션 명령을 입력하기를 기다린 다음, 현재 위치와 모션이 데려갈 위치 사이의 텍스트에 무언가를 하는 명령입니다. 연산자의 예: d(삭제), y(복사), c(변경).

연산자 + 모션 조합
연산자모션
dw삭제다음 단어까지
ci(변경괄호 안쪽
yt,복사쉼표 직전까지
직관 · Vim은 언어다 Vim의 편집 명령은 하나의 언어와 같습니다. 연산자는 동사, 모션은 명사, i/a는 형용사입니다. 새 동사를 추가하면 기존 명사·형용사 전부와 자동으로 결합됩니다. 새 모션(명사)을 추가하면 기존 연산자 전부와 결합됩니다.

Section 02나만의 모션 만들기

Vim은 기존 연산자 전부와 작동하는 새 모션을 만들 수 있게 해줍니다. onoremap(operator-pending noremap)을 씁니다:

vimscript — "파라미터" 모션 만들기
:onoremap p i(

다음 텍스트에서 cat 위에 커서를 두고 dp를 입력해 보세요:

예제 텍스트
return person.get_pets(type="cat", fluffy_only=True)

괄호 안 텍스트가 전부 삭제됩니다! 이 모션을 "파라미터(parameters)"로 생각하세요. onoremap p i(는 "연산자에게 줄 모션을 기다리는 중에 p를 보면, i(처럼 취급하라"고 Vim에게 말합니다. 이 모션은 즉시 모든 연산자와 함께 쓸 수 있습니다 — cp는 "파라미터 변경", yp는 "파라미터 복사".

모션은 검색도 활용할 수 있습니다:

vimscript — 검색 기반 모션
:onoremap b /return<cr>
개념 새 연산자 대기 모션을 설계하는 법

1. 커서 위치에서 시작한다.

2. (문자 단위) 비주얼 모드에 들어간다.

3. …여기에 매핑 키가 들어간다…

4. 모션에 포함하고 싶은 모든 텍스트가 이제 선택되어 있어야 한다.

3번을 적절한 키로 채우는 것이 당신의 일입니다.

모션 · 연산자 × 모션 = 명령 01 / 5
스페이스: 재생 · ← →: 단계 이동

Section 03시작 위치 바꾸기

모션이 항상 커서 위치에서 시작해야 한다면 할 수 있는 일이 제한됩니다. Vim에는 이를 우회하는 방법이 있습니다:

vimscript — "다음 괄호 안쪽" 모션
:onoremap in( :<c-u>normal! f(vi(<cr>
:onoremap il( :<c-u>normal! F)vi(<cr>

cin(은 "다음 괄호 안쪽 변경"입니다. 어떻게 작동할까요? <c-u>는 지금은 무시하세요(특수한 처리). 핵심은 F)vi(입니다 — F)로 가장 가까운 )로 뒤로 이동, vi(로 괄호 안쪽을 비주얼 선택. 결국 원하는 텍스트가 비주얼 선택되고, Vim이 평소대로 연산을 수행합니다.

두 가지 일반 규칙 ① 연산자 대기 매핑이 텍스트가 비주얼 선택된 상태로 끝나면, Vim은 그 텍스트에 연산합니다. ② 그렇지 않으면, Vim은 원래 커서 위치와 새 위치 사이의 텍스트에 연산합니다.

Section 04상태줄

Vim은 각 창 하단의 상태줄 텍스트를 커스터마이즈하게 해줍니다. statusline 옵션으로 합니다:

vimscript — 상태줄 한 조각씩 쌓기
:set statusline=%f         " 파일 경로
:set statusline+=\ -\        " 구분자
:set statusline+=FileType:  " 레이블
:set statusline+=%y         " 파일타입

%로 시작하는 것들이 다른 텍스트로 확장됩니다 — %f는 파일명, %y는 파일타입, %l은 현재 줄, %L은 전체 줄 수. 공백은 백슬래시로 이스케이프해야 합니다(set이 여러 옵션을 받기 때문). =로 기존 값을 지우고, +=로 한 조각씩 쌓아 올립니다.

너비·패딩·정렬도 제어할 수 있습니다 — %4l(최소 4칸), %-4l(오른쪽 패딩), %04l(0으로 채움), %=(이후 내용을 오른쪽 정렬).

자주 쓰는 상태줄 코드
코드의미
%f현재 파일의 상대 경로
%F현재 파일의 전체 경로
%y파일타입 (예: [markdown])
%l / %L현재 줄 / 전체 줄 수
%=이후 내용을 오른쪽 정렬로 전환

Section 05책임 있는 코딩

Vimscript는 매우 강력하지만, 수년에 걸쳐 유기적으로 자라며 부주의한 프로그래머를 옭아매는 미로가 되었습니다. 많은 양의 Vimscript를 쓰면서 제정신을 유지하는 법:

주석을 달아라

몇 줄 이상의 Vimscript에는 방어적으로 주석을 다세요. 무엇을 하는지 설명하고, 관련된 :help 항목이 있다면 주석에 언급하세요. 몇 달 뒤의 자신과, vimrc를 공유받는 다른 사람에게 도움이 됩니다.

그룹으로 묶고 폴딩하라

vimrc가 통제 불능으로 커지는 것을 막으려면, Vim의 코드 폴딩으로 줄을 섹션으로 묶으세요:

vimscript — 마커 폴딩으로 vimrc 정리
augroup filetype_vim
  autocmd!
  autocmd FileType vim setlocal foldmethod=marker
augroup END

" Mappings ----------------------- {{{
"   ... 매핑들 ...
" }}}
함정 · 짧은 이름 Vim은 대부분의 명령·옵션에 약어를 허용합니다(:setl = :setlocal). 하지만 ~/.vimrc와 플러그인에서는 약어를 쓰지 마세요. Vimscript는 그렇잖아도 충분히 간결하고 암호 같습니다 — 더 줄이면 읽기가 더 어려워집니다. 약어는 코딩 중 직접 실행하는 일회성 명령에만 쓰세요.

Section 06연습문제

  • "다음 괄호 주변"과 "마지막 괄호 주변"에 대한 연산자 대기 매핑을 만드세요. 중괄호용도 비슷하게 만드세요.
  • :help omap-info를 읽고, 예제의 <c-u>가 무엇을 위한 것인지 알아내세요.
  • :help statusline의 코드 목록을 훑어보세요. 일부를 아직 이해 못해도 괜찮습니다.
  • ~/.vimrc+= 형식으로 나만의 상태줄을 만들고, 각 줄에 주석으로 설명을 다세요.
  • 전체 ~/.vimrc를 관련 그룹으로 정리하고 폴딩 마커를 추가하세요(예: "Basic Settings", "Mappings", "Status Line").
  • ~/.vimrc의 약어로 줄인 명령들을 전체 이름으로 되돌리세요.