Neovim 환경 구축하기 - lazy.nvim, tokyonight 테마 설정
최근 다양한 CLI 및 텍스트 편집기를 활용하는데, 이 과정에서 생산성을 높이고 효율적인 환경을 갖추기 위해 Neovim 에디터에 관심을 갖게 되었습니다. Neovim은 Vim과 호환되는 동시에 Lua 기반 설정을 통한 확장성과 편의성을 제공합니다.
이번 포스팅에서는 Neovim을 간단히 소개하고, 플러그인 매니저인 lazy.nvim과 아름다운 테마인 tokyonight를 연계하여 깔끔한 개발 환경을 만드는 방법을 다뤄보겠습니다. 추가로, 위에서 제시한 설정 파일(init.lua
)을 바탕으로 설정 방법을 간략히 정리하겠습니다.
Neovim이란?
Neovim은 Vim의 발전형 에디터로, Vimscript에 비해 더욱 현대적인 확장성과 성능을 제공합니다. 특히 Lua 언어를 통한 설정과 플러그인 관리, 그리고 내장 LSP 클라이언트 지원 등을 통해 IDE급 개발 환경을 쉽게 구축할 수 있습니다. 전통적인 Vim 사용자들에게는 익숙한 키 바인딩과 기능을 이어받으며도, 새로운 유저에게는 간결한 설정 파일 구조와 강력한 플러그인 생태계를 통해 강력한 편의성을 제공합니다.
Neovim의 특징
- Lua 기반 설정: Vimscript 대신 Lua를 통한 설정으로, 더 직관적이고 유지보수가 쉬운 설정 파일 관리 가능
- 내장 LSP 지원: 언어 서버 프로토콜(Language Server Protocol)을 통해 풍부한 코드 인텔리전스, 자동완성, 진단 지원 가능
- 플러그인 생태계: Lazy.nvim, Packer, Treesitter 등 다양한 Lua 기반 플러그인 매니저와 도구 활용 용이
- 성능 및 안정성 개선: Vim과 호환성을 유지하면서도 성능 최적화 및 비동기 기능 지원 강화
lazy.nvim이란?
플러그인 관리자는 Neovim 사용자에게 필수 요소 중 하나입니다. 기존에는 vim-plug
, packer.nvim
등이 주류였지만, 최근에는 lazy.nvim이 빠르게 인기를 얻고 있습니다.
lazy.nvim의 특징
- 속도 최적화: Neovim 시작 시 불필요한 플러그인 로드를 최소화하고, 이벤트나 조건에 따른 지연 로딩(laod)을 지원
- Lua 기반 설정: Lua 테이블 형식으로 플러그인을 선언, 설정, 의존성 관리가 용이
-
직관적인 설정 방식:
require("lazy").setup({ ... })
형태로 간단하게 플러그인 리스트와 설정을 모듈화
쉽게 말해, lazy.nvim을 사용하면 Neovim 실행 속도를 개선하고, 더 체계적으로 플러그인을 관리할 수 있습니다.
tokyonight 테마란?
tokyonight는 Neovim, VSCode, JetBrains IDE 등 다양한 에디터에서 사용할 수 있는 고급스럽고 차분한 다크 테마입니다. Neovim에서 tokyonight 테마를 사용하면 다음과 같은 이점을 얻을 수 있습니다.
- 고대비 & 눈에 편한 색상 팔레트: 긴 시간의 개발에도 눈의 피로도를 줄여줌
-
다양한 변형(theme style) 지원:
night
,storm
,day
,moon
등 다양한 스타일로 취향에 맞게 선택 가능 - LSP, Treesitter, Statusline 등 다양한 플러그인과 호환: 에디터의 UI 요소를 테마와 자연스럽게 통일
tokyonight 테마는 단순히 색상만 변경하는 것이 아니라, 코드 가독성과 UI 일관성을 모두 챙겨주는 훌륭한 선택지입니다.
설정 예제 (init.lua)
아래는 제가 사용하고 있는 init.lua
설정 파일입니다. 이 설정에서는 lazy.nvim
을 통해 tokyonight
테마와 nerdtree
, lualine
등의 플러그인을 설치 및 관리합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
-- ~/.config/nvim/init.lua
vim.g.mapleader = " " -- 리더 키를 스페이스로 설정 (lazy.nvim 설정 전에 필요)
-- 기존 설정 유지
vim.opt.number = true -- 줄 번호 표시
vim.opt.autoindent = true -- 자동 들여쓰기
vim.opt.tabstop = 2 -- 탭 크기
vim.opt.shiftwidth = 2 -- 자동 들여쓰기 크기
vim.opt.smarttab = true -- 스마트 탭
vim.opt.softtabstop = 2 -- 편집할 때 탭 크기
vim.opt.termguicolors = true -- 터미널 색상 지원
vim.opt.mouse = ""
-- lazy.nvim 설치
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable",
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
-- 핵심 플러그인 설치
require("lazy").setup({
-- 테마
{
"folke/tokyonight.nvim",
lazy = false,
priority = 1000,
config = function()
vim.cmd[[colorscheme tokyonight]]
end,
},
-- auto-pairs
{ "jiangmiao/auto-pairs", lazy = false},
-- NERDTree 파일 탐색기
{
"preservim/nerdtree",
lazy = false,
config = function()
-- NERDTree 단축키 매핑
vim.api.nvim_set_keymap('n', '<C-n>', ':NERDTree<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<C-t>', ':NERDTreeToggle<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<C-f>', ':NERDTreeFind<CR>', { noremap = true, silent = true })
end,
},
-- NERDTree 관련 플러그인 추가
{ "Xuyuanp/nerdtree-git-plugin", lazy = false, dependencies = { "preservim/nerdtree" } },
{ "ryanoasis/vim-devicons", lazy = false },
{ "tiagofumo/vim-nerdtree-syntax-highlight", lazy = false, dependencies = { "preservim/nerdtree" } },
{ "nvim-web-devicons", lazy = false },
{ 'nvim-lualine/lualine.nvim', dependencies = { 'nvim-web-devicons' }, config = function()
require('lualine').setup {
options = { theme = 'tokyonight', icons_enabled = true }
}
end
},
-- Terraform 플러그인 추가
{
"hashivim/vim-terraform",
lazy = false,
config = function()
-- Terraform 파일 자동 포맷팅 설정
vim.g.terraform_fmt_on_save = 1
vim.g.terraform_align = 1
end,
},
-- Comment 플러그인
{
"numToStr/Comment.nvim",
lazy = false,
config = function()
require("Comment").setup()
end,
},
})
vim.g.NERDTreeShowIcons = 1
vim.g.WebDevIconsUnicodeDecorateFileNodes = 1
vim.g.WebDevIconsUnicodeDecorateFolderNodes = 1
require'nvim-web-devicons'.setup { default = true }
-- 기본 키매핑
local map = vim.keymap.set
local opts = { noremap = true, silent = true }
-- Ctrl + / 주석 처리 매핑
map('n', '<C-_>', '<Plug>(comment_toggle_linewise_current)', opts)
map('v', '<C-_>', '<Plug>(comment_toggle_linewise_visual)', opts)
-- 창 이동
map('n', '<C-h>', '<C-w>h', opts)
map('n', '<C-j>', '<C-w>j', opts)
map('n', '<C-k>', '<C-w>k', opts)
map('n', '<C-l>', '<C-w>l', opts)
적용 방법
-
Neovim 설치
- Ubuntu:
sudo apt install neovim
- macOS(Homebrew):
brew install neovim
Neovim 버전은 0.8 이상을 권장합니다.
- Ubuntu:
-
환경 디렉토리 생성
1
mkdir -p ~/.config/nvim
이후 위의
init.lua
파일을~/.config/nvim/init.lua
경로에 저장합니다. -
Neovim 실행
1
nvim
첫 실행 시
init.lua
내 스크립트가 동작하며, lazy.nvim이 없으면 자동으로 clone하여 설치합니다. 이후 지정한 플러그인들이 자동 설치됩니다. -
테마 & 플러그인 동작 확인
tokyonight 테마가 적용된 UI를 확인하고,<leader>e
로 Neo-tree를 열어보거나 상태라인(lualine)의 아이콘, 색상이 잘 나오는지 테스트합니다.
궁금하신 점이나 추가해야 할 부분은 댓글이나 아래의 링크를 통해 문의해주세요.
Written with KKam._.Ji