Created
November 15, 2025 05:16
-
-
Save f2janyway/ec30f0a07812d6694b835b121c3b30b7 to your computer and use it in GitHub Desktop.
nvim lsp setting basic
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| -- =============================================== | |
| -- 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