Skip to content

Instantly share code, notes, and snippets.

@f2janyway
Created November 15, 2025 05:16
Show Gist options
  • Select an option

  • Save f2janyway/ec30f0a07812d6694b835b121c3b30b7 to your computer and use it in GitHub Desktop.

Select an option

Save f2janyway/ec30f0a07812d6694b835b121c3b30b7 to your computer and use it in GitHub Desktop.
nvim lsp setting basic
-- ===============================================
-- 1. 기본 Vim/Neovim 설정 (Options) ~/.config/nvim/init.lua
-- ===============================================
-- 시스템 클립보드 사용 활성화
vim.opt.clipboard = "unnamedplus"
-- 줄 번호 표시
vim.opt.number = true
-- 탭 관련 설정
vim.opt.tabstop = 4 -- 탭의 실제 너비를 4칸으로 설정
vim.opt.shiftwidth = 4 -- 자동 들여쓰기 너비를 4칸으로 설정
vim.opt.expandtab = true -- 탭 문자를 공백으로 변환
-- ===============================================
-- 자동 들여쓰기 관련 기본 옵션
-- ===============================================
-- 들여쓰기 스타일을 파일 타입에 맞게 자동으로 선택합니다.
vim.opt.autoindent = true
-- 파일 타입에 따라 스마트한 들여쓰기(예: C/Python 구문 인식)를 활성화합니다.
vim.opt.smartindent = true
-- ===============================================
-- 2. 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)
-- ===============================================
-- 3. 플러그인 로드 및 LSP 설정
-- ===============================================
require("lazy").setup({
{
-- nvim-lspconfig: LSP 서버의 기본 설정 파일 모음
'neovim/nvim-lspconfig',
dependencies = {
-- mason.nvim: LSP 서버 실행 파일을 쉽게 설치/관리
'williamboman/mason.nvim',
-- mason-lspconfig.nvim: mason과 lspconfig를 연결하여 자동 설정
'williamboman/mason-lspconfig.nvim',
},
config = function()
-- Mason 설치/설정
require('mason').setup()
-- Mason과 lspconfig 연결 설정
local lspconfig = require('lspconfig')
local mason_lspconfig = require('mason-lspconfig')
-- 모든 서버에 적용될 단축키 설정 함수
local on_attach = function(client, bufnr)
-- 버퍼 로컬 키맵을 생성합니다.
local buf_set_keymap = vim.api.nvim_buf_set_keymap
local opts = { noremap = true, silent = true }
-- 정의/선언 이동
buf_set_keymap(bufnr, 'n', 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>', opts)
buf_set_keymap(bufnr, 'n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<CR>', opts)
-- 마우스 오버 정보 (K)
buf_set_keymap(bufnr, 'n', 'K', '<cmd>lua vim.lsp.buf.hover()<CR>', opts)
-- 심볼 검색 (gW)
buf_set_keymap(bufnr, 'n', 'gW', '<cmd>lua vim.lsp.buf.workspace_symbol()<CR>', opts)
-- 코드 액션 (F8)
buf_set_keymap(bufnr, 'n', '<F8>', '<cmd>lua vim.lsp.buf.code_action()<CR>', opts)
-- 자동 완성 (C-x C-o)는 Insert 모드에서만 사용되므로 여기에 직접 설정할 필요 없음.
-- completion 플러그인 (nvim-cmp)이 없으면 수동으로:
-- vim.api.nvim_buf_set_keymap(bufnr, 'i', '<C-Space>', '<cmd>lua vim.lsp.buf.completion()<CR>', {silent = true})
end
mason_lspconfig.setup({
-- 이 리스트에 포함된 서버는 Neovim 시작 시 자동으로 설치됩니다.
ensure_installed = {
"lua_ls", -- Neovim 설정 파일용 Lua
"pyright", -- Python (가장 대중적인 서버)
"clangd", -- C/C++
"jdtls", -- Java
"ts_ls", -- JavaScript/TypeScript
"kotlin_language_server",
"rust_analyzer",
},
-- 설치된 모든 서버에 대해 nvim-lspconfig의 기본 설정을 적용합니다.
handlers = {
function(server_name)
-- lspconfig[server_name].setup({})가 서버를 활성화하는 핵심 코드입니다.
lspconfig[server_name].setup({
-- 여기에 모든 서버에 공통으로 적용할 설정을 넣을 수 있습니다.
on_attatch = on_attach
})
end,
-- 특정 언어에 대한 추가 설정은 여기에 넣을 수 있습니다. (예: lua_ls)
["lua_ls"] = function()
lspconfig.lua_ls.setup({
settings = {
Lua = {
runtime = { version = 'LuaJIT' }
}
}
})
end,
},
})
end
},
-- ... (기존 nvim-lspconfig 설정 블록은 그대로 둡니다.)
{
-- nvim-cmp: 자동 완성 관리자
'hrsh7th/nvim-cmp',
dependencies = {
-- LSP 소스 (LSP 서버의 추천 목록을 cmp에 제공)
'hrsh7th/cmp-nvim-lsp',
-- 스니펫 엔진 (완성 시 코드 조각 삽입 기능)
'L3MON4D3/LuaSnip',
-- LuaSnip 소스
'saadparwaiz1/cmp_luasnip',
},
config = function()
local cmp = require('cmp')
local luasnip = require('luasnip')
cmp.setup({
-- 스니펫 확장 설정
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
-- 자동 완성 키맵 설정 (핵심)
mapping = cmp.mapping.preset.insert({
-- ⭐ 자동 완성 메뉴 이동: j/k 대신 <C-n> / <C-p> 사용이 일반적입니다.
-- 메뉴가 떴을 때 <Down>(j 역할)이나 <Up>(k 역할)을 누르면 이동합니다.
['<Down>'] = cmp.mapping.select_next_item(),
['<Up>'] = cmp.mapping.select_prev_item(),
-- 전통적인 Vim 완성 키맵 (C-n: 다음, C-p: 이전)
['<C-n>'] = cmp.mapping.select_next_item(),
['<C-p>'] = cmp.mapping.select_prev_item(),
-- 엔터키: 선택된 항목을 확정
['<CR>'] = cmp.mapping.confirm({ select = true }),
-- 수동으로 완성 메뉴 띄우기
['<C-Space>'] = cmp.mapping.complete(),
}),
-- 자동 완성 소스 우선순위 설정
sources = cmp.config.sources({
{ name = 'nvim_lsp' }, -- LSP 서버가 제공하는 추천 목록
{ name = 'luasnip' }, -- 스니펫 목록
}, {
{ name = 'buffer' }, -- 현재 버퍼의 단어 목록
}),
-- 완성 메뉴 UI 설정
window = {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered(),
},
-- 최소 글자 수 설정 (1글자 입력 후 자동 완성 시작)
completion = {
completeopt = 'menu,menuone,preview,noselect',
},
})
end
},
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment