Neovim

init.lua

_HelloWorld_ 2024. 10. 23. 13:02

Coc 지우기

-- 플러그인 설정
require('packer').startup(function(use)
  -- Packer 자체
  use 'wbthomason/packer.nvim'

	-- Theme
	use 'zaldih/themery.nvim'
	use "EdenEast/nightfox.nvim" -- Packer

  -- multiple-cursors 다중 커서 플러그인
  use 'terryma/vim-multiple-cursors'

  -- LSP Config
  use 'neovim/nvim-lspconfig'
	use 'jose-elias-alvarez/null-ls.nvim'
	use 'williamboman/mason.nvim'
	use 'williamboman/mason-lspconfig.nvim'

  -- Tailwind CSS IntelliSense LSP plugin
  use 'hrsh7th/nvim-compe'
  use 'hrsh7th/nvim-cmp'
  use 'hrsh7th/cmp-nvim-lsp'
  use 'hrsh7th/cmp-buffer'
  use 'hrsh7th/cmp-path'
  use 'hrsh7th/cmp-nvim-lua'
	use 'windwp/nvim-autopairs'  -- 자동 괄호 추가

  -- Prettier 플러그인
  use {'nvim-treesitter/nvim-treesitter', run = ':TSUpdate'}
  use {'prettier/vim-prettier', run = 'yarn install --frozen-lockfile --production'}

  -- 기타 플러그인
  use 'github/copilot.vim'
  use 'jeffkreeftmeijer/vim-numbertoggle'
  use 'majutsushi/tagbar'
  use 'preservim/nerdtree'
  use 'nanotech/jellybeans.vim'
  use 'morhetz/gruvbox'  -- 주석 처리된 다른 색상표
  use 'ronakg/quickr-cscope.vim'
  use 'ctrlpvim/ctrlp.vim'
  use 'svermeulen/vim-cutlass'
  use 'Shirk/vim-gas'

	use 'nvim-lualine/lualine.nvim' -- Airline alternative for lualine (optional)
	use 'vim-airline/vim-airline' -- Vim Airline
	use 'vim-airline/vim-airline-themes' -- Optional themes for airline
end)

-- Mason 및 LSP 설정
require('mason').setup()
require('mason-lspconfig').setup {
    -- ensure_installed = { 'gopls', 'ts_ls' },  -- 필요한 LSP 추가
}

local lspconfig = require('lspconfig')

-- gopls 설정
lspconfig.gopls.setup {
    cmd = { "gopls" },
    filetypes = { "go" },
    root_dir = lspconfig.util.root_pattern("go.mod", ".git"),
    settings = {
        gopls = {
            analyses = {
                unusedparams = true,
            },
            staticcheck = true,
        },
    },
}

-- LSP Config
lspconfig.ts_ls.setup {
    capabilities = capabilities,
}

lspconfig.tailwindcss.setup {
    capabilities = capabilities,
}

local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities.textDocument.completion.completionItem.snippetSupport = false  -- 스니펫 지원 비활성화

-- nvim-cmp 설정
local cmp = require'cmp'

cmp.setup {
    snippet = {
        expand = function(args)
            -- Snippet 확장을 위한 설정
        end,
    },
    mapping = {
        ['<C-n>'] = cmp.mapping.select_next_item(),
        ['<C-p>'] = cmp.mapping.select_prev_item(),
        ['<C-Space>'] = cmp.mapping.complete(),
        ['<CR>'] = cmp.mapping.confirm({ select = true }),
    },
    sources = {
        { name = 'nvim_lsp' },  -- LSP 소스 추가
        { name = 'buffer' },
        { name = 'path' },
        { name = 'nvim_lua' },
    },
}

-- nvim-treesitter 설정
require'nvim-treesitter.configs'.setup {
    ensure_installed = { "go", "typescript", "javascript", "tsx" },
    highlight = {
        enable = true,
        additional_vim_regex_highlighting = false,
    },
    indent = {
        enable = true
    },
    incremental_selection = {
        enable = true,
        keymaps = {
            init_selection = "<CR>",
            node_incremental = "<CR>",
            node_decremental = "<BS>",
            scope_incremental = "<TAB>",
        },
    },
}

-- vim-airline 설정
vim.cmd [[
    let g:airline#extensions#tabline#enabled = 1
    let g:airline_theme = 'luna'
    let g:airline_powerline_fonts = 1
]]
-- multiple-cursors 설정
vim.g.multi_cursor_use_default_mapping = 0
vim.g.multi_cursor_next_key = '<C-n>'
vim.g.multi_cursor_prev_key = '<C-p>'
vim.g.multi_cursor_skip_key = '<C-x>'
vim.g.multi_cursor_quit_key = '<Esc>'

-- C-n을 여러 번 누르기 힘들기 때문에 한 번에 동일한 문자열이 선택되게 설정
vim.api.nvim_set_keymap('n', '<C-n>', '<Plug>(multi_cursor_next)', { noremap = false, silent = true })

-- 파일에서 Prettier 실행
vim.api.nvim_set_keymap('n', '<leader>p', ':Prettier<CR>', { noremap = true, silent = true })

-- 비동기 방식으로 Prettier 실행
vim.api.nvim_set_keymap('n', '<leader>pa', ':PrettierAsync<CR>', { noremap = true, silent = true })

-- 단축키 지정
-- 편집 모드
vim.api.nvim_set_keymap('i', 'jk', '<ESC>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', 'kj', '<ESC>', { noremap = true, silent = true })

-- 명령 모드
-- <Ctrl + h, l>로 이전, 다음 탭으로 이동
vim.api.nvim_set_keymap('n', '<C-j>', ':tabprevious<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<C-k>', ':tabnext<CR>', { noremap = true, silent = true })

-- <Ctrl + j, k>로 이전, 다음 버퍼로 전환
vim.api.nvim_set_keymap('n', '<C-h>', ':bp<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<C-l>', ':bn<CR>', { noremap = true, silent = true })

-- <Shift + h, l>로 현재 버퍼 삭제
vim.api.nvim_set_keymap('n', '<S-h>', ':bp<bar>sp<bar>bn<bar>bd<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<S-l>', ':bp<bar>sp<bar>bn<bar>bd<CR>', { noremap = true, silent = true })

-- 우측 하단에 터미널 생성
vim.api.nvim_set_keymap('n', '<F2>', ':botright new<CR>:terminal<CR>:resize 10<CR>:set winfixheight<CR>:set nonu<CR>iLS_COLORS=$LS_COLORS:\'di=1;33:ln=36\'<CR>', { noremap = true, silent = true })

-- 터미널 모드
-- 터미널 모드에서 <Ctrl + w> 누르면 명령 모드로 전환
vim.api.nvim_set_keymap('t', '<C-w>', '<C-\\><C-n>', { noremap = true, silent = true })

-- 터미널 모드에서 jk 또는 kj를 누르면 <ESC>
vim.api.nvim_set_keymap('t', 'jk', '<ESC>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('t', 'kj', '<ESC>', { noremap = true, silent = true })

-- <ESC> 입력 시 <C-\><C-n> 실행
vim.api.nvim_set_keymap('t', '<ESC>', '<C-\\><C-n>', { noremap = true, silent = true })

-- 명령 및 비주얼 모드
-- iamroot 자동 주석
vim.api.nvim_set_keymap('n', '<F9>', '<ESC>o/*<CR> * IAMROOT, <C-R>=strftime("%Y.%m.%d")<CR>: <CR>*/<CR><ESC><UP><UP><END>', { noremap = true, silent = true })

-- vim 설정
-- 탭 정지 = 2칸
vim.o.tabstop = 2
-- 쉬프트 이동 거리 2칸
vim.o.shiftwidth = 2

-- 줄 번호 표시
vim.wo.number = true

-- 괄호 짝 강조
vim.o.showmatch = true

-- 하위 디렉터리 모두 path에 추가
vim.o.path = vim.o.path .. ',**'

-- 탐색 문자열 강조
vim.o.hlsearch = true

-- 항상 상단에 탭 라인 출력
vim.o.showtabline = 2
vim.o.tabpagemax = 10

if vim.fn.has('nvim') then
    vim.o.inccommand = 'nosplit'  -- nvim live substitute
end

-- vim과 OS의 클립보드 동기화
vim.o.clipboard = 'unnamedplus'

-- TrueColor 사용 가능
vim.o.termguicolors = true

-- 모든 마우스 기능 사용
vim.o.mouse = 'a'

-- viewoptions에서 options 제거
vim.o.viewoptions = vim.o.viewoptions:gsub('options', '')

-- 문법 강조
if vim.fn.has("syntax") then
    vim.cmd('syntax on')
end

-- 하이라이트 정의
vim.cmd [[
highlight Normal guibg=NONE
highlight EndOfBuffer guibg=NONE
highlight LineNr guibg=NONE gui=bold guifg=white
highlight ColorColumn guibg=White
]]

-- 함수 정의: tabsize를 size로 변경
function SetTab(size)
    vim.cmd("set shiftwidth=" .. size)
    vim.cmd("set tabstop=" .. size)
    vim.cmd("set softtabstop=" .. size)
end

-- tagbar 설정
vim.g.tagbar_position = 'right'

-- NERDTree 설정
vim.api.nvim_set_keymap('n', '<F1>', ':NERDTreeToggle<CR>:TagbarToggle<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<C-w>t', ':NERDTreeFocus<CR>', { noremap = true, silent = true })
vim.g.NERDTreeWinSize = 80

-- vim-cutlass 설정
vim.api.nvim_set_keymap('n', 'c', 'd', { noremap = true, silent = true })
vim.api.nvim_set_keymap('x', 'c', 'd', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'cc', 'dd', { noremap = true, silent = true })

-- 기본 네오빔 옵션
vim.o.list = true  -- 탭 문자가 표시되도록 list 옵션 활성화
vim.o.listchars = "tab:│ ,trail:·,extends:>,precedes:<"  -- 리스트 문자 설정

-- 탭 관련 설정
vim.o.expandtab = false  -- 탭 문자를 실제 탭 문자로 사용
vim.o.shiftwidth = 2      -- 자동 들여쓰기 시 사용할 공백 수
vim.o.tabstop = 2         -- 탭을 표시할 때 사용하는 공백 수

-- colorscheme 설정
vim.cmd("colorscheme nordfox")

'Neovim' 카테고리의 다른 글

[RockyOS9] Neovim typescript Tagbar 추가하기  (0) 2024.12.21