Section 01키 시퀀스와 접두사
매핑을 만들 때마다 우리는 그 키의 원래 기능을 덮어씁니다. 일상적인 Vim 사용에서 거의 안 쓰는 키는 -, H, L, <space>, <cr>, <bs> 정도 — 고작 여섯 개입니다. 그렇다면 Vim의 전설적인 커스터마이즈 가능성은 어디로 갔을까요?
Emacs와 달리 Vim은 단일 키가 아닌 키 시퀀스를 쉽게 매핑할 수 있습니다:
:nnoremap -d dd :nnoremap -c ddO
노멀 모드에서 -d, -c를 (빠르게) 입력해 보세요. 첫 번째는 줄을 삭제하고, 두 번째는 줄을 "지우고" 입력 모드로 들어갑니다. 신경 쓰지 않는 키 하나(- 같은)를 "접두사"로 정하고, 그 위에 매핑을 쌓을 수 있다는 뜻입니다.
좋은 생각이라고요? 맞습니다. 그리고 Vim에는 이미 이 "접두사" 키를 위한 메커니즘이 있습니다.
Section 02리더 키
Vim은 이 "접두사" 키를 리더(leader)라고 부릅니다. 원하는 키로 설정할 수 있습니다:
:let mapleader = "-"
새 매핑을 만들 때 <leader>를 쓰면 "내가 리더 키로 정한 것이 무엇이든"을 의미합니다:
:nnoremap <leader>d dd
첫째, 나중에 리더 키의 원래 기능이 필요할 수 있습니다. 한 곳에서 정의하면 바꾸기 쉽습니다.
둘째, 다른 사람이 당신의 vimrc를 볼 때 <leader>의 의미를 즉시 압니다. 다른 리더를 쓰더라도 그대로 복사해 갈 수 있습니다.
셋째, 많은 Vim 플러그인이 <leader>로 시작하는 매핑을 만듭니다. 이미 설정되어 있으면 즉시 익숙하게 작동합니다.
로컬 리더
Vim에는 로컬 리더(local leader)라는 두 번째 리더 키도 있습니다. 특정 타입의 파일(Python 파일, HTML 파일 등)에서만 적용되는 매핑을 위한 접두사입니다:
:let maplocalleader = "\\"
\\를 쓴 이유는 \가 Vimscript 문자열의 이스케이프 문자이기 때문입니다. 따옴표 안에서 진짜 백슬래시 하나를 표현하려면 두 개를 써야 합니다. 매핑에서는 <localleader>로 참조합니다.
Section 03vimrc 편집하기
이 절의 아이디어는 이렇습니다 — 텍스트 편집을 더 쉽게 만들기를 더 쉽게 만들고 싶다. 오타가 아닙니다. 다시 읽어 보세요. (텍스트 편집을 (더 쉽게 만들기를 (더 쉽게 만들기))).
코딩에 몰두하다 좋은 매핑이 떠오를 때, 집중력을 잃지 않고 바로 vimrc에 추가하고 싶습니다. 그러려면 vimrc를 빠르게 여는 매핑이 필요합니다:
:nnoremap <leader>ev :vsplit $MYVIMRC<cr> :nnoremap <leader>sv :source $MYVIMRC<cr>
<leader>ev는 "edit my vimrc"입니다. $MYVIMRC는 당신의 vimrc 파일을 가리키는 특수 Vim 변수이고, :vsplit은 새 수직 분할을 엽니다.
<leader>sv는 "source my vimrc"입니다. source 명령은 파일의 내용을 Vimscript로 실행하라고 Vim에게 지시합니다. vimrc는 Vim 시작 시에만 읽히므로, 변경 사항을 현재 세션에 즉시 적용하려면 소싱해야 합니다.
<leader>ev로 vimrc 열기 → 매핑 추가 → :wq로 저장하고 닫기 → <leader>sv로 소싱. 여덟 번의 키 입력. 집중력을 거의 깨지 않습니다.
Section 04약어(abbreviation)
Vim에는 매핑과 비슷하지만 입력·교체·명령 모드를 위한 약어(abbreviation) 기능이 있습니다. 다음 명령을 실행하세요:
:iabbrev adn and :iabbrev waht what
입력 모드에서 adn을 입력하고 스페이스를 누르면 Vim이 and로 바꿔줍니다. 오타 교정에 아주 좋습니다. 자주 입력하는 긴 텍스트를 압축할 수도 있습니다:
:iabbrev @@ steve@stevelosh.com :iabbrev ssig -- <cr>Steve Losh<cr>steve@stevelosh.com
매핑은 앞뒤 문자를 고려하지 않습니다. inoremap ssig ...로 서명을 매핑하면, "Larry Lessig"를 입력할 때도 ssig가 펼쳐져 버립니다.
약어는 다릅니다. 약어는 "키워드 문자가 아닌 문자"를 입력할 때만 펼쳐집니다. 단어 경계를 인식하므로, 단어 안에 끼어 있는 글자는 건드리지 않습니다.
Section 05손가락 훈련
가장 유용한 매핑 하나 — 입력 모드에서 jk로 노멀 모드 빠져나오기:
:inoremap jk <esc>
기본 Escape 키, <c-c>, <c-[>는 모두 손가락을 불편하게 뻗어야 합니다. jk는 가장 강한 두 손가락 바로 아래에 있고, 코드(동시 누름)도 필요 없습니다. jj 대신 jk를 권하는 이유: 두 개의 다른 키라 손가락을 "굴릴" 수 있고, 노멀 모드에서 습관적으로 눌러도 아래로 갔다 위로 와서 제자리에 남습니다.
새 매핑을 배우는 법 — 옛 키 막기
새 매핑을 익히는 비결은 옛 키를 비활성화하는 것입니다:
:inoremap <esc> <nop>
<nop>은 "no operation" — 아무것도 하지 않게 합니다. 습관을 바꾸고 싶을 때는 옛 방식을 어렵거나 불가능하게 만드세요. 전자레인지 음식을 끊으려면 사지 마세요. 담배를 끊으려면 차 트렁크에 두세요. 한두 시간이면 손가락이 새 매핑을 흡수합니다.
Section 06연습문제
:help mapleader와:help maplocalleader를 읽고,~/.vimrc에 둘 다 설정하세요.- 이전 장들에서 추가한 매핑을
<leader>접두사로 바꿔, 기존 명령을 가리지 않게 하세요. - "edit my vimrc"와 "source my vimrc" 매핑을
~/.vimrc에 추가하고, 몇 번 시험해 보세요. - 자신이 자주 내는 오타들에 대한 약어를
~/.vimrc에 추가하세요. 자신의 이메일·웹사이트·서명 약어도 추가하세요. inoremap jk <esc>매핑을 추가하고, 화살표 키를 노멀·입력 모드 양쪽에서<nop>으로 막아 보세요.:help myvimrc,:help abbreviations를 읽으세요.