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

kickstart.nvim과 성능 팁

~13 min · neovim, kickstart, performance, lazy-loading

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

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 생태계가 따라잡으면 그때 올려.

최종 목표는 더 손볼 게 없는 config야. 1년, 2년이 지나면 init.lua가 내 진짜 취향만 담고 있게 돼. plugin은 없어서 아쉬웠으니까 들어왔고, 매핑은 긴 형태를 두 번 치는 게 귀찮아서 생겼고. 그게 손에 맞는 에디터야. Vim+tmux가 그 config에서 평생에 걸쳐 값을 돌려주는 거고.

Code

kickstart.nvim 시도 — 단일 명령·bash
# 먼저 기존 config 백업!
mv ~/.config/nvim ~/.config/nvim.bak 2>/dev/null
mv ~/.local/share/nvim ~/.local/share/nvim.bak 2>/dev/null

# kickstart.nvim 을 config 로 clone
git clone https://github.com/nvim-lua/kickstart.nvim ~/.config/nvim

# Neovim 열기 — 첫 실행 시 모든 거 자동 install
nvim
시작 profile·vim
:Lazy profile          " 대화형 — 가장 느린 plugin 골라

" 또는, 셸에서:
$ nvim --startuptime /tmp/startup.log +q
$ tail -50 /tmp/startup.log    " 가장 오른 숫자가 매 step 비용
커스텀 Lua — 직접 쓸 세 패턴·lua
-- Yank 한 텍스트 잠깐 하이라이트
vim.api.nvim_create_autocmd("TextYankPost", {
  callback = function()
    vim.highlight.on_yank({ higroup = "IncSearch", timeout = 200 })
  end,
})

-- 커스텀 :Format 명령
vim.api.nvim_create_user_command("Format", function()
  vim.lsp.buf.format({ async = true })
end, { desc = "Format buffer with LSP" })

-- 키에 diagnostic 토글
vim.keymap.set("n", "<leader>td", function()
  local enabled = vim.diagnostic.is_enabled()
  vim.diagnostic.enable(not enabled)
  vim.notify("Diagnostics " .. (enabled and "off" or "on"))
end, { desc = "Toggle diagnostics" })
Lazy-loading 레퍼런스 카드·lua
-- BufReadPost: 기존 파일 열릴 때
{ "plugin", event = { "BufReadPost", "BufNewFile" } }

-- InsertEnter: Insert mode 처음 들어갈 때
{ "plugin", event = "InsertEnter" }

-- VeryLazy: UI 완전 그려진 후 (lazy.nvim 이 박음)
{ "plugin", event = "VeryLazy" }

-- 특정 명령
{ "plugin", cmd = "DoTheThing" }

-- 특정 filetype
{ "plugin", ft = { "python", "lua" } }

-- 첫 키 누름
{ "plugin", keys = { { "<leader>x", "<cmd>X<CR>" } } }

External links

Exercise

지금 config에서 :Lazy profile을 돌려서 전체 시작 시간과 가장 느린 plugin 세 개를 적어둬. 그중 지연 로딩을 걸어도 되는 걸 하나 골라 spec에 eventcmdkeys 조건을 넣고 다시 재봐. 목표는 시작 속도 경쟁에서 이기는 게 아니라 지연 로딩 조건이 실제로 어떻게 도는지 감을 잡는 거야. 여유가 되면 kickstart.nvim의 init.lua를 위에서 아래까지 훑어봐 — 이 퀘스트의 모든 층이 어떻게 맞물리는지 한 바퀴 도는 셈이야.

Progress

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

댓글 0

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

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