[Neovim] Vim에 Lua와 LSP를 내장한 모달 에디터
![[Neovim] Vim에 Lua와 LSP를 내장한 모달 에디터](https://blog.kakaocdn.net/dna/mzsnx/dJMcacKOKtL/AAAAAAAAAAAAAAAAAAAAADa_mFAOCr3q-LzKGqGg-Esjvod8z8J59W0Z68z8RATJ/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1785509999&allow_ip=&allow_referer=&signature=0xF2Hop9S2fm8mNia%2BYPv%2BUTkGA%3D)
개발자 도구 · 에디터 & IDE
[Neovim] Vim에 Lua와 LSP를 내장한 모달 에디터
Neovim은 Vim에서 갈라져 나온 오픈소스 에디터예요. 편집 방식(모달 편집)은 Vim과 같지만, 설정 언어가 Lua로 바뀌고 LSP 클라이언트와 tree-sitter가 본체에 들어갔습니다. 이 글은 Vim과 뭐가 다른지, 처음 설치해서 init.lua를 어떻게 시작하는지, 미리 알아둘 함정은 뭔지 공식 문서 기준으로 정리합니다.
Vim의 편집 방식은 그대로 두고, 확장 방식을 바꾼 프로젝트예요
Neovim은 스스로를 "hyperextensible Vim-based text editor"라고 소개합니다. 핵심은 두 단어예요. Vim-based — hjkl 이동, 노멀/인서트 모드, 텍스트 오브젝트 같은 Vim의 편집 모델과 Vimscript 플러그인이 대부분 그대로 돌아갑니다. hyperextensible — 확장하는 방법이 다릅니다. Vimscript 대신 Lua로 설정과 플러그인을 쓰며 외부 프로그램이 MessagePack 기반 API로 에디터를 원격 조종하는 구조예요. VS Code 확장이나 브라우저에 Neovim이 embed되는 것도 이 API 덕분입니다.
| Vim | Neovim | |
|---|---|---|
| 설정 파일 | ~/.vimrc | ~/.config/nvim/init.lua (또는 init.vim) |
| 설정 언어 | Vimscript, Vim9script | Lua + Vimscript (Vim9script 미지원) |
| LSP | 플러그인 필요 | 클라이언트 내장 |
| 구문 분석 | 정규식 기반 하이라이트 | tree-sitter 파싱 엔진 |
| 기본값 | 보수적 (직접 켜야 함) | 현대적 기본값이 켜져 있음 |
| 터미널 | :terminal (8.1부터) | :terminal 내장 |
"에디터는 가볍게, 지능은 언어 서버에" 구도로 보면 위치가 명확해집니다. VS Code가 에디터와 확장 마켓을 한 몸으로 묶은 쪽이라면, Neovim은 터미널 안에서 필요한 부품만 조립해 IDE를 만드는 쪽이에요. 대체하는 대상은 두 가지입니다. 서버에서 쓰던 Vim, 그리고 로컬에서 무겁게 느껴지던 GUI 에디터.
설치 후 첫 명령은 :Tutor입니다
macOS는 brew install neovim, 리눅스는 각 배포판 패키지 매니저, Windows는 winget이나 GitHub 릴리즈로 설치합니다. 현재 안정 버전은 0.12예요. 터미널에서 nvim을 치면 시작 화면이 뜹니다.
모달 편집이 처음이면 :Tutor부터 실행하는 게 정석입니다. 30분 분량의 대화형 튜토리얼이 내장돼 있어서 파일을 실제로 편집하며 이동·삭제·저장을 익히게 돼 있어요. 이 단계를 건너뛰고 플러그인부터 깔면 "글자 하나 못 지우는 에디터"라는 첫인상만 남습니다.
설정 파일 위치는 Vim과 다릅니다. 홈 디렉토리의 .vimrc가 아니라 XDG 표준 경로인 ~/.config/nvim/ 아래에 init.lua를 둡니다. 정확한 경로는 에디터 안에서 :echo stdpath('config')로 확인해요. init.lua와 init.vim 중 하나만 쓸 수 있고 둘을 동시에 두면 안 된다는 점은 공식 문서가 명시하는 규칙입니다.
vimrc 첫 20줄이 필요 없어요 — 기본값이 이미 켜져 있습니다
Vim 설정 파일의 앞부분은 관습적으로 syntax on, set hlsearch 같은 "켜기" 명령으로 시작하는데, Neovim은 이 목록 상당수가 기본값입니다. 공식 vim_diff 문서에 나오는 것만 추려도 이 정도예요.
- 구문 하이라이트와 파일타입 감지가 자동으로 켜져 있음
- 검색 하이라이트(hlsearch)와 증분 검색(incsearch) 기본 활성
- 상태줄 항상 표시(laststatus=2), 마우스 기본 활성
- 터미널이 지원하면 트루컬러(termguicolors) 자동 활성
- undo 파일이 ~/.local/state/nvim/undo/에 자동 저장 — 에디터를 껐다 켜도 실행 취소 이력이 남음
- 명령어 히스토리 10000개(최대치), ripgrep이 설치돼 있으면 :grep이 ripgrep을 사용
- .editorconfig 파일 자동 적용, :Man으로 man 페이지 열람 내장
그래서 Neovim의 빈 설정 파일은 Vim의 빈 vimrc보다 체감이 훨씬 낫습니다. 설정을 한 줄도 안 쓰고 며칠 써보는 시작 방법이 실제로 성립해요.
init.lua는 옵션, 키맵, 모듈 세 가지로 시작합니다
Lua 설정의 기본 재료는 세 개예요. 옵션은 vim.opt, 키 매핑은 vim.keymap.set(), 파일 분리는 require(). 공식 Lua 가이드의 문법을 그대로 쓴 최소 예시입니다.
-- ~/.config/nvim/init.lua
vim.g.mapleader = ' ' -- 리더 키를 스페이스로
vim.opt.number = true -- 줄 번호
vim.opt.tabstop = 4 -- 탭 너비
vim.opt.shiftwidth = 4 -- 들여쓰기 너비
vim.opt.wildignore = { '*.o', '__pycache__' } -- 리스트 옵션은 Lua 테이블로
-- 키맵: (모드, 키, 동작) — 동작에 Lua 함수를 바로 넣을 수 있음
vim.keymap.set('n', '<Leader>w', '<cmd>write<cr>')
vim.keymap.set('n', '<Leader>d', vim.diagnostic.open_float)
-- 설정이 커지면 lua/ 디렉토리로 분리
-- ~/.config/nvim/lua/keymaps.lua 를 만들고:
require('keymaps')
Vimscript의 set wildignore=*.o,__pycache__ 같은 콤마 문자열이 Lua 테이블로 바뀐 게 보이실 거예요. 리스트형 옵션을 프로그래밍 언어의 자료구조로 다루게 된 것이 Lua 설정의 실질적인 장점입니다. 조건문, 반복문, 함수를 설정 파일 안에서 일반 언어처럼 쓸 수 있고, lua/ 디렉토리에 파일을 나눠 두면 require()로 불러오는 모듈 구조가 됩니다.
IDE 기능은 플러그인이 아니라 본체에 들어 있어요
내장 LSP 클라이언트
정의로 이동, 참조 찾기, 이름 변경, 진단 표시 같은 IDE 기능을 언어 서버 프로토콜로 처리하는 클라이언트가 본체에 있습니다. 다만 클라이언트만 내장이에요. gopls, rust-analyzer, pyright 같은 언어 서버 자체는 언어별로 따로 설치해야 합니다. 이 지점이 VS Code와의 체감 차이가 가장 큰 부분입니다.
tree-sitter 파싱
정규식으로 색만 입히던 기존 하이라이트와 달리, tree-sitter는 코드를 실제 구문 트리로 파싱합니다. 하이라이트 정확도가 올라가는 것 외에, "함수 하나를 통째로 선택" 같은 구문 단위 이동·선택의 기반이 돼요.
:terminal과 클라이언트-서버
에디터 분할 창 안에서 셸을 띄우는 :terminal이 내장돼 있습니다. 0.12에서는 :connect, :detach, :restart 같은 명령으로 에디터 프로세스와 화면을 분리해서 붙었다 떼는 클라이언트-서버 구조가 공식 기능으로 소개되고 있습니다. tmux처럼 세션을 유지한 채 다른 곳에서 다시 붙는 사용 방식이에요.
미리 알아두면 좋은 함정
- 학습 곡선은 에디터가 아니라 모달 편집에 있습니다. Vim 경험이 없다면 첫 1~2주는 생산성이 떨어지는 구간을 지나야 해요. :Tutor를 먼저 끝내는 것이 가장 싼 지름길입니다.
- LSP·자동완성·파일 탐색기를 갖춘 "완성된 IDE"까지는 플러그인 조합과 설정이 필요합니다. 처음부터 직접 쌓기 부담스러우면 kickstart.nvim 같은 커뮤니티 스타터 설정을 읽으면서 시작하는 방식이 널리 쓰여요.
- init.lua와 init.vim은 동시에 쓸 수 없습니다. Vim에서 넘어올 때 .vimrc를 그대로 init.vim으로 옮겨 시작한 뒤 Lua 전환은 그다음에 해도 됩니다.
- Vim 9의 Vim9script는 지원하지 않습니다. Vim9script로 작성된 플러그인은 돌아가지 않아요.
- 기본 색상 테마가 Vim과 다릅니다. 예전 배색으로 돌리려면
:colorscheme vim을 설정에 추가하면 됩니다.
터미널에서 사는 시간이 길수록 맞는 도구입니다
ssh로 서버에 붙어 작업하는 일이 잦은 사람, tmux 위에서 개발 환경을 굴리는 사람, 에디터 띄우는 데 몇 초 기다리는 게 싫은 사람에게 맞는 후보입니다. 반대로 GUI와 마우스 중심 워크플로우가 편하고 설정 파일을 만지는 것 자체가 비용으로 느껴진다면, VS Code에 Vim 키바인딩 확장을 얹는 쪽이 현실적인 절충이에요.
시작 순서는 단순합니다. 설치 → :Tutor 완주 → 빈 설정으로 며칠 사용 → 불편한 것만 init.lua에 한 줄씩 추가. 남의 설정 수백 줄을 통째로 복사하는 것보다, 필요가 생길 때마다 한 줄씩 늘리는 쪽이 각 줄의 의미를 아는 설정으로 남습니다.
이 글은 직접 사용기가 아니라 공식 사이트·문서를 근거로 정리한 객관 소개입니다.
'개발자 도구 > 에디터 & IDE' 카테고리의 다른 글
| [Sublime Text] 멀티 커서와 프로젝트 전환 (1) | 2026.08.12 |
|---|---|
| [Zed] 1.9 업데이트, 파인더 미리보기와 에이전트 검색 (0) | 2026.07.13 |
| [Zed] Rust로 새로 쓴 고속 코드 에디터 (0) | 2026.06.22 |
| [VS Code] 마우스 줄이는 단축키와 설정 (0) | 2026.06.12 |
📚 같이 보면 좋은
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 일정액의 수수료를 제공받습니다."