본문으로 건너뛰기

LazyVim 입문 가이드: 설치부터 디버깅까지 한 번에 끝내기

 · reading-time-plural

나도 나만의 멋진 Vim Config를 가질 줄 알았다. 하지만 그 과정은 고통스럽고 시간 낭비가 심하다.

인텔리제이, VSCode 등 시간이 지나며 발전하고 유려한 AI 도구 지원이 되는 것을 보여 왜 이렇게 해야하나 싶다.

그럼에도 Vim은 텍스트 수정, 터미널을 돌아다니며 conf 수정 등 강점을 보이는 부분이 있다. 바닐라 Vim은 아쉽고, Conf를 만들기에는 비효율적이고… 이런 것을 손쉽게 하기 위해 LazyVim를 사용해보자.

Neovim Config Framework 중 왜 LazyVim를 선택했는지, 어떤 구조인지 알아보자.

또한, LazyVim을 바로 사용할 수 있도록 가이드 내용도 포함한다.

Neovim Config Framework 비교

찾아보면 LunarVim, AstroNvim, LazyVim가 주로 사용되는 듯하다.

GitHub Star 수로 비교하면 다음과 같다.

역사는 LunarVim가 제일 오래되었고, 가파른 성장세를 보이는 것은 LazyVim이다.

보통 늦게 출시한 것이 더 발전된 기술을 사용하고 이전의 것들을 개선하는 경우가 많다. 게다가 엄청난 속도로 LunarVim을 따라잡은 LazyVim이 눈에 들어왔다.

그래도 역시 직접 사용해 봐야지 알지 알겠는가? 사용 후 비교는 아래와 같다.

LunarVim VS AstroNvim, LazyVim

AstroNvim, LazyVim는 설치하는 UI가 나오면서 알아서 해주고 뭔가 모던하다는 느낌을 받았다. 왜 그런지 보니까 lazy.nvim 기반이라서 그렇다. 또한, 프로젝트가 시작된지도 얼마 안되었더라

그에 반해 LunarVim은 딱딱한 Terminal UI 이었다.

AstroNvim VS LazyVim

LazyVim이 더 유려한 UI/UX를 제공했다.

  • command 화면도 명령 팔레트 형식으로 나오고
  • space 으로 나오는 명령 화면도 세로 표시
  • 시작 화면에서 손쉽게 config 수정 가능
  • Markdown에서 a 링크는 축소되어 표시
  • 부드러운 스크롤 이동
  • cd 으로 경로로 이동하지 않고 nvim {경로} 으로 하더라도 마치 프로젝트 open 하는 것 처럼 파일 탐색기 표시

LazyVim으로 결정!

최종적으로 LazyVim으로 결정했다.

  • 플러그인 관리가 나름 핵심인데 그 핵심의 lazy.nvim 이고 해당 개발자가 만든 것이 LazyVim 이라서
  • GitHub Star 많고, UI 모던하고, 기능 지원이 빵빵해서 (커뮤니티 파워 기대)
  • 사용자 설정에 맞게 config 지정 가능
  • VSCode 통합 기능 제공 (config 통합 관리 가능 🤤)
  • 기타
    • 기본적으로 필요한 플러그인이 이미 설치되어 있고 여러 플러그인 조합에서 단축키가 충돌하지 않게 잘 설정되어 있음
    • 오픈소스로 누군가에 의해 계속 관리됨
    • space? 로 손쉽게 단축키를 찾을 수 있다. 단축키는 자연스럽게 까먹을 수 있는데 언제든 단축키를 살펴볼 수 있어 편리하다.
    • 기본적인 설정이 되어 있다. 클립보드 연동이나 Y 입력 시 커서 뒤 라인 복사 같은 기본 유틸 키 맵핑이 되어 있어 편함

lazy.nvim 이란?

LazyVim 사용 전 lazy.nvim이 무엇인지 짚고 넘어가는 것이 좋을 것 같다. 필자는 처음 알아볼 때 lazy.nvim과 LazyVim의 역할에 대해 혼란스러웠다.

lazy.nvim은 플러그인 관리자로 Vim을 사용하다 보면 여러 플러그인을 사용하게 되는데 이를 손쉽게 관리할 수 있도록 도와준다.

쉬운 관리가 꽤 중요한 부분인데... Vim의 conf를 만진다는 것은 대부분 플러그인을 설치하고 관리하는 과정이다. 설치뿐 아니라 업데이트, 에러는 없는지 등 어떻게 보면 Vim을 사용하면서 많이 마주치는 부분이다. 이런 기능을 TUI 로 손쉽게 제공한다.

자동 설치 기능이 있어서 아주 편리한데, 보통 Vim 플러그인 매니저는 플러그인 매니저도 수동으로 설치해주고 플러그인도 명령어로 일일이 설치, 업데이트 해야 했는데 해당 제품은 플러그인 매니저 설치도 자동이고 업데이트도 TUI 로 손쉽게 가능하다. 현대적인 IDE 를 쓰는 기분을 느낄 수 있다.

이름에서 볼 수 있듯이 lazy 기능이 있어 필요한 시점(e.g. 명시적인 호출 시, 특정 키 입력 시 등)에 플러그인을 로드한다. 덕분에 플러그인 범벅인 Vim을 빠르게 사용할 수 있다.

LazyVim 시작

LazyVim은 각종 config만 제공한다. 그것을 설치/관리하는 주체가 lazy.nvim이고 config 관리는 starter로 역할이 나뉘어 있다.

시작 방법은 문서화가 잘 되어 있기에 공식 문서를 참고하면 된다. 먼저 Docker로 시작하기를 추천하는데, 이 방법으로 어떤 의존성이 있는지 한눈에 파악할 수 있다.

또한, 필요한 의존성이 있을 수 있는데 Requirements를 확인하면 된다. 문제가 된다면 거의 Nerd Font 최신 버전 미설치로 인한 폰트 깨짐이나 fzf 미설치 정도다.

LazyVim 기본적인 사용법

기능이 워낙 많다 보니 처음에는 어디서부터 시작해야 할지 막막할 수 있다. 아래 내용을 참고하면 전체 흐름을 이해하고 빠르게 적응하는 데 도움이 될 것이다.

내용은 우선순위에 맞게 배치해 보았다.

주요 개념

  • <leader>space 이다.
  • 첫 설치 시 lua/plugins/example.lua 의 경우 if true then return {} end 조건으로 실행 안되는 상태다.
  • lua/plugins/*.lua 파일은 논리적인 단위다. ui.lua 라고 만들고 UI 관런 플러그인을 몰아 넣을 수도 있고 플러그인 단위로 파일을 만들어서 관리할 수도 있다.
  • return {} 으로 반한되어야 함
  • lua/config 경로에서 기존 구조 이외 파일은 로드 되지 않는다.
  • LazyVim의 설정은 lazyvim.json 에서 관리된다.

LazyExtras

LazyVim 설치 시 기본적인 플러그인은 활성화가 되어있지만 유틸적으로 제공하는 기능은 사용자가 추가 활성화 해야한다. like. LazyVim확장 이라고 생각할 수 있다.

필자는 분명 문서에 있는 기능인데 안되어 해맸다. 해당 내용을 우선 배치한 이유도 이걸 알아야 공식 문서의 내용을 넓게 이해할 수 있다.

TypeScript 를 예시로 구조를 살펴보면 .lua 파일은 lua/lazyvim/plugins/extras/lang/typescript.lua 에 정의되어있다.

.lua 구조를 보면 아래와 같은데 여러 플러그인의 설정 모음인 것을 볼 수 있다.

~/.local/share/nvim/lazy/LazyVim/lua/lazyvim/plugins/extras/lang/typescript.lua
return {
recommended = function()
return LazyVim.extras.wants({ /* ... */ })
end,

{
"neovim/nvim-lspconfig",
opts = { /* ... */ }
},

{
"mfussenegger/nvim-dap",
opts = { /* ... */ }
},

{
"echasnovski/mini.icons",
opts = { /* ... */ }
},
}

공식 문서를 보면 해당 플러그인의 각각 섹션이 어떤 옵션으로 설정할 수 있는지 볼 수 있다.

예시로 mini.surround 를 활성화 해보자

mini.surround" " , { } 와 같이 괄호를 손쉽게 추가하고 제거하는 플러그인이다. 문서에는 LazyVim이 지원하는 것으로 나온다.

활성화를 위해 :LazyExtras 입력해서 들어가면 Recommended Plugins 으로만 나오는 것을 확인할 수 있다.

해당 플러그인 텍스트에 커서를 두고 x 를 눌러 활성화한다.

nvim 을 다시 시작하면 lazy.nvim 에 의해 자동으로 설치되는 것을 볼 수 있다.

mini.surround 추가하는 단축키는 gsa 인데 이전에 g 에서 보이지 않던 매뉴가 보여서 제대로 활성화 된 것을 볼 수 있다.

이렇게 추가된 :LazyExtraslazyvim.json 에서 관리된다.

단축키 보는법

공식 문서 https://www.lazyvim.org/keymaps 를 보면 맵핑 정보를 모두 볼 수 있다.

여기에 있는 단축키가 바로 되는 것은 아니며 필요에 따라 :LazyExtras 으로 설치해야 작동하는 것이 있다.

e.g. DAP Core

Vim에서 단축키를 확인하는 방법은 아래와 같다.

  • <space> ( = <leader> )
    • Focus 된 곳에서 사용 가능한 단축키 보여줌
    • 페이지 네이션이 되어있어 back 으로 뒤로 넘어가서 단축키 있는지도 보기
  • ?
    • Focus 된 곳에서 사용 가능한 단축키 보여줌
    • 플러그인 자체에서 제공하는 help 성격임
  • ?<leader> 차이
    • neo-tree.nvim 예시로 보면
    • ? 는 플러그인 자체에 대한 단축키만 보여주고
    • <leader> 는 첫 페이지에 안나오고 back 으로 뒤로 가야 보여주는데 플러그인의 명령을 LazyVim에서 어떻게 맵핑되었는지 보여준다.

주요 명령어

  • LazyVim
    • :LazyHealth
      • LazyVim 설치 및 실행 후 상태 확인
    • :Lazy sync
      • 다시 로드
  • LSP
    • :LspInfo
      • 어떤 것 로드 되었는지 확인 가능
  • mason.nvim
    • :Mason
      • Dashboard 확인

주요 플러그인

  • neo-tree.nvim
    • r 이름 변경
    • d 파일 제거
    • h 숨김 파일 보기 토글
    • < , > 으로 탐색 화면 돌아다닐 수 있음
      • 그 중 GIT STATUS 의 경우 vim 으로 열린 Git 의 변경된 파일 내역을 보여줌
  • snacks.nvim
    • <leader>gs Git Status
      • M+ 있으면 stage - 면 unstage
      • 순수한 화살표 입력으로 ← , → 하면 적용됨
  • flash.nvim
    • s + {검색 글자}
      • {검색 글자} 검색된 결과가 나오는데 분홍색 키 입력 시 거기로 이동
    • S
      • 커서 근처의 괄호 영역을 보여주는데 분홍색 키 입력 시 해당 범위까지 visual 으로 잡아 줌
        • 아래의 상태에서
        • f 누르면 아래와 같이 잡힘

LSP+DAP (언어 기능+디버깅)

Vim을 IDE처럼 사용하겠다면 꼭 알아야하는 기능이다.

여기서 mason.nvim 라는 새로운 패키지가 또 등장하는데... (머리 아파하지 말아야 쉽다!)

TL;DR

  • mason.nvimLSP , DAP , Linter , Formatter 와 같은 언어 기능 플러그인을 손쉽게 관리할 수 있는 패키지 매니저 이다.
  • 그렇기 때문에 mason.nvim 만의 패키지 저장소가 있다.
  • 설치 후 플러그인 설정은 Vim에서 해야함
  • 우린 LazyVim 을 사용하니 이미 제공된 것 사용하면 됨

예시로 JavaScript 코딩할 수 있도록 IDE 처럼 설정해보자. 우선, 테스트 파일을 생성한다.

const obj1 = {
name: "my-name",
arg: 99,
};

console.log(obj1);

LazyVim lang 활성화 해야하는데 JavaScript 만을 위한 것은 없고 LazyVim Lang TypeScript 으로 나와있다.

:LazyExtras 에서 lang.typescript 활성화한다.

그러면 JS 에서 심볼 등 언어 기능이 동작하는 것을 볼 수 있다.

  • <leader>c 에서 여러 코드 옵션 볼 수 있음
  • <lender>cs 으로 심볼 볼 수 있음

다음은 Debug 으로 LazyVim DAP Core 에 따라 :LazyExtras 에서 dap.core 활성화한다.

그러면 <leader>d 에서 여러 디버깅 옵션이 활성화 된 것을 볼 수 있다.

<leader>db 으로 BreakPoint 걸고

<leader>da 으로 시작할 수 있다.

빈 값 지정

VSCode 디버깅 레이아웃과 유사하게 왼쪽에서 local 스코프, 현재 메모리 상태 등 UI 를 확인할 수 있다.

<leader>dO 으로 Step Over 하면 console.log 가 실행되어 변수가 출력되는 것을 볼 수 있다.

VSCode 통합 기능

놀라운 것은 이 ConfigVSCode 에서도 사용할 수 있다는 것이다.

Vim 이 은총알(silver bullet)은 아니기에 Vim 을 좋아한다면 상황에 맞게 VSCode 에서는 vscode-neovim 확장, JetBrains는 IdeaVim 플러그인을 이용할 것이다.

VSCode에서 거의 네이티브로 지원되는 vscode-neovim 확장에서 사용할 수 있도록 기능을 제공한다. 해당 확장 문서에도 명시되어있다. 덕분에 LazyVim, VSCode 따로 conifg를 관리하지 않아도 된다. 또한, LazyVim 기능 중 VSCode에서 사용가능한 것만 활성화된다. 어떤 기능이 활성화 되는지는 vscode.lua 를 살펴보면 된다.

사용 방법은 :LazyExtras 으로 활성화하고, VSCode에서 vscode-neovim 확장을 설치해 사용하면 된다. VSCode에서 Neovim이 실행되는 경우 vim.g.vscode 변수가 할당되는데 해당 변수 값 유무에 따라 플러그인이 자동으로 활성화 된다.

마무리

Vim을 쓴다는 것부터 어느정도 고인물이라는 가정으로 문서화가 되어있다. 그래서 사용하려면 이해하는데 시간이 꽤 걸린다.

IDE 대신 Vim에 입문해보고 싶을때 나름의 진입 장벽이 있는데 이 글을 통해 조금의 도움이 되었으면 좋겠다.