Vim은 1991년 Bram Moolenaar가 개발한 Vi IMproved의 약자로, 1976년 Bill Joy가 BSD Unix용으로 개발한 vi 에디터를 확장하고 개선한 텍스트 편집기이며, 문법 강조, 다중 실행 취소, 플러그인 지원, 분할 화면 등 현대적인 기능을 추가하면서도 vi의 핵심 철학인 모달 에디팅(modal editing)을 계승하여 키보드만으로 매우 빠른 편집이 가능하다. Vim은 거의 모든 Unix 계열 시스템에 기본 설치되어 있어 서버 관리에 필수적이고, SSH 환경에서 GUI 에디터 없이도 강력한 편집이 가능하며, 50년 가까이 축적된 커뮤니티 지식과 플러그인 생태계가 그 가치를 뒷받침한다.
Vim의 역사
Vi에서 Vim으로
Vi는 1976년 Bill Joy가 느린 터미널 환경에서 효율적으로 작동하도록 설계한 편집기로, 모달 에디팅 개념을 도입했다. Vim은 1991년 Bram Moolenaar가 vi를 확장하여 개발했으며, Vi IMproved(향상된 Vi)라는 이름 그대로 vi의 모든 기능을 포함하면서 현대적인 기능을 추가했다.
주요 발전 연혁
| 연도 | 이벤트 | 의미 |
|---|---|---|
| 1976 | vi 탄생 (Bill Joy) | BSD Unix용 텍스트 편집기로 모달 에디팅 도입 |
| 1991 | Vim 1.0 출시 (Bram Moolenaar) | Amiga용으로 개발, vi 호환성 유지하며 기능 확장 |
| 1998 | Vim 5.0 | 문법 강조, 스크립팅 언어 지원 |
| 2006 | Vim 7.0 | 탭 페이지, 철자 검사, 옴니 완성 기능 추가 |
| 2014 | Neovim 프로젝트 시작 | Vim fork로 비동기 플러그인, 내장 LSP 지원 |
| 2016 | Vim 8.0 | 비동기 작업, 터미널 창 지원 |
| 2023 | Bram Moolenaar 타계 | 커뮤니티 주도 개발로 전환 |
Vim vs Neovim
Neovim은 2014년 Vim의 코드베이스를 fork하여 시작된 프로젝트로, Vim의 레거시 코드를 정리하고 현대적인 아키텍처로 재설계하여 비동기 플러그인, 내장 LSP 클라이언트, Lua 스크립팅을 지원하며, 두 에디터 모두 활발히 개발되고 있고 기본 사용법은 거의 동일하다.
| 특성 | Vim | Neovim |
|---|---|---|
| 철학 | 전통적 안정성, 하위 호환성 | 현대적 혁신, 확장성 |
| 스크립팅 | Vimscript | Vimscript + Lua |
| 플러그인 | 동기 실행 중심 | 비동기 네이티브 지원 |
| LSP | 플러그인 필요 (coc.nvim 등) | 내장 LSP 클라이언트 |
| 기본 설정 | 최소한의 기본값 | 합리적인 기본 설정 |
| GUI 지원 | GVim | 다양한 GUI 프론트엔드 |
모달 에디팅의 철학
모달 에디팅(Modal Editing)이란?
모달 에디팅은 편집기의 동작을 여러 모드로 분리하여 같은 키가 모드에 따라 다른 기능을 수행하는 방식으로, 일반 에디터에서
j를 누르면 ‘j’ 문자가 입력되지만, Vim의 Normal 모드에서j를 누르면 커서가 아래로 이동한다.
모달 에디팅은 키보드의 모든 문자 키를 명령어로 활용할 수 있게 하여 Ctrl이나 Alt 같은 수식 키 없이도 수백 가지 명령을 간결하게 표현할 수 있고, 텍스트 입력과 편집을 명확히 분리하여 의도치 않은 텍스트 입력을 방지하며, 명령어들을 조합(composability)하여 복잡한 편집 작업을 간단히 표현할 수 있다. 초기 학습 곡선은 가파르지만, 기본 명령어 20-30개만 익히면 일상적인 편집이 가능하고 몇 달 후에는 기존 에디터보다 훨씬 빠른 편집 속도를 경험하게 된다.
왜 아직도 Vim을 사용하는가
| 이유 | 설명 |
|---|---|
| 서버 환경 | 거의 모든 Unix/Linux 시스템에 기본 설치, SSH에서 즉시 사용 가능 |
| 속도 | GUI 에디터보다 가볍고, 키보드 중심으로 마우스보다 빠름 |
| 범용성 | Vim 키 바인딩을 VS Code, JetBrains, 브라우저 등 다양한 도구에서 지원 |
| 커스터마이징 | 무한한 설정 가능성, 자신만의 워크플로우 구축 |
| 커뮤니티 | 50년간 축적된 지식, 튜토리얼, 플러그인 |
Vim 모드 개요
Vim은 네 가지 주요 모드로 동작하며, 각 모드는 서로 다른 목적을 위해 설계되었다.
| 모드 | 진입 방법 | 목적 | 종료 방법 |
|---|---|---|---|
| Normal | Esc 또는 Vim 시작 시 | 이동, 편집 명령 실행 | - |
| Insert | i, a, o 등 | 텍스트 입력 | Esc |
| Visual | v, V, Ctrl+v | 텍스트 선택 | Esc 또는 명령 실행 |
| Command | : | 파일 작업, 설정, 검색/치환 | Enter 또는 Esc |
Normal 모드
Normal 모드는 Vim의 핵심 모드로, Vim을 실행하면 기본적으로 이 모드에서 시작하며 대부분의 시간을 이 모드에서 보내게 된다.
이동 명령어
| 명령어 | 동작 | 설명 |
|---|---|---|
h, j, k, l | 왼쪽, 아래, 위, 오른쪽 | 기본 커서 이동 (화살표 대신 사용) |
w | 다음 단어 시작 | word의 약자 |
b | 이전 단어 시작 | back의 약자 |
e | 현재/다음 단어 끝 | end의 약자 |
0 | 줄 맨 앞 | 숫자 0 |
$ | 줄 맨 끝 | 정규표현식의 끝과 동일 |
^ | 줄의 첫 비공백 문자 | 정규표현식의 시작과 유사 |
gg | 파일 첫 줄 | go의 약자 |
G | 파일 마지막 줄 | 대문자 G |
{n}G | n번째 줄 | 예: 10G로 10번째 줄 이동 |
f{문자} | 현재 줄에서 해당 문자로 이동 | find의 약자 |
t{문자} | 해당 문자 직전까지 이동 | till(~까지)의 약자 |
% | 짝이 맞는 괄호로 이동 | (), {}, [] 간 이동 |
편집 명령어
| 명령어 | 동작 | 설명 |
|---|---|---|
x | 커서 위치 문자 삭제 | delete character |
r{문자} | 커서 위치 문자 교체 | replace |
dd | 현재 줄 삭제 | delete line |
yy | 현재 줄 복사 | yank line |
p | 커서 뒤에 붙여넣기 | paste after |
P | 커서 앞에 붙여넣기 | paste before |
u | 실행 취소 | undo |
Ctrl+r | 다시 실행 | redo |
. | 마지막 변경 반복 | 가장 강력한 명령어 중 하나 |
동작과 이동의 조합
Vim의 진정한 힘은 동작(operator)과 이동(motion)을 조합하는 데 있으며, {동작}{이동} 형식으로 다양한 편집 작업을 수행할 수 있다.
| 조합 | 의미 | 설명 |
|---|---|---|
dw | delete word | 커서부터 단어 끝까지 삭제 |
d$ | delete to end | 커서부터 줄 끝까지 삭제 |
d0 | delete to start | 줄 시작까지 삭제 |
diw | delete inner word | 단어 전체 삭제 |
daw | delete a word | 단어와 주변 공백 삭제 |
ci" | change inner quotes | 따옴표 안 내용 변경 |
ca( | change a parenthesis | 괄호 포함 내용 변경 |
yiw | yank inner word | 단어 복사 |
>} | indent to paragraph end | 문단까지 들여쓰기 |
Insert 모드
Insert 모드는 실제로 텍스트를 입력하는 모드로, 다양한 방법으로 진입할 수 있으며 각각 시작 위치가 다르다.
| 명령어 | 동작 | 설명 |
|---|---|---|
i | 커서 위치에서 입력 | insert |
a | 커서 다음 위치에서 입력 | append |
I | 줄 맨 앞에서 입력 | Insert at line start |
A | 줄 맨 뒤에서 입력 | Append at line end |
o | 아래에 새 줄 만들고 입력 | open line below |
O | 위에 새 줄 만들고 입력 | Open line above |
s | 문자 삭제 후 입력 | substitute character |
S | 줄 삭제 후 입력 | Substitute line |
c{이동} | 범위 삭제 후 입력 | change |
Insert 모드에서 Esc 키를 누르면 Normal 모드로 돌아가며, 많은 Vim 사용자들은 Esc 키가 멀어서 Caps Lock을 Esc로 매핑하거나 Ctrl+[ 또는 jk 같은 커스텀 매핑을 사용한다.
Visual 모드
Visual 모드는 텍스트를 시각적으로 선택하여 편집할 수 있는 모드로, 세 가지 타입이 있다.
| 명령어 | 선택 방식 | 용도 |
|---|---|---|
v | 문자 단위 | 일반적인 텍스트 선택 |
V | 줄 단위 | 전체 줄 선택 |
Ctrl+v | 블록 단위 | 직사각형 영역 선택 (다중 커서처럼 활용) |
Visual 모드에서 선택 후 사용할 수 있는 주요 명령어는 d(삭제), y(복사), c(변경), >(들여쓰기), <(내어쓰기), ~(대소문자 전환), u(소문자로), U(대문자로) 등이 있다.
Command 모드
Command 모드는 :로 시작하는 명령어를 입력하는 모드로, 파일 작업, 설정 변경, 검색/치환 등 다양한 작업을 수행한다.
파일 작업
| 명령어 | 동작 |
|---|---|
:w | 저장 |
:q | 종료 |
:wq 또는 :x | 저장 후 종료 |
:q! | 저장하지 않고 강제 종료 |
:e {파일} | 파일 열기 |
:w {파일} | 다른 이름으로 저장 |
설정 변경
| 명령어 | 동작 |
|---|---|
:set number | 줄 번호 표시 |
:set relativenumber | 상대 줄 번호 표시 |
:set tabstop=4 | 탭 크기 설정 |
:set expandtab | 탭을 스페이스로 변환 |
:syntax on | 문법 강조 활성화 |
검색과 치환
검색
Vim의 검색은 정규표현식을 지원하며 매우 강력하다.
| 명령어 | 동작 |
|---|---|
/패턴 | 아래로 검색 |
?패턴 | 위로 검색 |
n | 다음 결과 |
N | 이전 결과 |
* | 커서 위치 단어 검색 |
# | 커서 위치 단어 역방향 검색 |
치환
치환 명령어는 :s (substitute)를 사용하며, 범위와 플래그를 조합하여 다양한 치환을 수행할 수 있다.
| 명령어 | 동작 |
|---|---|
:s/old/new/ | 현재 줄 첫 번째 치환 |
:s/old/new/g | 현재 줄 모두 치환 |
:%s/old/new/g | 파일 전체 치환 |
:%s/old/new/gc | 확인하며 치환 |
:5,10s/old/new/g | 5-10줄 범위 치환 |
:'<,'>s/old/new/g | Visual 선택 범위 치환 |
플러그인 생태계
플러그인 매니저
Vim 플러그인 매니저 중 가장 인기 있는 것은 vim-plug로, 간결한 문법과 빠른 병렬 설치가 특징이며,
:PlugInstall명령으로 플러그인을 일괄 설치하고:PlugUpdate로 업데이트할 수 있다.
필수 플러그인
| 플러그인 | 기능 | 설명 |
|---|---|---|
| NERDTree | 파일 탐색기 | 사이드바 트리 구조로 파일 탐색 |
| fzf.vim | 퍼지 파인더 | 파일, 버퍼, 명령어 빠른 검색 |
| coc.nvim | 자동완성/LSP | VSCode 수준의 인텔리센스 |
| vim-airline | 상태바 | 모드, 파일명, Git 상태 표시 |
| vim-fugitive | Git 통합 | Vim 내에서 Git 명령 실행 |
| vim-surround | 감싸기 편집 | 괄호, 따옴표 등 쉽게 변경 |
| vim-commentary | 주석 토글 | gc로 주석 토글 |
vimrc 설정
vimrc는 Vim의 설정 파일로, ~/.vimrc (Unix) 또는 ~/_vimrc (Windows)에 위치하며, Vim 시작 시 자동으로 로드된다.
" 기본 설정
set nocompatible " vi 호환 모드 비활성화
set encoding=utf-8 " UTF-8 인코딩
set number " 줄 번호 표시
set relativenumber " 상대 줄 번호
syntax on " 문법 강조
set tabstop=4 " 탭 크기 4
set shiftwidth=4 " 들여쓰기 크기 4
set expandtab " 탭을 스페이스로
set autoindent " 자동 들여쓰기
set smartindent " 스마트 들여쓰기
set hlsearch " 검색 결과 강조
set incsearch " 점진적 검색
set ignorecase " 대소문자 무시
set smartcase " 대문자 입력 시 구분
set cursorline " 현재 줄 강조
set wildmenu " 명령어 자동완성 메뉴
set clipboard=unnamedplus " 시스템 클립보드 사용
" 리더 키 설정
let mapleader = " "
" 자주 쓰는 매핑
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
실전 팁
매크로
매크로는 반복 작업을 자동화하는 강력한 기능으로, q{레지스터}로 녹화를 시작하고 작업 수행 후 q로 종료한 다음, @{레지스터}로 재생하며 @@로 마지막 매크로를 반복할 수 있다.
분할 화면
| 명령어 | 동작 |
|---|---|
:sp 또는 :split | 가로 분할 |
:vs 또는 :vsplit | 세로 분할 |
Ctrl+w h/j/k/l | 창 이동 |
Ctrl+w = | 창 크기 균등 |
Ctrl+w _ | 현재 창 최대화 (가로) |
| `Ctrl+w | ` |
버퍼 관리
| 명령어 | 동작 |
|---|---|
:ls | 버퍼 목록 |
:bn | 다음 버퍼 |
:bp | 이전 버퍼 |
:b{n} | n번 버퍼로 이동 |
:bd | 버퍼 삭제 |
학습 방법
vimtutor는 Vim에 내장된 대화형 튜토리얼로, 터미널에서 vimtutor 명령어를 입력하면 실행되며 약 30분 정도 소요된다. 한글 버전도 지원되며(vimtutor ko), 기본 명령어를 직접 실습하면서 배울 수 있어 초보자에게 가장 좋은 학습 방법이다. 매일 조금씩 사용하면서 새로운 명령어를 하나씩 익히는 것이 효과적이며, Vim 키 바인딩은 VS Code(Vim 확장), JetBrains IDE(IdeaVim), 브라우저(Vimium) 등 다양한 도구에서 지원되므로 한 번 배우면 평생 활용할 수 있는 투자 가치가 높은 기술이다.
결론
Vim은 1976년 vi의 탄생 이후 50년 가까운 역사를 가진 텍스트 편집기로, 모달 에디팅이라는 독특한 철학을 통해 키보드만으로 매우 빠른 편집이 가능하며, 초기 학습 곡선은 가파르지만 익숙해지면 다른 어떤 에디터보다 효율적이다. 거의 모든 Unix/Linux 시스템에 기본 설치되어 있어 서버 환경에서 필수적이고, 플러그인과 설정을 통해 현대적인 IDE 수준의 기능을 갖출 수 있으며, Vim의 키 바인딩은 VS Code, JetBrains, 브라우저 등 다양한 도구에서 지원되어 한 번 배우면 평생 사용할 수 있는 기술이다.