Neovim은 속도, 확장성, 그리고 완전한 키보드 기반 워크플로우를 원하는 개발자들에게 선택받는 터미널 에디터가 되었습니다. Neovim을 처음 접하시거나 Vim에서 전환하시는 분들을 위해, 2026년에 필요한 모든 필수 명령어를 이 치트 시트에 정리했습니다.
이 참고 자료는 작업별로 구성되어 있어 필요한 내용을 빠르게 찾을 수 있습니다.
# macOS
brew install neovim
# Ubuntu/Debian
sudo apt install neovim
# Arch Linux
sudo pacman -S neovim
# Windows (Scoop)
scoop install neovim
# 소스 코드로 설치 (최신 버전)
git clone https://github.com/neovim/neovim.git
cd neovim && make CMAKE_BUILD_TYPE=Release
sudo make install
버전 확인:
nvim --version
Neovim은 설정을 위해 Lua를 사용합니다 (.vimrc가 아님):
~/.config/nvim/init.lua
또는 전통적인 Vim 형식을 사용할 수도 있습니다:
~/.config/nvim/init.vim
Neovim에는 여러 모드가 있습니다. 이를 이해하는 것이 기본입니다:
| 모드 |
진입 키 |
목적 |
| Normal |
Esc 또는 Ctrl+[ |
탐색 및 명령어 실행 |
| Insert |
i, a, o |
텍스트 입력 및 편집 |
| Visual |
v, V, Ctrl+v |
텍스트 선택 |
| Command |
: |
Ex 명령어 실행 |
| Replace |
R |
텍스트 덮어쓰기 |
| Terminal |
:terminal |
내장 터미널 |
| 명령어 |
동작 |
h |
왼쪽으로 이동 |
j |
아래로 이동 |
k |
위로 이동 |
l |
오른쪽으로 이동 |
w |
다음 단어의 시작으로 점프 |
W |
다음 WORD(공백 기준) 시작으로 점프 |
b |
이전 단어의 시작으로 점프 |
B |
이전 WORD 시작으로 점프 |
e |
단어의 끝으로 점프 |
E |
WORD의 끝으로 점프 |
0 |
줄의 맨 앞으로 이동 |
^ |
줄의 첫 번째 공백이 아닌 문자로 이동 |
$ |
줄의 끝으로 이동 |
| 명령어 |
동작 |
gg |
파일의 첫 줄로 이동 |
G |
파일의 마지막 줄로 이동 |
{number}G |
특정 줄 번호로 이동 |
{ |
이전 문단으로 점프 |
} |
다음 문단으로 점프 |
% |
매칭되는 괄호로 점프 |
f{char} |
해당 문자를 찾아 앞으로 점프 |
F{char} |
해당 문자를 찾아 뒤로 점프 |
t{char} |
해당 문자 바로 직전까지 앞으로 점프 |
T{char} |
해당 문자 바로 다음까지 뒤로 점프 |
; |
마지막 f/F/t/T 이동 반복 |
, |
마지막 f/F/t/T 이동을 역방향으로 반복 |
Ctrl+d |
반 페이지 아래로 스크롤 |
Ctrl+u |
반 페이지 위로 스크롤 |
Ctrl+f |
한 페이지 아래로 스크롤 |
Ctrl+b |
한 페이지 위로 스크롤 |
zz |
현재 커서 줄을 화면 중앙으로 정렬 |
zt |
현재 커서 줄을 화면 상단으로 이동 |
zb |
현재 커서 줄을 화면 하단으로 이동 |
입력 모드 진입 (Insert Mode Entry)
| 명령어 |
동작 |
i |
커서 앞에서 삽입 |
I |
줄의 맨 앞부터 삽입 |
a |
커서 뒤에 추가 |
A |
줄의 끝에 추가 |
o |
아래에 새로운 줄 열기 |
O |
위에 새로운 줄 열기 |
s |
문자를 삭제하고 입력 모드 진입 |
S |
줄 전체를 삭제하고 입력 모드 진입 |
C |
커서부터 줄 끝까지 삭제하고 입력 모드 진입 |
| 명령어 |
동작 |
x |
커서 아래의 문자 삭제 |
X |
커서 앞의 문자 삭제 |
dd |
줄 전체 삭제 |
D |
커서부터 줄 끝까지 삭제 |
dw |
단어 삭제 |
d$ |
줄 끝까지 삭제 |
d0 |
줄 시작까지 삭제 |
yy |
줄 전체 복사(Yank) |
yw |
단어 복사 |
y$ |
줄 끝까지 복사 |
p |
커서 뒤에 붙여넣기 |
P |
커서 앞에 붙여넣기 |
u |
실행 취소 (Undo) |
Ctrl+r |
다시 실행 (Redo) |
. |
마지막 변경 사항 반복 |
r{char} |
단일 문자 교체 |
R |
교체 모드 진입 |
J |
현재 줄과 다음 줄 연결 |
~ |
대소문자 전환 |
>> |
들여쓰기 |
<< |
내어쓰기 |
== |
자동 들여쓰기 |
텍스트 오브젝트 (Text Objects)
텍스트 오브젝트는 Neovim의 가장 강력한 기능 중 하나입니다. d, c, y, v와 같은 연산자와 함께 사용하세요:
| 명령어 |
동작 |
diw |
단어 내부 삭제 |
daw |
단어 전체 삭제 (공백 포함) |
di" |
큰따옴표 안쪽 내용 삭제 |
da" |
큰따옴표를 포함하여 삭제 |
di( |
괄호 안쪽 내용 삭제 |
da( |
괄호를 포함하여 삭제 |
di{ |
중괄호 안쪽 내용 삭제 |
di[ |
대괄호 안쪽 내용 삭제 |
dit |
HTML/XML 태그 안쪽 내용 삭제 |
dip |
문단 내부 삭제 |
dap |
문단 전체 삭제 |
ci" |
큰따옴표 안쪽 내용 변경 |
ca( |
괄호 포함 내용 변경 |
vi{ |
중괄호 내부 비주얼 선택 |
yit |
태그 안쪽 내용 복사 |
| 명령어 |
동작 |
/{pattern} |
앞으로 검색 |
?{pattern} |
뒤로 검색 |
n |
검색 결과 다음으로 이동 |
N |
검색 결과 이전으로 이동 |
* |
커서 아래의 단어를 앞으로 검색 |
# |
커서 아래의 단어를 뒤로 검색 |
:%s/old/new/g |
파일 전체에서 모든 일치 항목 교체 |
:%s/old/new/gc |
확인 후 파일 전체 교체 |
:s/old/new/g |
현재 줄에서 모든 일치 항목 교체 |
:{range}s/old/new/g |
지정된 범위 내에서 교체 |
| 명령어 |
동작 |
v |
문자 단위 비주얼 모드 진입 |
V |
줄 단위 비주얼 모드 진입 |
Ctrl+v |
블록(열) 단위 비주얼 모드 진입 |
gv |
마지막 비주얼 선택 영역 다시 선택 |
o |
선택 영역의 반대쪽 끝으로 이동 |
> |
선택 영역 들여쓰기 |
< |
선택 영역 내어쓰기 |
= |
선택 영역 자동 들여쓰기 |
d |
선택 영역 삭제 |
y |
선택 영역 복사 |
c |
선택 영역 변경 |
U |
선택 영역 대문자로 변환 |
u |
선택 영역 소문자로 변환 |
| 명령어 |
동작 |
:e {file} |
새로운 버퍼에서 파일 열기 |
:ls |
모든 버퍼 목록 표시 |
:bn |
다음 버퍼로 이동 |
:bp |
이전 버퍼로 이동 |
:bd |
버퍼 삭제(닫기) |
:b {number} |
번호로 버퍼 이동 |
:b {name} |
이름 일부로 버퍼 이동 |
| 명령어 |
동작 |
:sp {file} |
가로로 창 분할 |
:vsp {file} |
세로로 창 분할 |
Ctrl+w s |
가로로 창 분할 |
Ctrl+w v |
세로로 창 분할 |
Ctrl+w h/j/k/l |
분할된 창 사이 이동 |
Ctrl+w H/J/K/L |
분할된 창을 가장자리로 이동 |
Ctrl+w = |
모든 창의 크기를 균등하게 조절 |
Ctrl+w _ |
현재 창 높이 최대화 |
Ctrl+w | |
현재 창 너비 최대화 |
Ctrl+w q |
분할 창 닫기 |
Ctrl+w o |
현재 창을 제외한 모든 창 닫기 |
| 명령어 |
동작 |
:tabnew {file} |
새로운 탭에서 파일 열기 |
:tabn 또는 gt |
다음 탭으로 이동 |
:tabp 또는 gT |
이전 탭으로 이동 |
:tabclose |
현재 탭 닫기 |
:tabonly |
현재 탭을 제외한 모든 탭 닫기 |
| 명령어 |
동작 |
:w |
파일 저장 |
:w {filename} |
다른 이름으로 저장 |
:wq 또는 ZZ |
저장 후 종료 |
:q |
종료 |
:q! 또는 ZQ |
저장하지 않고 강제 종료 |
:wa |
모든 버퍼 저장 |
:qa |
모든 창 종료 |
:qa! |
저장하지 않고 모든 창 강제 종료 |
:e! |
디스크의 파일 내용으로 다시 불러오기 |
| 명령어 |
동작 |
m{a-z} |
로컬 마크 설정 |
m{A-Z} |
글로벌 마크 설정 (여러 파일 간 공유) |
`{mark} |
마크 위치로 점프 (정확한 위치) |
'{mark} |
마크 위치로 점프 (줄 시작 부분) |
`` |
점프하기 전 마지막 위치로 복귀 |
Ctrl+o |
점프 목록의 이전 위치로 이동 |
Ctrl+i |
점프 목록의 다음 위치로 이동 |
| 명령어 |
동작 |
q{register} |
{register}(a-z)에 매크로 기록 시작 |
q |
기록 중지 |
@{register} |
매크로 실행 |
@@ |
마지막 실행한 매크로 다시 실행 |
{count}@{register} |
매크로를 N번 반복 실행 |
| 명령어 |
동작 |
"{register}y{motion} |
특정 레지스터로 복사 |
"{register}p |
특정 레지스터에서 붙여넣기 |
:reg |
모든 레지스터 확인 |
"0p |
(삭제가 아닌) 마지막에 복사한 내용 붙여넣기 |
"+y |
시스템 클립보드로 복사 |
"+p |
시스템 클립보드에서 붙여넣기 |
"_d |
레지스터에 저장하지 않고 삭제 (Black hole) |
Neovim은 내장 LSP를 지원합니다. 일반적인 키 바인딩(기본 또는 일반적인 설정):
-- init.lua LSP 키 바인딩 예시
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { desc = 'Go to definition' })
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, { desc = 'Go to declaration' })
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, { desc = 'Go to implementation' })
vim.keymap.set('n', 'gr', vim.lsp.buf.references, { desc = 'Find references' })
vim.keymap.set('n', 'K', vim.lsp.buf.hover, { desc = 'Hover documentation' })
vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, { desc = 'Rename symbol' })
vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, { desc = 'Code action' })
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Previous diagnostic' })
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Next diagnostic' })
vim.keymap.set('n', '<leader>f', function() vim.lsp.buf.format({ async = true }) end, { desc = 'Format' })
-- 줄 번호 표시
vim.opt.number = true
vim.opt.relativenumber = true
-- 들여쓰기
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.expandtab = true
vim.opt.smartindent = true
-- 검색
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.hlsearch = false
vim.opt.incsearch = true
-- 외관
vim.opt.termguicolors = true
vim.opt.signcolumn = "yes"
vim.opt.scrolloff = 8
vim.opt.wrap = false
-- 성능
vim.opt.updatetime = 250
vim.opt.timeoutlen = 300
-- Leader 키 설정
vim.g.mapleader = " "
vim.g.maplocalleader = " "
-- 클립보드
vim.opt.clipboard = "unnamedplus"
-- 창 분할 방향
vim.opt.splitright = true
vim.opt.splitbelow = true
-- 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)
require("lazy").setup({
-- Telescope (퍼지 파인더)
{ "nvim-telescope/telescope.nvim", dependencies = { "nvim-lua/plenary.nvim" } },
-- Treesitter (구문 강조)
{ "nvim-treesitter/nvim-treesitter", build = ":TSUpdate" },
-- LSP 설정
{ "neovim/nvim-lspconfig" },
-- 자동 완성
{ "hrsh7th/nvim-cmp" },
-- 파일 탐색기
{ "nvim-neo-tree/neo-tree.nvim" },
})
Telescope(가장 인기 있는 Neovim 퍼지 파인더)를 사용하는 경우:
| 명령어 |
동작 |
<leader>ff |
파일 찾기 |
<leader>fg |
Live grep (파일 내 텍스트 검색) |
<leader>fb |
버퍼 브라우징 |
<leader>fh |
도움말 태그 찾기 |
<leader>fr |
최근 열었던 파일 찾기 |
<leader>fd |
진단(Diagnostics) 확인 |
| 명령어 |
동작 |
:terminal |
현재 버퍼에서 터미널 열기 |
:sp | terminal |
가로 분할 창에서 터미널 열기 |
Ctrl+\\ Ctrl+n |
터미널 모드에서 일반 모드로 전환 |
i 또는 a |
일반 모드에서 다시 터미널 모드로 진입 |
| 명령어 |
동작 |
:!{command} |
쉘 명령어 실행 |
:r !{command} |
쉘 명령어 실행 결과를 커서 위치에 삽입 |
:r {file} |
파일 내용을 커서 위치에 삽입 |
:sort |
선택한 줄 정렬 |
:sort u |
정렬 및 중복 제거 |
:%!jq . |
jq를 사용하여 JSON 포맷팅 |
:noh |
검색 하이라이트 해제 |
:set spell |
맞춤법 검사 활성화 |
:checkhealth |
시스템 상태 점검 실행 |
Vim과 Neovim의 차이점은 무엇인가요?
Neovim은 내장 LSP 지원, Lua 스크립팅, 더 나은 기본값, 비동기 아키텍처를 갖춘 Vim의 현대화된 포크입니다. 대부분의 Vim 플러그인과 완벽하게 호환되면서도 내장 터미널 및 tree-sitter 통합과 같은 강력한 기능을 추가했습니다.
init.lua와 init.vim 중 무엇을 사용해야 하나요?
init.lua를 사용하세요. Lua는 더 빠르고 가독성이 좋으며, 모든 현대적인 Neovim 플러그인은 Lua를 사용합니다. Vimscript 형식도 여전히 작동하지만 레거시로 간주됩니다.
Neovim을 어떻게 종료하나요?
종료하려면 :q, 저장 후 종료하려면 :wq, 저장하지 않고 종료하려면 :q!를 입력하세요. ZZ(저장 후 종료) 또는 ZQ(저장하지 않고 종료) 단축키를 사용할 수도 있습니다.
이 치트 시트는 Neovim에서 매일 사용하게 될 핵심 명령어들을 다룹니다. 숙련의 핵심은 연습을 통해 "근육 기억(Muscle Memory)"을 형성하는 것입니다. 기본적인 이동과 편집부터 시작하여 점차 텍스트 오브젝트, 매크로, LSP 기능들을 워크플로우에 추가해 보세요.
AI 기반 애플리케이션을 개발하고 계시며 Neovim 터미널에서 직접 이미지, 동영상 또는 아바타를 생성하고 싶다면 Hypereal AI를 무료로 체험해 보세요 — 카드 등록 없이 35 크레딧을 제공합니다. 당사의 REST API는 curl이나 선호하는 모든 HTTP 클라이언트와 완벽하게 연동됩니다.