LazyVim: 설정 없이 바로 쓰는 NeoVim
NeoVim을 쓰기로 마음먹고 설정을 시작하면 끝이 안 보입니다. 플러그인 매니저를 고르고, LSP를 연결하고, 자동 완성을 붙이고, 컬러 스킴을 깔고, 상태바를 예쁘게 꾸미고… 코딩은 안 하고 에디터 설정만 사흘째 하고 있는 자신을 발견하게 되죠. 😅
NvChad처럼 미리 짜인 설정 프레임워크를 쓰면 이 문제가 줄어들긴 합니다. 그런데 NvChad는 프레임워크 자체의 구조를 따라야 하는 제약이 있어서 뭔가 바꾸고 싶을 때 NvChad의 동작 방식을 먼저 이해해야 하는 경우가 종종 생깁니다.
LazyVim은 이 사이 어딘가를 노립니다. 설치하면 바로 쓸 수 있는 완성된 환경을 갖추면서도, 커스터마이징할 때는 NeoVim의 표준 방식을 그대로 따르거든요. 이 글에서는 LazyVim의 설치부터 단축키, Extras 시스템, LSP 설정, 자기만의 설정을 덧씌우는 방법까지 정리해봤습니다.
LazyVim이 뭔가요?
LazyVim은 NeoVim 위에 올리는 설정 배포판(distribution)입니다. lazy.nvim 플러그인 매니저를 만든 folke가 직접 만들었어요. lazy.nvim이 플러그인을 관리하는 도구라면, LazyVim은 그 위에 실용적인 플러그인 조합과 설정을 한 번에 올려놓은 완성품입니다.
비슷한 도구로 NvChad, AstroNvim, LunarVim 등이 있는데요. LazyVim의 차별점은 “기본값은 충분히 좋고, 바꾸고 싶으면 표준 방식으로 바꾼다”는 철학에 있습니다. NvChad가 자체 UI 엔진과 테마 시스템으로 예쁜 외관에 집중한다면, LazyVim은 안정성과 생산성에 무게를 두고 있어요.
설치하면 이런 것들이 바로 동작합니다.
파일 탐색기로 Neo-tree가 깔려 있고 Space +e로 토글할 수 있습니다.
퍼지 파인더로 Telescope(또는 fzf-lua)가 동작해서 Space +ff로 파일을 찾고, Space +fg로 텍스트를 검색할 수 있어요.
LSP, 자동 완성, 구문 강조(Treesitter)가 기본 설정되어 있고, Mason으로 언어 서버를 관리할 수 있습니다.
lualine 상태바와 bufferline 탭, 대시보드 시작 화면까지 포함되어 있어서 설치 직후부터 IDE 같은 느낌이 납니다.
NvChad와 뭐가 다른가요?
NvChad를 이미 써봤거나 고민 중이라면 이 부분이 궁금할 거예요. 둘 다 NeoVim 배포판이지만 성격이 꽤 다릅니다.
NvChad는 base46이라는 자체 테마 엔진을 쓰고, 코드베이스가 약 900줄로 극도로 가볍습니다. 68개 내장 테마에 자체 UI 플러그인까지 갖추고 있어서 “예쁘면서도 가벼운 NeoVim”을 원하는 분들이 선택하죠. 다만 NvChad의 구조를 따라야 하는 부분이 있어서 플러그인 설정을 커스터마이징할 때 NvChad 고유의 방식을 알아야 합니다.
LazyVim은 NeoVim의 표준 설정 방식을 그대로 씁니다.
플러그인 설정을 바꾸고 싶으면 lazy.nvim의 표준 스펙 문법으로 opts를 덮어쓰면 되고, 키 매핑을 추가하고 싶으면 vim.keymap.set을 쓰면 돼요.
LazyVim 고유의 API나 함수를 따로 배울 필요가 거의 없습니다.
정리하면 이렇습니다. 외관과 가벼움을 중시하고 NvChad의 구조를 배울 의향이 있다면 NvChad가, 안정적인 기본값 위에서 NeoVim 표준 방식으로 커스터마이징하고 싶다면 LazyVim이 더 맞습니다.
설치 전 준비물
LazyVim을 설치하기 전에 몇 가지를 챙겨야 합니다.
우선 NeoVim 0.9 이상이 필요한데, 최신 기능을 쓰려면 0.10 이상을 추천합니다. macOS라면 Homebrew로 간단하게 설치할 수 있어요.
$ brew install neovim
Ubuntu/Debian이라면 apt 저장소의 버전이 오래된 경우가 많아서 PPA를 추가하거나, AppImage를 사용하는 편이 낫습니다.
Arch 리눅스라면 sudo pacman -S neovim으로 됩니다.
다음으로 Nerd Font가 필요합니다. LazyVim UI에는 파일 아이콘이나 상태바 심볼 같은 특수 글리프가 쓰이는데, 일반 폰트에는 이 글리프가 없어서 깨져 보여요.
$ brew install --cask font-jetbrains-mono-nerd-font
설치 후 사용하는 터미널의 폰트 설정에서 “JetBrainsMono Nerd Font”를 선택하세요.
Git은 당연히 필요하고, Ripgrep과 fd도 설치해두면 좋습니다. Telescope의 텍스트 검색이 ripgrep에, 파일 검색이 fd에 의존하거든요.
$ brew install git ripgrep fd
lazygit도 설치하면 LazyVim 안에서 Space +gg로 Git TUI를 바로 열 수 있어서 편리합니다.
$ brew install lazygit
설치하기
기존에 NeoVim 설정이 있다면 먼저 백업해두세요.
$ mv ~/.config/nvim ~/.config/nvim.backup
$ mv ~/.local/share/nvim ~/.local/share/nvim.backup
$ mv ~/.local/state/nvim ~/.local/state/nvim.backup
그다음 LazyVim starter를 클론합니다.
$ git clone https://github.com/LazyVim/starter ~/.config/nvim
클론이 끝나면 starter의 .git을 지워서 자기만의 설정 저장소로 쓸 수 있게 합니다.
$ rm -rf ~/.config/nvim/.git
이제 NeoVim을 실행하면 됩니다.
$ nvim
처음 실행하면 lazy.nvim이 필요한 플러그인을 자동으로 다운로드합니다. 잠시 기다리면 설치가 완료되고 대시보드 화면이 나타나요. 파일 아이콘이 깨져 보인다면 Nerd Font 설정이 안 된 거니까 터미널 폰트를 확인해보세요.
나중에 이 설정을 자기만의 dotfiles 저장소로 관리하고 싶다면 git init해서 GitHub에 올려두면 됩니다.
새 컴퓨터에서 클론하고 NeoVim을 실행하면 플러그인이 자동 설치되니까 환경을 그대로 복원할 수 있어요.
설정 파일 구조
LazyVim starter를 클론하면 이런 구조가 만들어집니다.
~/.config/nvim/
├── init.lua # 진입점: lazy.nvim 부트스트랩
├── lua/
│ ├── config/
│ │ ├── autocmds.lua # 자동 명령
│ │ ├── keymaps.lua # 커스텀 키 매핑
│ │ ├── lazy.lua # lazy.nvim 설정 및 Extras 임포트
│ │ └── options.lua # NeoVim 옵션
│ └── plugins/ # 커스텀 플러그인 설정
│ └── example.lua
├── lazyvim.json # LazyVim Extras 상태
└── stylua.toml # Lua 포매터 설정
lua/config/ 아래의 파일들은 LazyVim이 적절한 시점에 자동으로 불러옵니다.
options.lua에서 NeoVim 옵션을 설정하고, keymaps.lua에서 키 매핑을 추가하고, autocmds.lua에서 자동 명령을 정의하는 식이에요.
각 파일의 역할이 명확히 분리되어 있어서 찾기 쉽습니다.
lua/plugins/ 디렉토리가 핵심입니다.
여기에 .lua 파일을 넣으면 lazy.nvim이 자동으로 불러와요.
파일 이름은 자유롭게 지을 수 있고, 하나의 파일에 여러 플러그인 설정을 넣어도 되고, 플러그인마다 파일을 분리해도 됩니다.
lazy.lua에는 LazyVim 자체의 설정과 Extras 임포트가 들어있습니다.
이 파일은 보통 Extras를 추가하거나 LazyVim의 기본 동작을 바꿀 때만 건드립니다.
단축키 알아보기
LazyVim의 Leader 키는 Space입니다.
그런데 단축키를 외울 필요는 없어요.
Space를 누르고 잠깐 기다리면 which-key 팝업이 나타나서 가능한 모든 키와 설명을 보여주거든요.
이게 LazyVim의 큰 장점 중 하나입니다.
단축키를 모르는 상태에서도 Space만 누르면 뭘 할 수 있는지 바로 알 수 있어요.
자주 쓰는 그룹부터 정리해볼게요.
Space +f는 파일/찾기 관련입니다.
Space +ff로 파일 이름 검색, Space +fg로 파일 내용 검색(grep), Space +fr로 최근 열었던 파일 목록을 볼 수 있어요.
이 세 가지만 기억해도 프로젝트 안에서 원하는 파일이나 코드를 빠르게 찾을 수 있습니다.
Space +s는 검색 관련입니다.
Space +sk로 키 매핑을 검색할 수 있는데, 이름이나 설명의 일부만 입력해도 퍼지 매칭으로 찾아줍니다.
“어떤 단축키가 있었는지 기억이 안 나는데…”라는 상황에서 유용해요.
Space +b는 버퍼(열린 파일) 관련입니다.
Space +bd로 현재 버퍼를 닫고, Space +bo로 현재 버퍼를 제외한 나머지를 모두 닫을 수 있습니다.
버퍼 사이 이동은 Shift +H(이전)와 Shift +L(다음)이 편해요.
Space +e로 파일 탐색기(Neo-tree)를 토글하고, Space +gg로 lazygit을 열 수 있습니다.
lazygit이 설치되어 있으면 NeoVim을 벗어나지 않고 커밋, 브랜치 전환, 리베이스까지 할 수 있어요.
Space +w는 창(window) 관련입니다.
Space +w를 누르면 분할, 닫기, 이동 같은 옵션이 나타납니다.
창 사이 이동은 Ctrl +h/j/k/l이 기본 매핑되어 있어서 Ctrl +w를 매번 누를 필요가 없어요.
Space +u는 UI 토글입니다.
줄 번호, 들여쓰기 가이드, 다크/라이트 모드 전환 같은 시각적 요소를 켜고 끌 수 있습니다.
Extras로 기능 확장하기
Extras는 필요한 기능을 골라서 켤 수 있는 플러그인 묶음입니다. 프로그래밍 언어 지원, UI 개선, 편집 도구 같은 것들이 Extras로 묶여 있어요.
NeoVim 안에서 :LazyExtras를 실행하면 사용 가능한 모든 Extras 목록이 나타납니다.
커서를 올리고 x를 누르면 토글할 수 있어요.
활성화한 Extras는 lazyvim.json 파일에 기록되어서 다음에 NeoVim을 켤 때도 유지됩니다.
언어 관련 Extras가 특히 유용합니다.
예를 들어 TypeScript로 개발한다면 lang.typescript Extra를 켜면 ts_ls LSP, 타입 체크, eslint 연동이 한 번에 설정됩니다.
Python이라면 lang.python을 켜면 pyright LSP와 ruff 린터가 설정되고요.
:LazyExtras
자주 쓰이는 것들을 몇 가지 꼽아볼게요.
lang.typescript— TypeScript/JavaScript LSP, eslint, prettier 연동lang.python— Python LSP(pyright), ruff 린터, debuggerlang.rust— Rust Analyzer, crates.nvimlang.json— JSON 스키마 자동 완성lang.yaml— YAML 스키마 자동 완성editor.mini-files— 미니멀한 파일 탐색기coding.copilot— GitHub Copilot 연동ui.mini-animate— 부드러운 스크롤 애니메이션
Extras를 켜면 관련 플러그인이 자동으로 설치되고 설정됩니다. 직접 플러그인을 하나씩 찾아서 설정하는 것보다 훨씬 간편해요.
LSP로 IDE처럼 쓰기
LazyVim에는 LSP 설정이 이미 포함되어 있습니다.
:Mason을 실행하면 언어 서버, 린터, 포매터를 검색하고 설치할 수 있는 UI가 나타나요.
하지만 더 편한 방법은 위에서 설명한 Extras를 쓰는 겁니다.
lang.typescript를 켜면 Mason이 ts_ls를 자동 설치하고 LSP 설정까지 해주거든요.
직접 Mason에서 하나씩 설치하고 lspconfig에 등록하는 과정이 필요 없습니다.
LSP가 연결되면 이런 단축키를 쓸 수 있습니다.
gd로 함수나 변수의 정의로 바로 이동할 수 있어요.
K를 누르면 커서 아래 심볼의 타입 정보나 문서가 팝업으로 뜹니다.
Space +cr로 변수나 함수 이름을 프로젝트 전체에서 한 번에 바꿀 수 있고요.
Space +ca로 코드 액션(자동 수정 제안)을 볼 수 있습니다.
]d와 [d로 진단 메시지(에러, 경고) 사이를 이동할 수 있어요.
자동 완성은 blink.cmp(또는 nvim-cmp)가 담당하는데, LSP가 연결되면 자동으로 동작합니다.
입력하는 중에 제안 목록이 뜨고, Ctrl +n과 Ctrl +p로 항목을 선택하고, Enter로 확정하면 돼요.
스니펫도 지원해서 Tab으로 스니펫 필드 사이를 이동할 수 있습니다.
포매팅과 린팅
LazyVim은 파일을 저장할 때 자동으로 포매팅을 적용합니다. conform.nvim이 기본 포매터 플러그인이고, 언어별로 포매터를 지정할 수 있어요.
예를 들어 JavaScript/TypeScript에 prettier를 쓰고 싶다면 lua/plugins/ 아래에 이런 파일을 만듭니다.
return {
{
"stevearc/conform.nvim",
opts = {
formatters_by_ft = {
javascript = { "prettier" },
typescript = { "prettier" },
css = { "prettier" },
json = { "prettier" },
lua = { "stylua" },
python = { "ruff_format" },
},
},
},
}
Mason에서 prettier와 stylua를 설치해두면(Space +cm으로 Mason을 열 수 있어요) 파일을 저장할 때마다 자동으로 포맷이 맞춰집니다.
자동 포매팅을 잠시 끄고 싶으면 Space +uf로 토글할 수 있어요.
린팅은 nvim-lint가 담당합니다. Extras에서 언어를 활성화하면 린터도 같이 설정되는 경우가 많아서 따로 건드릴 일이 적습니다.
플러그인 추가하기
LazyVim에 포함되지 않은 플러그인을 추가하고 싶으면 lua/plugins/ 아래에 파일을 만들면 됩니다.
lazy.nvim의 표준 문법을 그대로 쓰면 돼요.
return {
-- 괄호/따옴표 자동 닫기 강화
{
"windwp/nvim-autopairs",
event = "InsertEnter",
config = true,
},
-- 마크다운 미리보기
{
"iamcco/markdown-preview.nvim",
cmd = { "MarkdownPreviewToggle" },
ft = { "markdown" },
build = function() vim.fn["mkdp#util#install"]() end,
},
}
event, cmd, ft 같은 옵션으로 플러그인을 지연 로딩할 수 있습니다.
event = "InsertEnter"는 입력 모드에 진입할 때 로드하겠다는 뜻이고, ft = { "markdown" }는 마크다운 파일을 열 때만 로드하겠다는 뜻이에요.
이렇게 하면 NeoVim 시작 속도에 영향을 주지 않으면서 필요한 순간에만 플러그인이 활성화됩니다.
기존 플러그인 설정 덮어쓰기
LazyVim이 기본으로 설정한 플러그인의 동작을 바꾸고 싶을 때도 lua/plugins/에 파일을 만듭니다.
같은 플러그인 이름으로 스펙을 작성하면 lazy.nvim이 자동으로 병합(merge)해줘요.
예를 들어 Neo-tree의 창 너비를 바꾸고 숨김 파일을 보이게 하려면 이렇게 합니다.
return {
{
"nvim-neo-tree/neo-tree.nvim",
opts = {
window = {
width = 35,
},
filesystem = {
filtered_items = {
visible = true,
},
},
},
},
}
LazyVim의 기본 Neo-tree 설정에 여기서 지정한 opts가 깊은 병합(deep merge)으로 덮어씌워집니다.
기본값을 통째로 복사해서 수정할 필요 없이 바꾸고 싶은 부분만 지정하면 되니까 설정이 간결하게 유지돼요.
플러그인을 아예 비활성화하고 싶다면 enabled = false를 넣으면 됩니다.
return {
{ "folke/flash.nvim", enabled = false },
}
옵션과 키 매핑 커스터마이징
NeoVim 옵션은 lua/config/options.lua에서 설정합니다.
-- 탭 크기를 4로 변경
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
-- 스크롤할 때 위아래 여백 유지
vim.opt.scrolloff = 10
-- 줄 바꿈 활성화
vim.opt.wrap = true
키 매핑은 lua/config/keymaps.lua에서 추가합니다.
local map = vim.keymap.set
-- Ctrl + s로 파일 저장
map({ "n", "i" }, "<C-s>", "<cmd>w<CR>", { desc = "Save file" })
-- 세미콜론으로 Command 모드 진입
map("n", ";", ":", { desc = "Enter command mode" })
LazyVim이 이미 설정한 키 매핑을 제거하고 싶다면 vim.keymap.del을 쓸 수 있습니다.
vim.keymap.del("n", "<leader>l")
빠르게 Docker로 체험하기
설치하기 전에 먼저 체험해보고 싶다면 Docker로 바로 띄워볼 수 있습니다.
$ docker run -w /root -it --rm alpine:edge sh -uelic '
apk add git lazygit fzf curl neovim ripgrep alpine-sdk --update
git clone https://github.com/LazyVim/starter ~/.config/nvim
cd ~/.config/nvim
nvim
'
기존 NeoVim 설정을 건드리지 않고 LazyVim이 어떤 느낌인지 확인해볼 수 있어요. 마음에 들면 그때 로컬에 설치해도 되고요.
자주 쓰는 명령어 정리
LazyVim을 쓰면서 자주 쓰게 되는 명령어를 정리해봤습니다.
" === 플러그인 관리 ===
:Lazy " lazy.nvim 대시보드 열기
:Lazy sync " 플러그인 업데이트 및 동기화
:LazyExtras " Extras 활성화/비활성화
:Mason " LSP/린터/포매터 설치 관리
" === 파일 찾기 (Space +f) ===
Space +ff " 파일 이름으로 검색
Space +fg " 파일 내용으로 검색 (grep)
Space +fr " 최근 파일 목록
Space +fb " 열린 버퍼 목록
" === 버퍼 (Space +b) ===
Shift +H / Shift +L " 이전/다음 버퍼
Space +bd " 현재 버퍼 닫기
Space +bo " 다른 버퍼 모두 닫기
" === LSP ===
gd " 정의로 이동
K " 문서/타입 정보 보기
Space +cr " 이름 바꾸기 (rename)
Space +ca " 코드 액션
]d / [d " 다음/이전 진단 메시지
" === 도구 ===
Space +e " 파일 탐색기 토글
Space +gg " lazygit 열기
Space +uf " 자동 포매팅 토글
Space +sk " 키 매핑 검색
이 단축키를 전부 외울 필요는 없습니다.
Space를 누르고 기다리면 which-key가 모든 옵션을 보여주니까요.
쓰다 보면 자주 쓰는 것들은 자연스럽게 손에 익게 됩니다.
LazyVim 업데이트하기
LazyVim과 플러그인을 업데이트하려면 NeoVim에서 :Lazy sync를 실행하면 됩니다.
lazy.nvim이 모든 플러그인의 최신 버전을 확인하고 업데이트해줘요.
LazyVim은 업데이트 시 알림을 보여주는데, 파일을 편집하는 중에 갑자기 뭔가 달라지면 당황스러울 수 있으니 작업을 마무리한 뒤에 업데이트하는 게 좋습니다.
혹시 LazyVim이 마음에 안 들어서 제거하고 싶다면 설정 파일과 관련 데이터를 삭제하면 됩니다.
$ rm -rf ~/.config/nvim
$ rm -rf ~/.local/share/nvim
$ rm -rf ~/.local/state/nvim
$ rm -rf ~/.cache/nvim
백업해둔 이전 설정이 있다면 복원하면 원래 환경으로 돌아갑니다.
마치며
LazyVim은 “설정은 최소한으로, 코딩은 바로 시작”이라는 욕구를 잘 충족시키는 NeoVim 배포판입니다. 설치하면 IDE급 환경이 바로 갖춰지고, 바꾸고 싶은 건 NeoVim 표준 방식으로 바꿀 수 있어서 배운 게 헛되지 않아요. Extras 시스템 덕분에 언어별 지원을 켜고 끄는 것도 간편하고요.
NeoVim이 처음이라면 Vim 완벽 가이드로 모달 편집의 기본기를 익히고, NeoVim 입문 가이드를 읽은 다음에 LazyVim을 설치하는 순서를 추천합니다. Vim의 기본 조작법(모드 전환, hjkl 이동, 동사+명사 조합)을 모르는 상태에서 LazyVim을 깔면 화려한 화면에 압도당하기만 하거든요.
터미널 기반 개발 환경을 완성하고 싶다면 Zellij도 같이 써보세요. LazyVim으로 코드를 편집하면서 Zellij로 터미널을 분할하면 빌드, 테스트, Git 작업을 동시에 돌릴 수 있어요. 마우스 없이도 꽤 쾌적합니다.
더 깊이 배우고 싶다면 아래 자료를 참고하세요.
- LazyVim 공식 문서
- LazyVim GitHub 저장소
- LazyVim for Ambitious Developers - 무료로 읽을 수 있는 LazyVim 입문서
- LazyVim 키맵 레퍼런스
This work is licensed under
CC BY 4.0