Vim에서 Neovim으로 전향한 이유

VSCode에서 Vim extension을 오랫동안 사용해왔습니다. Vim의 강력한 편집 기능을 VSCode에서도 사용할 수 있다는 점은 매우 매력적이었죠. 하지만 한 가지 치명적인 문제가 있었습니다. 바로 한글 입력 시 타이밍이 밀리는 현상이었습니다.

한글을 빠르게 타이핑하다 보면 글자가 제대로 입력되지 않거나, 입력 순서가 뒤바뀌는 등의 문제가 자주 발생했습니다. 이는 작업 효율성을 크게 떨어뜨렸고, 결국 대안을 찾게 되었습니다. 그 대안이 바로 VSCode Neovim Extension입니다.

Neovim Extension은 실제 Neovim 프로세스를 백그라운드에서 실행하여 VSCode와 통신하는 방식으로 작동합니다. 이로 인해 Vim extension보다 더 안정적이고, 한글 입력 문제도 해결되었습니다.

macOS에서 Neovim 설치하기

1. Homebrew를 통한 설치

macOS에서는 Homebrew를 통해 쉽게 Neovim을 설치할 수 있습니다.

# Homebrew가 설치되어 있지 않다면 먼저 설치
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Neovim 설치
brew install neovim

2. 설치 확인

nvim --version

정상적으로 설치되었다면 Neovim 버전 정보가 출력됩니다.

Windows에서 Neovim 설치하기

1. Chocolatey를 통한 설치

Windows에서는 Chocolatey 패키지 매니저를 사용하는 것이 가장 간편합니다.

# PowerShell을 관리자 권한으로 실행 후
# Chocolatey가 설치되어 있지 않다면 먼저 설치
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

# Neovim 설치
choco install neovim

2. Scoop을 통한 설치 (대안)

Scoop을 선호한다면 다음과 같이 설치할 수 있습니다.

# Scoop 설치
iwr -useb get.scoop.sh | iex

# Neovim 설치
scoop install neovim

3. 수동 설치

공식 GitHub 릴리즈 페이지에서 직접 다운로드할 수도 있습니다.

  1. Neovim GitHub Releases에서 최신 Windows 버전 다운로드
  2. zip 파일 압축 해제
  3. 시스템 환경 변수 PATH에 nvim.exe가 있는 폴더 경로 추가

VSCode Neovim Extension 설치 및 설정

1. Extension 설치

VSCode Extension 마켓플레이스에서 “vscode-neovim"을 검색하여 설치합니다.

2. Extension 설정

settings.json에 다음 설정을 추가합니다:

{
  // Neovim 실행 파일 경로 (필요한 경우)
  "vscode-neovim.neovimExecutablePaths.darwin": "/opt/homebrew/bin/nvim",
  "vscode-neovim.neovimExecutablePaths.win32": "C:\\tools\\neovim\\nvim-win64\\bin\\nvim.exe",
  
  // 기타 유용한 설정
  "vscode-neovim.neovimInitVimPaths.darwin": "$HOME/.config/nvim/init.lua",
  "vscode-neovim.neovimInitVimPaths.win32": "$HOME/AppData/Local/nvim/init.lua"
}

Neovim 설정 파일 작성

1. 설정 파일 위치

  • macOS/Linux: ~/.config/nvim/init.lua
  • Windows: ~/AppData/Local/nvim/init.lua

2. 기본 설정 파일 생성

# macOS/Linux
mkdir -p ~/.config/nvim
touch ~/.config/nvim/init.lua

# Windows (PowerShell)
New-Item -Path "$env:LOCALAPPDATA\nvim" -ItemType Directory -Force
New-Item -Path "$env:LOCALAPPDATA\nvim\init.lua" -ItemType File -Force

3. Packer 플러그인 매니저 설치

Neovim의 플러그인을 관리하기 위해 Packer를 먼저 설치해야 합니다:

# macOS/Linux
git clone --depth 1 https://github.com/wbthomason/packer.nvim \
  ~/.local/share/nvim/site/pack/packer/start/packer.nvim

# Windows (PowerShell)
git clone --depth 1 https://github.com/wbthomason/packer.nvim `
  "$env:LOCALAPPDATA\nvim-data\site\pack\packer\start\packer.nvim"

4. init.lua 작성

다음은 제가 사용하는 init.lua 설정입니다:

-- Packer 설치 (플러그인 매니저)
local ensure_packer = function()
  local fn = vim.fn
  local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim'
  if fn.empty(fn.glob(install_path)) > 0 then
    fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path})
    vim.cmd [[packadd packer.nvim]]
    return true
  end
  return false
end

local packer_bootstrap = ensure_packer()

-- 플러그인 설정
require('packer').startup(function()
  use 'wbthomason/packer.nvim'
  use {
    'phaazon/hop.nvim',
    branch = 'v2', -- 안정적인 v2 브랜치 사용
    config = function()
      require'hop'.setup { keys = 'etovxqpdygfblzhckisuran' }
    end
  }
end)

-- OS별 클립보드 설정
if vim.fn.has('win32') == 1 then
  vim.opt.clipboard = "unnamed,unnamedplus"
elseif vim.fn.has('macunix') == 1 then
  vim.opt.clipboard = "unnamedplus"
end

vim.g.mapleader = ","        -- Leader 키 설정
require('hop').setup()       -- hop 설정

-- hop이 설치되었는지 확인 후 키맵 설정
local hop_ok, hop = pcall(require, 'hop')
local opts = { noremap = true, silent = true }

if hop_ok then
  vim.keymap.set('n', '<leader><leader>f', ':HopWord<CR>', opts)
  vim.keymap.set('n', '<leader><leader>w', ':HopWordAC<CR>', opts)
  vim.keymap.set('n', '<leader><leader>b', ':HopWordBC<CR>', opts)
  vim.keymap.set('n', '<leader><leader>j', ':HopLineAC<CR>', opts)
  vim.keymap.set('n', '<leader><leader>k', ':HopLineBC<CR>', opts)
end

-- Y를 누르면 라인 yank가 되도록 설정
vim.keymap.set('n', 'Y', 'yy', { noremap = true })

-- Visual Block 모드를 위한 여러 키 바인딩
vim.api.nvim_set_keymap('n', '<C-q>', '<C-v>', opts)
vim.api.nvim_set_keymap('v', '<C-q>', '<C-v>', opts)

-- 추가 대안 (leader 키 사용)
vim.keymap.set('n', '<leader>v', '<C-v>', opts)

-- 상태라인에 모드 표시 (선택사항)
vim.opt.showmode = true)

5. 플러그인 설치

init.lua 파일을 작성한 후, Neovim을 실행하여 플러그인을 설치해야 합니다:

# Neovim 실행
nvim

# Neovim 내에서 다음 명령어 입력
:PackerInstall

처음 실행 시 Packer가 자동으로 설치되며, 이후 hop.nvim을 포함한 설정된 플러그인들이 설치됩니다. 설치가 완료되면 Neovim을 재시작하세요.

hop.nvim 플러그인 사용법

왜 hop.nvim인가?

VSCode의 Vim Extension을 사용할 때는 EasyMotion이라는 훌륭한 기능이 내장되어 있었습니다. 하지만 Neovim Extension으로 전환하면서 이 기능이 없어진 것을 발견했습니다. EasyMotion은 화면에 보이는 텍스트로 빠르게 이동할 수 있게 해주는 필수적인 기능이었기에, 이를 대체할 플러그인이 필요했습니다.

hop.nvim은 EasyMotion의 Neovim 버전으로, 동일한 기능을 제공합니다. 화면의 특정 위치로 빠르게 이동할 수 있게 해주는 이 플러그인은 생산성 향상에 큰 도움이 됩니다.

사용법

  • ,,f: 화면의 모든 단어로 점프
  • ,,w: 커서 이후의 단어로 점프
  • ,,b: 커서 이전의 단어로 점프
  • ,,j: 아래쪽 라인으로 점프
  • ,,k: 위쪽 라인으로 점프

키맵 및 클립보드 설정 설명

Leader 키

,를 Leader 키로 설정했습니다. 이는 사용자 정의 단축키의 prefix로 사용됩니다.

클립보드 통합

OS별로 시스템 클립보드와 Neovim의 클립보드를 통합했습니다. 이제 y로 복사한 내용을 다른 프로그램에서도 붙여넣을 수 있습니다.

Visual Block 모드

일부 터미널에서 Ctrl+V가 붙여넣기로 사용되는 경우를 위해 Ctrl+Q를 Visual Block 모드로 매핑했습니다.

마무리

VSCode Neovim Extension을 사용하면 Vim의 강력한 기능을 VSCode에서 안정적으로 사용할 수 있습니다. 특히 한글 입력 문제가 해결되어 한국어로 작업하는 개발자들에게 큰 도움이 될 것입니다.

설정이 완료되면 VSCode를 재시작하고, Neovim의 모든 기능을 VSCode에서 즐기세요!