Post

[Editor/Vim] LazyVim

Lazy Vim 소개 및 유용한 기능

[Editor/Vim] LazyVim

🧱 LazyVim 이란?

LazyVimfolke가 만든 Neovim 설정 프레임워크로, lazy.nvim 플러그인 매니저를 기반으로 동작한다.

lazy.nvim, which-key.nvim, tokyonight.nvim 등 유명 플러그인들이 모두 같은 개발자(folke)의 작품이다.

핵심 철학: “IDE처럼 동작하는 Neovim 환경을 최소한의 설정으로”

  • 기본으로 잘 다듬어진 설정을 제공하고, 사용자는 덮어쓰는 방식(override) 으로 커스터마이징한다.
  • Extras 시스템으로 언어별/기능별 플러그인 번들을 선택적으로 활성화할 수 있다.
  • 기본 컬러스킴은 tokyonight-night.
  • <leader> 키 기본값은 Space.

Neovim

LazyVim을 사용하기 위해서는 먼저 Neovim을 설치해야 한다.

Linux

리눅스 패키지 매니저로 설치하면 최신의 Neovim이 아닌 구버전이 설치되므로 아래와 같이 최신으로 설치한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Neovim Install

# 기존 apt neovim 제거 (있다면)
sudo apt remove neovim -y

# 최신 stable tarball 다운로드
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz

# /opt에 설치
sudo rm -rf /opt/nvim-linux-x86_64
sudo tar -C /opt -xzf nvim-linux-x86_64.tar.gz

# 정리
rm nvim-linux-x86_64.tar.gz
1
2
echo 'export PATH="$PATH:/opt/nvim-linux-x86_64/bin"' >> ~/.zshrc
source ~/.zshrc
1
nvim --version
1
2
sudo apt install git gcc unzip curl ripgrep fzf fd-find pipx
pipx install cmakelint

fdUbuntu에서 fdfind로 설치됨. LazyVimfd를 찾으므로 심볼릭 링크 필요:

1
2
3
mkdir -p ~/.local/bin
ln -sf $(which fdfind) ~/.local/bin/fd
# ~/.zshrc에 ~/.local/bin이 PATH에 있는지 확인

Windows

1
choco install neovim

🚀 LazyVim Install

내가 미리 어느 정도 설정한 것이 있다. 이것을 이용하면 C++, Python, Rust, TypeScript, CMake 등의 플러그인들을 따로 설치할 필요 없다.

Prerequisites

Linux

1
2
sudo apt install ripgrep fzf fd-find pipx
pipx install cmakelint

MacOS

1
2
brew install ripgrep fzf fd pipx
pipx install cmakelint

Windows

1
2
3
4
5
6
choco install ripgrep fzf fd python tree-sitter
pip install pipx
pipx install cmakelint

# MinGW-w64 배포판 설치
winget install --id=BrechtSanders.WinLibs.POSIX.UCRT -e

Clone

각 OS에 맞게 Prerequisites를 설치한 후 다음과 같이 git clone 받으면 끝이다.

Linux / macOS

1
git clone https://github.com/seongcheoljeon/LazyVimSettings ~/.config/nvim

Windows (PowerShell)

1
git clone https://github.com/seongcheoljeon/LazyVimSettings $env:LOCALAPPDATA\nvim

처음 Neovim을 실행하면 lazy.nvim이 자동으로 모든 플러그인을 설치한다. 설치가 완료될 때까지 잠시 기다리면 된다.


🗂️ 설정 파일 구조

초기 구성 파일의 트리 구조는 다음과 같다.

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~/.config/nvim/
├── init.lua              ← 진입점: 클립보드 설정 + lazy.nvim 부트스트랩
├── lazyvim.json          ← 활성화할 LazyVim Extras 목록
├── lazy-lock.json        ← 플러그인 버전 고정 파일 (자동 생성)
├── stylua.toml           ← Lua 코드 포맷터 설정
└── lua/
    ├── config/
    │   ├── lazy.lua      ← lazy.nvim 초기화 (건드릴 필요 없음)
    │   ├── keymaps.lua   ← 커스텀 키맵 추가 (LazyVim 기본값 위에 추가됨)
    │   ├── options.lua   ← 커스텀 옵션 추가 (LazyVim 기본값 위에 추가됨)
    │   └── autocmds.lua  ← 커스텀 자동 명령
    └── plugins/
        ├── lsp.lua       ← LSP 서버 세부 설정 (예: Ruff를 mason 없이 사용)
        ├── typescript.lua← TypeScript 테스트 어댑터 (Vitest / Jest)
        └── extras.lua    ← 추가 플러그인 (highlight-undo, neogit 등)

lua/config/ 경로의 파일들은 LazyVim이 로드하는 고정 경로이므로 이름을 바꾸면 안 된다.

lua/plugins/ 경로는 자유롭게 분리할 수 있다. 예를 들어 lua/plugins/typescript.lua처럼 언어별로 파일을 나눠 관리하면 된다.

LazyVim은 기존 플러그인 설정을 완전히 교체하지 않고, 사용자가 작성한 opts병합(merge) 하는 방식으로 동작한다. 따라서 필요한 부분만 덮어쓰면 된다.


🔌 LazyVim Extras

LazyVim의 가장 강력한 기능 중 하나인 Extras 시스템이다. 언어별 LSP, 린터, 포맷터, 디버거, 테스트 어댑터를 한 번에 묶어서 활성화할 수 있다.

lazyvim.json 파일에 활성화할 extras를 나열하거나, <leader>l → LazyVim → Extras 메뉴에서 GUI로 선택할 수 있다.

현재 활성화된 Extras (19개):

카테고리Extra설명
언어lang.clangdC / C++ (clangd LSP, clang-format)
언어lang.cmakeCMake (cmake-tools.nvim, cmakelint)
언어lang.dockerDocker / Dockerfile
언어lang.gitGit 파일 구문 강조
언어lang.jsonJSON + SchemaStore
언어lang.markdownMarkdown 미리보기 + 렌더링
언어lang.pythonPython (pyright LSP, ruff, venv 선택)
언어lang.rustRust (rustaceanvim, crates.nvim)
언어lang.tomlTOML
언어lang.typescriptTypeScript / JavaScript
언어lang.yamlYAML + SchemaStore
에디터dap.coreDAP 디버거 (nvim-dap + UI)
에디터editor.aerial코드 아웃라인 사이드바
에디터editor.fzfFZF 퍼지 파인더 통합
에디터editor.overseer태스크 러너
에디터formatting.prettierPrettier 포맷터
에디터linting.eslintESLint 린터
에디터test.coreNeotest 테스트 프레임워크
에디터vscodeVSCode Neovim 확장 호환

⌨️ 자주 사용하는 키

<leader> = Space (기본값)

파일 / 버퍼 탐색

설명
<leader>ff파일 찾기 (Find Files)
<leader>fggit tracked 파일 찾기 (git-files)
<leader>fb열린 버퍼 목록
<leader>/현재 프로젝트에서 grep
<leader>e파일 탐색기 토글
<leader>E파일 탐색기 토글 (cwd)
<leader>`이전 버퍼로 전환
<leader>bb버퍼 전환
<leader>bd현재 버퍼 닫기

코드 탐색 (LSP)

설명
gd정의로 이동 (Go to Definition)
gD선언으로 이동 (Go to Declaration)
gr참조 목록 (Go to References)
gI구현으로 이동 (Go to Implementation)
gy타입 정의로 이동
K호버 문서 (Hover Documentation)
<leader>ca코드 액션 (Code Action)
<leader>cr심볼 이름 변경 (Rename)
<leader>cf코드 포맷 (Format)
<leader>cs코드 심볼 아웃라인 (Aerial)
]d / [d다음/이전 진단(Diagnostic)
<leader>cd현재 위치 진단 보기

Flash 점프 (빠른 커서 이동)

설명
sFlash 점프 (화면 내 원하는 위치로 즉시 이동)
SFlash Treesitter 선택
r (operator-pending)Flash Remote

Git

설명
<leader>ggNeogit 열기 (Git UI)
<leader>gcGit 커밋 로그
<leader>gsGit 상태
<leader>gB브라우저에서 Git 파일 열기 (GitHub 등)
]h / [h다음/이전 변경 hunk
<leader>ghpHunk 미리보기
<leader>ghb현재 줄 Git blame
<leader>ghdHunk diff 보기
<leader>ghsHunk 스테이징
<leader>ghrHunk 되돌리기

디버깅 (DAP)

설명
<leader>db브레이크포인트 토글
<leader>dB조건부 브레이크포인트
<leader>dc디버깅 시작 / 계속 (Continue)
<leader>diStep Into
<leader>doStep Out
<leader>dOStep Over
<leader>dl마지막 디버깅 세션 재실행
<leader>drREPL 토글
<leader>duDAP UI 토글
<leader>de표현식 평가 (Eval)

테스트 (Neotest)

설명
<leader>tr가장 가까운 테스트 실행
<leader>tt현재 파일 테스트 실행
<leader>tT전체 테스트 파일 실행 (cwd)
<leader>ts테스트 요약 패널 토글
<leader>to테스트 출력 보기
<leader>tl마지막 테스트 다시 실행

기타 유용한 키

설명
<C-/>터미널 토글 (프로젝트 루트 디렉토리)
<leader>lLazy.nvim 플러그인 매니저 열기
<leader>cmMason 패키지 매니저 열기
<leader>LLazyVim Changelog 보기
gcc현재 줄 주석 토글
gc (visual)선택 영역 주석 토글
<leader>stTODO 목록 보기 (Telescope)
]t / [t다음/이전 TODO 이동
<leader>fn새 파일 생성
<leader>ur화면 리프레시 (redraw)

🔌 주요 플러그인

LSP & 자동완성

플러그인설명
nvim-lspconfigLSP 서버 연결 설정
blink.cmp최신 자동완성 엔진 (nvim-cmp 대체)
mason.nvimLSP / DAP / Linter / Formatter 패키지 매니저
mason-lspconfig.nvimMason과 lspconfig 연동
lazydev.nvimLua 개발 시 Neovim API 자동완성

파일 탐색 & 검색

플러그인설명
telescope.nvim퍼지 파인더 (파일, 텍스트, 버퍼 등 검색)
fzf-luaFZF 기반 고속 검색
flash.nvims 키로 화면 내 어디든 즉시 이동
grug-far.nvim프로젝트 전체 Find & Replace

Git

플러그인설명
neogitGit UI (Emacs magit 스타일)
gitsigns.nvim거터(gutter)에 변경 hunk 표시
diffview.nvim파일 diff / merge conflict 뷰어

UI & 테마

플러그인설명
tokyonight.nvim기본 컬러스킴
lualine.nvim상태바
bufferline.nvim버퍼 탭
noice.nvimcmdline / 메시지 / notify UI 개선
which-key.nvim<leader> 입력 후 키맵 힌트 팝업 표시
highlight-undo.nvimundo/redo 시 변경된 텍스트를 300ms 동안 하이라이트
todo-comments.nvimTODO:, FIXME:, NOTE: 등 하이라이트
aerial.nvim코드 구조(함수/클래스) 아웃라인 사이드바

코드 품질

플러그인설명
conform.nvim코드 포맷터 통합 (Prettier, stylua, shfmt 등)
nvim-lint린터 통합 (ESLint, flake8, shellcheck 등)
nvim-treesitter구문 분석 기반 정확한 문법 강조

디버깅 & 테스트

플러그인설명
nvim-dapDebug Adapter Protocol 클라이언트
nvim-dap-uiDAP용 UI 패널
nvim-dap-virtual-text브레이크포인트 옆에 변수값 인라인 표시
neotest테스트 프레임워크
neotest-pythonPython (pytest/unittest) 어댑터
neotest-vitestVitest 어댑터
neotest-jestJest 어댑터

🖥️ 언어별 개발 환경

C / C++

  • LSP: clangd (코드 완성, 정의 이동, 진단)
  • 확장: clangd_extensions.nvim (인레이 힌트, 메모리 사용량 등)
  • 포맷터: clang-format
  • 디버거: codelldb (DAP via mason)

compile_commands.json 또는 CMakeLists.txt가 있는 프로젝트에서 clangd가 자동으로 인식된다.

Python

  • LSP: pyright (타입 체킹 + 자동완성)
  • 린터: ruff (flake8 + isort + 기타 규칙을 하나로 통합)
  • 디버거: nvim-dap-python (debugpy 기반)
  • 테스트: neotest-python (pytest)
  • 가상환경: venv-selector.nvim (<leader>cv로 venv 선택)

이 설정에서는 ruff를 mason이 아닌 시스템 pip으로 설치한 것을 사용한다 (mason = false).

Rust

  • LSP + 기능: rustaceanvim (rust-analyzer 기반, cargo 명령 통합)
  • Cargo.toml 도우미: crates.nvim (최신 버전 확인, 의존성 관리)
  • 디버거: codelldb

TypeScript / JavaScript

  • LSP: ts_ls (TypeScript Language Server)
  • 린터: eslint (포맷은 Prettier에 위임)
  • 포맷터: prettier
  • 테스트: neotest-vitest (Vitest), neotest-jest (Jest, npx jest 사용)

CMake

  • 통합: cmake-tools.nvim (빌드, 실행, 테스트 명령 통합)
  • 린터: cmakelint (pipx로 설치)

📋 클립보드 설정

init.lua에 다음 설정이 들어 있다.

1
vim.opt.clipboard:append("unnamedplus")

이 설정을 하면 Neovim의 기본 레지스터("), yank 레지스터(0)가 시스템 클립보드와 동기화된다. 즉, Neovim에서 복사한 내용을 다른 앱에서 붙여넣기 할 수 있고, 반대로도 가능하다.

WSL 환경 추가 설정

WSL(Windows Subsystem for Linux)에서 사용할 경우 win32yank.exe가 필요하다.

choco install neovim으로 Neovim을 설치하면 win32yank.exe가 번들로 자동 포함된다.

1
C:\tools\neovim\nvim-win64\bin\win32yank.exe

WSL에서 Neovim이 이 경로를 자동으로 감지하므로 별도 설치나 추가 설정은 필요 없다.


🔍 Mason으로 LSP / 도구 관리

<leader>cm으로 Mason을 열면 설치된 도구 목록을 확인하고 추가로 설치할 수 있다.

현재 설치된 주요 도구:

도구종류용도
styluaFormatterLua 코드 포맷
shellcheckLinterShell 스크립트 린팅
shfmtFormatterShell 스크립트 포맷
flake8LinterPython 린팅
codelldbDAPC/C++/Rust 디버거

💡 Tips

which-key 활용

<leader>를 누르고 잠깐 기다리면 사용 가능한 키맵이 팝업으로 표시된다. 키맵을 외울 필요 없이 탐색하며 사용할 수 있다.

플러그인 업데이트

1
2
<leader>l   → Lazy.nvim 메뉴 열기
U           → 모든 플러그인 업데이트

플러그인 비활성화

lua/plugins/ 아래 파일에서 해당 플러그인에 enabled = false 추가:

1
2
3
return {
  { "플러그인/이름", enabled = false },
}

커스텀 키맵 추가

lua/config/keymaps.lua에 추가:

1
2
local map = vim.keymap.set
map("n", "<leader>xx", "<cmd>SomeCommand<cr>", { desc = "설명" })
This post is copyrighted by the author. All rights reserved.