Neovim(nvim) 설치 가이드 (Windows/macOS/Linux)
이 문서는 Windows, macOS, Linux 운영체제에서 Neovim을 설치하고, lazy.nvim
기반의 init.lua
설정 파일을 구성하는 방법을 안내합니다.
1. Neovim (nvim) 설치 방법
각 운영체제에 맞는 패키지 관리자를 사용하여 Neovim을 설치합니다.
1. Windows (Winget 사용)
Windows 10/11의 기본 패키지 관리자인 winget
을 사용하여 Neovim
을 설치하는 것이 가장 권장됩니다.
Windows Terminal 또는 명령 프롬프트(CMD)를 엽니다.
winget
명령어를 사용하여Neovim
을 설치합니다.1
winget install Neovim.Neovim
winget
은 대소문자를 구분하지 않지만, 정확한 패키지 ID는Neovim.Neovim
입니다.*
2. macOS (Homebrew 사용)
macOS에서는 패키지 관리자 Homebrew
를 사용합니다.
- Homebrew 설치: (미설치 시) 터미널에서 다음 명령어를 실행합니다.
1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Neovim
설치:brew
명령어를 실행합니다.1
brew install neovim
3. Linux (APT 또는 DNF 사용)
사용하시는 리눅스 배포판의 기본 패키지 관리자를 사용합니다.
- Ubuntu/Debian (APT):
1 2
sudo apt update sudo apt install neovim
- Fedora/CentOS (DNF):
1
sudo dnf install neovim
2. init.lua
설정 파일 위치
Neovim
은 설정을 사용자 홈 디렉터리 내의 특정 폴더에서 관리합니다. init.lua
파일은 다음 경로에 위치해야 합니다. vim
과의 호환성을 위해 init.vim
을 사용할 수도 있습니다. 이때는 vimscript를 이용해서 작성해야 합니다. 다만, 최근 Neovim
의 권장 방식은 init.lua
를 사용하는 것이므로, 여기서는 init.lua
만을 다룹니다.
운영체제 | 설정 디렉터리 | init.lua 전체 경로 (예시) |
---|---|---|
Linux/macOS | ~/.config/nvim/ | ~/.config/nvim/init.lua |
Windows | %USERPROFILE%\AppData\Local\nvim\ | C:\Users\Username\AppData\Local\nvim\init.lua |
만약 해당 설정 디렉터리(
nvim
폴더)가 없다면, 직접 생성해 주어야 합니다.
3. init.lua
설정 예시
이 파일은 lazy.nvim
플러그인 관리자를 사용하여 tokyonight
테마, lualine
상태 표시줄, nvim-tree
파일 탐색기, 그리고 LSP
, Mason
, nvim-cmp
등의 개발 환경 플러그인을 설정합니다.
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
-- 리더 키 설정 (모든 단축키의 시작점, <Space> 키로 지정)
vim.g.mapleader = " "
-- 기본적인 Neovim 옵션 설정
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.mouse = "a"
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.termguicolors = true
vim.opt.clipboard = "unnamedplus"
-- 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)
-- 플러그인 목록
local plugins = {
-- 테마
{ "folke/tokyonight.nvim", lazy = false, priority = 1000,
config = function()
vim.cmd.colorscheme "tokyonight"
end
},
-- 상태 표시줄
{ "nvim-lualine/lualine.nvim",
dependencies = { "nvim-tree/nvim-web-devicons" }
},
-- 파일 탐색기
{ "nvim-tree/nvim-tree.lua",
dependencies = { "nvim-tree/nvim-web-devicons" },
-- lazy.nvim이 단축키를 인식하도록 keys 설정
keys = {
{ "<leader>e", function() require("nvim-tree.api").tree.toggle({ focus = true }) end, desc = "Toggle NvimTree" }
},
config = function()
local api = require("nvim-tree.api")
-- NvimTree 자동 닫기 설정
vim.api.nvim_create_autocmd("BufEnter", {
nested = true,
callback = function()
if vim.bo.ft == "dps-tree" and #vim.api.nvim_list_wins() == 1 then
api.tree.close()
end
end
})
require("nvim-tree").setup({
sort_by = "case_sensitive",
view = {
width = 30,
},
renderer = {
group_empty = true,
},
filters = {
dotfiles = false,
},
})
end
},
-- LSP (Language Server Protocol)
{ "neovim/nvim-lspconfig",
dependencies = { "williamboman/mason.nvim", "williamboman/mason-lspconfig.nvim", "hrsh7th/cmp-nvim-lsp" },
config = function()
local opts = { noremap = true, silent = true }
local on_attach = function(client, bufnr)
-- 핵심 LSP 키 맵핑
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
vim.keymap.set('n', 'gr', require('telescope.builtin').lsp_references, opts)
vim.keymap.set('n', '<leader>f', function() vim.lsp.buf.format { async = true } end, opts)
end
local capabilities = require('cmp_nvim_lsp').default_capabilities()
require("mason").setup()
require("mason-lspconfig").setup({
ensure_installed = { "pyright", "ruff" },
handlers = {
-- [수정됨 ✅] 모든 LSP 서버에 대해 아래의 기본 설정을 자동으로 적용
function(server_name)
require("lspconfig")[server_name].setup({
on_attach = on_attach,
capabilities = capabilities,
})
end,
}
})
end
},
-- 자동 완성
{ "hrsh7th/nvim-cmp",
dependencies = { "hrsh7th/cmp-buffer", "hrsh7th/cmp-path" },
config = function()
local cmp = require("cmp")
cmp.setup({
sources = cmp.config.sources({{ name = "nvim_lsp" }, { name = "buffer" }, { name = "path" }}),
mapping = cmp.mapping.preset.insert({
['<C-Space>'] = cmp.mapping.complete(),
['<CR>'] = cmp.mapping.confirm({ select = true }),
['<C-e>'] = cmp.mapping.abort(),
}),
})
end
},
-- lazy.nvim: 필수
{ "folke/lazy.nvim", version = "*" }
}
-- lazy.nvim 구동
require("lazy").setup(plugins, {})
-- NeoVim의 커서 모양 변경을 완전히 비활성화, nvim 종료 후 커서 모양이 터미널 기본 커서로 복귀가 안되서 설정.
-- nvim에서 nvim의 커서모양으로 바뀌기 원하면 아랫줄을 삭제
vim.opt.guicursor = ""