본문 바로가기
C.W.K.
Stream
Lesson 02 of 04 · published

키 매핑 — 키보드를 내 거로

~13 min · vim, keymaps, leader

Level 0갇힌 자
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

Leader 키

leader는 내 단축키만 모아두는 개인 영역이야. 키를 하나 고르고 (스페이스가 제일 인기야. 크고, 손이 편하고, Normal mode에서 중요한 일을 안 하거든) 그 위에 내 명령 어휘를 쌓아 올리는 거지. 저장은 <leader>w, 파일 찾기는 <leader>ff, git status는 <leader>gs 하는 식으로. 매핑 하나하나가 손에 가르친 문장이야.

map 계열

Vim의 매핑은 모드별로 갈려. nmap은 Normal, imap은 Insert, vmap은 Visual, cmap은 Command-line이야. 언제나 noremap 쪽을 골라 (nnoremap, inoremap 같은 것들). 오른쪽을 글자 그대로 처리해서 다른 매핑을 타고 재귀로 번지지 않게 막아주거든. 무한 루프를 피하는 방법이 이거야.

Lua로 쓰면 더 깔끔해

Neovim Lua에서는 vim.keymap.set(mode, lhs, rhs, opts) 하나가 map 계열 전체를 대신해. opts는 table이라 desc (which-key 같은 plugin이 이걸 보여줘), silent = true, noremap = true (vim.keymap.set은 원래 기본값이야), buffer 안에서만 먹히게 하는 buffer = N 같은 걸 넣을 수 있어.

어느 config에나 있는 매핑

거의 모든 config에 등장하는 정통 매핑들이 있어. 다들 진짜로 짜증 나는 지점을 고쳐주거든. Esc로 검색 표시 지우기, Insert에서 jk로 빠져나오기, leader-w로 저장, leader-q로 종료, Ctrl-h/j/k/l로 창 옮기기 (Ctrl-w 접두사 없이 바로), n / N 뒤에 zz를 붙여 화면 가운데로, Visual mode에서 J / K로 줄 옮기기.

매핑은 미리 깔지 말고 필요해진 다음에 더해. 남의 dotfile에서 200줄짜리 keymap 파일을 통째로 가져오지 마. 하루에 같은 키 조합을 두 번 치고 있는 자신을 발견하면, 그때 매핑해. 제일 좋은 keymap은 찾아보지 않아도 기억나는 매핑이고, 그건 진짜로 아쉬웠던 데서만 나와.

Code

Leader 박고 정통 Insert escape·vim
" Vimscript
let mapleader = " "

inoremap jk <Esc>
inoremap jj <Esc>
Lua 동등·lua
vim.g.mapleader = " "
vim.g.maplocalleader = " "

vim.keymap.set("i", "jk", "<Esc>")
vim.keymap.set("i", "jj", "<Esc>")
Starter keymap 팩 — Vimscript·vim
" 저장 / 종료 / config 편집
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
nnoremap <leader>x :x<CR>

" 검색 하이라이트 클리어
nnoremap <Esc> :nohlsearch<CR>

" Window navigation
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

" 검색 / 스크롤 후 가운데
nnoremap n nzzzv
nnoremap N Nzzzv
nnoremap <C-d> <C-d>zz
nnoremap <C-u> <C-u>zz

" Visual 선택 위/아래 이동
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv

" Join 시 커서 유지
nnoremap J mzJ`z

" leader 로 시스템 클립보드 yank/paste
nnoremap <leader>y "+y
vnoremap <leader>y "+y
nnoremap <leader>p "+p

" 블랙홀 삭제
nnoremap <leader>d "_d
vnoremap <leader>d "_d
Starter keymap 팩 — Lua·lua
local map = vim.keymap.set

-- 저장 / 종료
map("n", "<leader>w", "<cmd>w<CR>", { desc = "Save file" })
map("n", "<leader>q", "<cmd>q<CR>", { desc = "Quit" })
map("n", "<leader>x", "<cmd>x<CR>", { desc = "Save and quit" })

-- 검색 하이라이트 클리어
map("n", "<Esc>", "<cmd>nohlsearch<CR>", { desc = "Clear search" })

-- Window navigation
map("n", "<C-h>", "<C-w>h", { desc = "Move to left split" })
map("n", "<C-j>", "<C-w>j", { desc = "Move to lower split" })
map("n", "<C-k>", "<C-w>k", { desc = "Move to upper split" })
map("n", "<C-l>", "<C-w>l", { desc = "Move to right split" })

-- 검색 / 스크롤 후 가운데
map("n", "n", "nzzzv")
map("n", "N", "Nzzzv")
map("n", "<C-d>", "<C-d>zz")
map("n", "<C-u>", "<C-u>zz")

-- Visual 선택 위/아래 이동
map("v", "J", ":m '>+1<CR>gv=gv")
map("v", "K", ":m '<-2<CR>gv=gv")

-- 블랙홀 삭제 (yank 보존)
map({ "n", "v" }, "<leader>d", "\"_d", { desc = "Delete without yanking" })

External links

Exercise

config에 starter keymap 묶음을 넣고 Neovim을 다시 읽혀. 하나씩 시험해봐. <Space>w로 저장, Insert mode에서 jk로 탈출, Ctrl-h/j/k/l로 창 옮기기 (:vs로 창을 하나 열어두고). 그다음 딱 하나만 내 매핑을 더해봐. 늘 하는 동작으로. 예를 들면 nnoremap <leader>sv :source $MYVIMRC<CR>로 config 다시 읽기 같은 거. 매핑은 하나씩 벌어서 늘려. 한꺼번에 퍼오지 말고.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.