kickstart.nvim — 공식 출발점
nvim-lua/kickstart.nvim은 파일 하나짜리, 주석이 촘촘한 init.lua야. 800줄쯤 되고 구간마다 설명이 붙어 있는데, 그 안에 LSP, completion, treesitter, telescope, gitsigns, mini.nvim, 그리고 멀쩡한 keymap까지 다 들어 있어. Neovim core contributor가 관리하고 0.11+에 맞춰 갱신되고 있고. 프레임워크가 아니야. 블랙박스로 가져다 쓰는 게 아니라 읽고 고치라고 만든 출발점이야.
kickstart을 언제 쓰냐면
- Neovim이 완전히 처음이고 5분 안에 돌아가는 환경이 필요할 때.
- 새 머신을 잡는 중인데 config를 처음부터 다시 짜기는 싫을 때.
- 누군가에게 Neovim을 가르치면서 검증된 바탕에서 시작하고 싶을 때.
가져다 쓸 땐 한 줄씩 읽어. 구간마다 무엇을 왜 하는지 주석이 달려 있어. 의존성이 아니라 교재로 다뤄.
성능 — 우리가 가진 예산
요즘 Neovim에 lazy.nvim을 얹으면 100ms 안에 떠야 정상이야. 재보는 게 먼저, 손보는 건 그다음이야.
:Lazy profile— 전체 시작 시간과 plugin별 내역.nvim --startuptime /tmp/startup.log— 밀리초 단위로 찍히는 시작 추적 기록.
실제로 시간을 아껴주는 지연 로딩 패턴
지연 로딩을 잘 걸면 무거운 plugin을 필요해질 때까지 미룰 수 있어. 잘못 걸면 의존성이 쓰이기 전에 안 올라와서 버그가 나고. 안전한 방법은 그 plugin이 실제로 쓰이는 시점에 맞춰 조건을 거는 거야.
event = "BufReadPost"— 파일을 열 때 불러와. 편집 중에 쓰는 것들에 (gitsigns, treesitter, 주석 plugin).event = "InsertEnter"— 처음 Insert mode에 들어갈 때. completion 쪽에 (nvim-cmp, autopairs).event = "VeryLazy"— UI가 자리를 잡은 다음. 당장 없어도 되는 것들에 (which-key, lualine, nvim-surround).cmd = "Git"— 그 명령을 쓸 때. 가끔 쓰는 무거운 것들에 (fugitive, Mason).ft = { "python", "lua" }— 특정 파일 종류에서만. 언어 전용 plugin에.keys = { ... }— 그 키를 처음 누를 때.
1년 안에 직접 쓰게 될 Lua
Neovim API가 충분히 풍부해서 개인적인 자동화는 대부분 다섯 줄에서 열다섯 줄이면 돼. 계속 손이 가는 세 가지 패턴이야.
vim.api.nvim_create_autocmd— 이벤트에 반응해 (파일 열기, 저장, 커서가 멈춰 있기).vim.api.nvim_create_user_command— 내:Command를 정의해.vim.keymap.set에 직접 쓴 함수 — Lua로 쓸 수 있는 건 뭐든 키에 걸 수 있어.
Neovim 로드맵 (앞을 좀 보면)
- Neovim 0.12 (진행 중) —
vim.pack으로 들어오는 내장 plugin 매니저, 멀티 커서 지원, 개선된 진행 표시, 처음부터 들어가는 스니펫 시스템vim.snippet. - Neovim 0.13+ — 구조화된 동시성 (
vim.async), buffer 여러 개 동시 편집, 지금은 plugin이 필요한 것들의 native 구현.
최신 unstable을 쫓아다니지는 마. 최신 stable에 머물러 (2026년이면 0.11.x야). 0.12.0이 나오고 plugin 생태계가 따라잡으면 그때 올려.
init.lua가 내 진짜 취향만 담고 있게 돼. plugin은 없어서 아쉬웠으니까 들어왔고, 매핑은 긴 형태를 두 번 치는 게 귀찮아서 생겼고. 그게 손에 맞는 에디터야. Vim+tmux가 그 config에서 평생에 걸쳐 값을 돌려주는 거고.