20260206 - Neovim 커스터마이징

Cursor IDE에서 VSCode Neovim 익스텐션을 사용해서 Neovim을 활성화해서 쓰고 있다.
이 익스텐션은 실제 Neovim 인스턴스를 백엔드로 사용하기 때문에 내 Neovim 설정이 그대로 적용된다.

Neovim을 쓰면서 적용한 설정들을 정리해봤다.
플러그인 관리는 lazy.nvim을 사용하고 있다.

설정 파일 구조

~/.config/nvim/
├── init.lua              # 메인 진입점
├── vimConfig.vim         # 기존 .vimrc 로드
├── lua/
│   ├── config/
│   │   └── lazy.lua      # lazy.nvim 부트스트랩
│   └── plugins/          # 플러그인별 설정
│       ├── camelcasemotion.lua
│       ├── dracula.lua
│       ├── hop.lua
│       ├── nvim-tree.lua
│       ├── vim-surround.lua
│       └── vim-visual-multi.lua

init.lua에서 기존 .vimrc 설정을 불러오고, lazy.nvim으로 플러그인들을 관리한다.

기본 설정 (.vimrc)

Leader 키

let g:mapleader = ','

Leader 키는 ,로 설정했다. 기본값인 \보다 누르기 편해서 이렇게 쓰고 있다.

블랙홀 레지스터 매핑

nnoremap d "_d
nnoremap s "_s
nnoremap c "_c
nnoremap x "_x
nnoremap X "_X

vnoremap p "_dP
vnoremap d "_d
vnoremap s "_s
vnoremap c "_c

vim의 기본 동작은 d, c, x 등으로 텍스트를 삭제하면 그게 기본 레지스터에 들어간다.
그래서 뭔가를 복사해두고 다른 텍스트를 지우면, 복사해둔 내용이 날아가버리는 문제가 있다.

위 설정으로 삭제 계열 명령어들이 블랙홀 레지스터("_)로 가게 해서 기본 레지스터를 오염시키지 않는다.
진짜로 잘라내기를 하고 싶으면 <leader>d로 가능하게 해뒀다.

map <leader>d "_dd

비주얼 모드 붙여넣기

vnoremap p "_dP

비주얼 모드에서 텍스트를 선택하고 p로 붙여넣기 할 때, 원래는 덮어쓴 텍스트가 레지스터에 들어간다.
이것도 블랙홀 레지스터로 보내서 원래 복사한 내용을 유지하게 했다.

클립보드 연동

set clipboard=unnamed,unnamedplus

시스템 클립보드와 vim 레지스터를 연동한다. y로 복사하면 바로 시스템 클립보드에도 들어간다.

탭/인덴트 설정

set tabstop=2
set softtabstop=2
set shiftwidth=2
set expandtab

탭은 2칸 스페이스로 설정. 요즘 프론트엔드 쪽에서 많이 쓰는 설정이다.

검색 설정

set ignorecase
set smartcase

검색할 때 기본적으로 대소문자 구분 안 함. 근데 검색어에 대문자가 포함되면 대소문자 구분함.

Yank 하이라이트

augroup highlight_yank
    autocmd!
    if exists('##TextYankPost')
        autocmd TextYankPost * silent! lua vim.highlight.on_yank({higroup="IncSearch", timeout=200})
    endif
augroup END

y로 복사할 때 복사된 영역이 잠깐 하이라이트된다. 뭐가 복사됐는지 시각적으로 확인할 수 있어서 좋다.

기타 키맵

map <leader>h :noh<CR>
map <leader>r :reg<CR>
map <leader>c m`gcc``
map <leader>v gv
map <leader>s %

플러그인

Dracula 테마

return {
  'dracula/vim',
  name = 'dracula',
  lazy = false,
  priority = 1000,
  config = function()
    vim.opt.termguicolors = true
    vim.cmd('colorscheme dracula')
  end
}

그냥 드라큘라 테마가 익숙해서 쓰고 있다.

CamelCaseMotion

return {
  {
    'bkad/CamelCaseMotion',
    config = function()
      vim.keymap.set({'n', 'o', 'x'}, 'w', '<Plug>CamelCaseMotion_w', { silent = true })
      vim.keymap.set({'n', 'o', 'x'}, 'b', '<Plug>CamelCaseMotion_b', { silent = true })
      vim.keymap.set({'n', 'o', 'x'}, 'e', '<Plug>CamelCaseMotion_e', { silent = true })
      vim.keymap.set({'n', 'o', 'x'}, 'ge', '<Plug>CamelCaseMotion_ge', { silent = true })
    end,
  }
}

w, b, e 키로 단어 단위 이동할 때 camelCase나 snake_case 기준으로 이동하게 해준다.
getSomeValue에서 w를 누르면 getSomeValue 이렇게 이동한다.
코드 편집할 때 상당히 유용함.

hop.nvim

return {
  'smoka7/hop.nvim',
  version = "*",
  config = function()
    local hop = require('hop')
    hop.setup({
      keys = 'etovxqpdygfblzhckisuran'
    })

    local directions = require('hop.hint').HintDirection
    vim.keymap.set('', 'f', function()
      hop.hint_char1({ direction = directions.AFTER_CURSOR, current_line_only = true })
    end, {remap=true})

    vim.keymap.set('', 'F', function()
      hop.hint_char1({ direction = directions.BEFORE_CURSOR, current_line_only = true })
    end, {remap=true})
  end
}

vim의 기본 f 키를 대체한다. f를 누르고 문자를 입력하면 해당 문자 위치에 힌트가 표시되고, 힌트 키를 누르면 바로 점프한다.
같은 줄에 동일한 문자가 여러 개 있어도 원하는 위치로 바로 갈 수 있어서 편하다.

vim-surround

return {
  'tpope/vim-surround',
}

괄호나 따옴표로 텍스트를 감싸거나 변경할 때 쓴다.

vim-visual-multi

return {
  'mg979/vim-visual-multi',
  branch = 'master',
  config = function()
    vim.g.VM_maps = {
      ['Find Under'] = '<C-n>',
      ['Find Subword Under'] = '<C-n>',
    }
  end
}

멀티 커서 플러그인. Ctrl+n으로 현재 단어와 같은 단어를 하나씩 선택해서 동시에 편집할 수 있다.
VSCode의 Cmd+d랑 비슷한 기능이다.

커스텀 키맵 (init.lua)

-- 특정 레지스터 내용을 클립보드로 복사
vim.keymap.set('n', '<leader>cr', function()
  local reg = vim.fn.nr2char(vim.fn.getchar())
  vim.fn.setreg('+', vim.fn.getreg(reg))
  print('Copied register "' .. reg .. '" to clipboard')
end, { desc = 'Paste register to clipboard' })

-- 클립보드 내용을 특정 레지스터로 복사
vim.keymap.set('n', '<leader>pr', function()
  local reg = vim.fn.nr2char(vim.fn.getchar())
  vim.fn.setreg(reg, vim.fn.getreg('+'))
  print('Pasted clipboard to register "' .. reg .. '"')
end, { desc = 'Paste clipboard to register' })

vim.keymap.set('n', '<leader>w', 'viw', { desc = 'Select inner word' })
vim.keymap.set('n', '<leader>x', 'dd', { desc = 'Cut current line' })

이 글은 Cursor CLI에서 Claude 에이전트에게 "neovim 설정을 정리해달라"고 요청하여 작성되었습니다.