본문 바로가기
  • AI 시대에 적응하는 현대인을 위한 지식 공간
  • AI를 위한 데이터를 과학으로 역어본다
AI 코딩

vi/vim 명령어 참조 사전

by 피크나인 2025. 10. 24.

Vi/Vim 명령어 완벽 가이드 - 개발자를 위한 빠른 참조 사전

Vi/Vim은 Unix 및 Linux 시스템에서 가장 강력하고 널리 사용되는 텍스트 에디터입니다. 처음에는 어렵게 느껴질 수 있지만, 한번 익숙해지면 마우스 없이도 놀라운 속도로 텍스트를 편집할 수 있습니다. 이 가이드는 Vi/Vim의 모든 명령어를 빠르게 찾아볼 수 있도록 사전 형식으로 구성하였습니다. 각 명령어는 설명과 실제 사용 예시와 함께 제공되므로 초보자부터 숙련된 개발자까지 언제든지 참고할 수 있습니다. Vim은 모드 기반 에디터이므로, 각 모드에서 사용할 수 있는 명령어들을 체계적으로 분류하여 정리하였습니다.

 

"모드 기반 편집은 손이 키보드 중앙을 떠나지 않게 하며,
조합 가능한 명령어로  무한한 가능성을 제공하고,
반복 가능한 동작은 생산성을 극대화합니다."

 

vim 에디터 사용자는 대부분 Neovim을 사용하고 있습니다. ❘ https://neovim.io/
vim 에디터 사용자는 대부분 Neovim을 사용하고 있습니다. ❘ https://neovim.io/


1. Vim의 기본 개념과 모드  |  Mode change

Vim은 모드 기반 에디터로, 각 모드에서 키보드 입력이 다른 의미를 가집니다. 일반 모드에서는 커서 이동과 편집 명령을 실행하고, 입력 모드에서는 실제 텍스트를 입력하며, 명령 모드에서는 파일 저장이나 종료 같은 작업을 수행합니다. 이러한 모드 구분이 처음에는 혼란스러울 수 있지만, 익숙해지면 매우 효율적인 편집 환경을 제공합니다. 비주얼 모드는 텍스트를 선택하여 일괄 작업할 때 사용하며, 현대적인 에디터의 드래그 선택과 유사합니다.

모드 설명 진입 탈출
Normal Mode (일반 모드) 기본 모드, 커서 이동 및 편집 명령 실행 Vim 시작 시 기본 -
Insert Mode (입력 모드) 텍스트 입력 모드 i, a, o 등 ESC 또는 Ctrl+[
Visual Mode (비주얼 모드) 텍스트 선택 모드 v, V, Ctrl+v ESC
Command Mode (명령 모드) 파일 저장, 종료 등의 명령 실행 : ESC 또는 Enter
Replace Mode (교체 모드) 기존 텍스트 덮어쓰기 R ESC

모드 확인 방법

# 현재 모드는 Vim 하단에 표시됩니다
-- INSERT --        # 입력 모드
-- VISUAL --        # 비주얼 모드
-- VISUAL LINE --   # 비주얼 라인 모드
-- VISUAL BLOCK --  # 비주얼 블록 모드
-- REPLACE --       # 교체 모드
(표시 없음)         # 일반 모드

2. Vim 실행 및 종료  |  Start and End

Vim을 실행하고 종료하는 기본 명령어들입니다. 파일을 열거나 특정 위치에서 시작할 수 있으며, 변경사항을 저장하거나 버리고 종료하는 다양한 옵션이 있습니다. 강제 종료 명령은 변경사항을 저장하지 않으므로 주의해야 하며, 여러 파일을 동시에 열어 작업할 수도 있습니다.

명령어 설명 예시
vim Vim 실행 (빈 파일) vim
vim 파일명 특정 파일 열기 vim index.html
vim +n 파일명 n번째 줄에서 파일 열기 vim +25 app.js
vim + 파일명 파일의 마지막 줄에서 열기 vim + README.md
vim +/pattern 파일명 패턴이 처음 나오는 곳에서 열기 vim +/function main.js
vim -R 파일명 읽기 전용 모드로 열기 vim -R config.ini
view 파일명 읽기 전용 모드로 열기 (vim -R과 동일) view data.txt
vim -o 파일1 파일2 수평 분할로 여러 파일 열기 vim -o file1.txt file2.txt
vim -O 파일1 파일2 수직 분할로 여러 파일 열기 vim -O file1.txt file2.txt
vim -p 파일1 파일2 탭으로 여러 파일 열기 vim -p *.js
vim -d 파일1 파일2 Diff 모드로 열기 vim -d old.txt new.txt
vimdiff 파일1 파일2 Diff 모드로 열기 (vim -d와 동일) vimdiff v1.js v2.js

종료 명령어 (명령 모드에서 입력)

명령어 설명
:q 종료 (변경사항 없을 때)
:q! 강제 종료 (변경사항 버림)
:wq 저장 후 종료
:wq! 강제 저장 후 종료
:x 변경사항이 있으면 저장 후 종료
ZZ 저장 후 종료 (:x와 동일, 일반 모드)
ZQ 저장하지 않고 종료 (:q!와 동일, 일반 모드)
:qa 모든 창 종료
:qa! 모든 창 강제 종료
:wqa 모든 파일 저장 후 종료

Vim 실행 예시

# 기본 실행
vim

# 파일 열기
vim myfile.txt

# 특정 줄 번호에서 열기
vim +50 largefile.log

# 마지막 줄에서 열기
vim + error.log

# 특정 패턴 검색하여 열기
vim +/TODO todo.txt

# 여러 파일 수평 분할로 열기
vim -o file1.js file2.js file3.js

# 여러 파일 탭으로 열기
vim -p *.html

# 두 파일 비교 (diff)
vimdiff original.txt modified.txt

# 읽기 전용으로 열기
vim -R important.conf

3. 입력 모드 진입  |  Insert Mode

일반 모드에서 입력 모드로 전환하는 명령어들입니다. 각 명령어는 커서의 위치를 다르게 설정하여 입력을 시작하므로, 상황에 맞는 명령어를 선택하면 편집 효율이 높아집니다. 입력 모드에서는 일반적인 텍스트 에디터처럼 글자를 입력할 수 있으며, ESC 키를 눌러 다시 일반 모드로 돌아갑니다.

명령어 설명
i 커서 앞에서 입력 시작 (insert)
I 현재 줄의 맨 앞(첫 문자)에서 입력 시작
a 커서 뒤에서 입력 시작 (append)
A 현재 줄의 맨 뒤에서 입력 시작
o 현재 줄 아래에 새 줄 추가하고 입력 시작 (open below)
O 현재 줄 위에 새 줄 추가하고 입력 시작 (open above)
s 현재 문자 삭제하고 입력 시작 (substitute)
S 현재 줄 삭제하고 입력 시작
C 커서부터 줄 끝까지 삭제하고 입력 시작 (change to end)
cc 현재 줄 삭제하고 입력 시작 (S와 동일)
gi 마지막으로 입력했던 위치에서 입력 시작
gI 현재 줄의 맨 앞(공백 포함)에서 입력 시작

입력 모드 활용 예시

# 시나리오 1: 단어 중간에 글자 추가
현재: "Helo World"
커서: e 위치
명령: a
결과: "He|lo" 상태에서 입력 모드 시작 → "Hello World"

# 시나리오 2: 줄 끝에 세미콜론 추가
현재: "let x = 10"
명령: A
결과: "let x = 10|" 상태에서 입력 → "let x = 10;"

# 시나리오 3: 새 함수 추가
현재 줄: "function foo() {"
명령: o
결과: 다음 줄에 새 줄 생성되어 입력 시작

# 시나리오 4: 주석 추가
현재 줄: "코드 라인"
명령: O
결과: 위에 새 줄 생성되어 입력 시작 → "// 주석" 추가 가능

# 시나리오 5: 잘못된 단어 수정
현재: "wrnog word"
커서: w 위치
명령: cw (단어 변경)
결과: "wrnog" 삭제되고 입력 모드 시작 → "wrong word"

4. 커서 이동  |  Navigation

Vim에서 커서를 이동하는 것은 가장 기본적이고 중요한 작업입니다. 화살표 키도 사용할 수 있지만, h, j, k, l 키를 사용하면 홈 포지션에서 손을 떼지 않고 빠르게 이동할 수 있습니다. 단어, 줄, 문단, 화면 단위로 이동하는 다양한 명령어를 익히면 편집 속도가 크게 향상됩니다. 숫자와 조합하여 반복 횟수를 지정할 수도 있습니다.

기본 커서 이동

명령어 설명
h 왼쪽으로 한 칸 이동
j 아래로 한 줄 이동
k 위로 한 줄 이동
l 오른쪽으로 한 칸 이동
← ↓ ↑ → 화살표 키로 이동 (h, j, k, l과 동일)
0 현재 줄의 맨 앞으로 이동 (공백 포함)
^ 현재 줄의 첫 문자로 이동 (공백 제외)
$ 현재 줄의 맨 뒤로 이동
gg 파일의 맨 처음 줄로 이동
G 파일의 마지막 줄로 이동
nG n번째 줄로 이동 (예: 50G = 50번째 줄)
:n n번째 줄로 이동 (예: :25 = 25번째 줄)
H 화면의 맨 위로 이동 (High)
M 화면의 중간으로 이동 (Middle)
L 화면의 맨 아래로 이동 (Low)

단어 단위 이동

명령어 설명
w 다음 단어의 시작으로 이동 (word)
W 다음 단어의 시작으로 이동 (공백 기준)
e 다음 단어의 끝으로 이동 (end)
E 다음 단어의 끝으로 이동 (공백 기준)
b 이전 단어의 시작으로 이동 (back)
B 이전 단어의 시작으로 이동 (공백 기준)
ge 이전 단어의 끝으로 이동
gE 이전 단어의 끝으로 이동 (공백 기준)

문장/문단 단위 이동

명령어 설명
( 이전 문장의 시작으로 이동
) 다음 문장의 시작으로 이동
{ 이전 문단으로 이동
} 다음 문단으로 이동
[[ 이전 섹션으로 이동
]] 다음 섹션으로 이동

화면 단위 이동

명령어 설명
Ctrl+f 한 화면 아래로 이동 (forward)
Ctrl+b 한 화면 위로 이동 (backward)
Ctrl+d 반 화면 아래로 이동 (down)
Ctrl+u 반 화면 위로 이동 (up)
Ctrl+e 화면을 한 줄씩 아래로 스크롤
Ctrl+y 화면을 한 줄씩 위로 스크롤
zz 현재 줄을 화면 중앙으로
zt 현재 줄을 화면 맨 위로 (top)
zb 현재 줄을 화면 맨 아래로 (bottom)

특수 이동

명령어 설명
% 짝이 맞는 괄호로 이동 (, {, [ 등
* 커서 위의 단어를 다음으로 검색
# 커서 위의 단어를 이전으로 검색
gd 로컬 변수 선언부로 이동 (go to definition)
gD 전역 변수 선언부로 이동
'' 이전 위치로 점프
``.` 마지막 편집 위치로 이동
'^ 마지막 입력 모드 위치로 이동
g; 이전 변경 위치로 이동
g, 다음 변경 위치로 이동
Ctrl+o 이전 점프 위치로 이동 (older)
Ctrl+i 다음 점프 위치로 이동 (Tab과 동일)

숫자와 조합

# 숫자를 앞에 붙여 반복 횟수 지정
5j          # 5줄 아래로 이동
10k         # 10줄 위로 이동
3w          # 3단어 앞으로 이동
2b          # 2단어 뒤로 이동
4l          # 4칸 오른쪽으로 이동

# 줄 번호로 이동
50G         # 50번째 줄로 이동
:100        # 100번째 줄로 이동
gg          # 파일 처음으로
G           # 파일 끝으로

커서 이동 실전 예시

# 시나리오 1: 함수 정의 찾기
# 코드에서 함수 이름 위에 커서 두고
*           # 같은 이름 다음 위치로 검색
n           # 계속 다음으로
N           # 이전으로 돌아가기

# 시나리오 2: 괄호 매칭 확인
function test() {
    if (condition) {
        return true;  # 여기서 %
    }                  # 이 괄호로 이동
}                      # 다시 % 누르면 이 괄호로

# 시나리오 3: 빠른 문단 이동
{           # 이전 빈 줄로
}           # 다음 빈 줄로
3}          # 3문단 아래로

# 시나리오 4: 화면 중앙 정렬
zz          # 현재 줄을 화면 중앙에 배치

5. 삭제 및 변경  |  Delete & Change

삭제와 변경 명령어는 Vim의 핵심 편집 기능입니다. 삭제된 내용은 자동으로 클립보드(레지스터)에 저장되어 붙여넣기가 가능하며, 이는 잘라내기와 동일합니다. 변경 명령어는 삭제와 입력 모드 진입을 하나의 동작으로 수행하여 효율적인 편집을 가능하게 합니다. 숫자와 모션을 조합하면 강력한 편집 작업을 수행할 수 있습니다.

기본 삭제 명령어

명령어 설명
x 커서 위의 문자 삭제 (Delete 키와 유사)
X 커서 앞의 문자 삭제 (Backspace와 유사)
dd 현재 줄 전체 삭제
D 커서부터 줄 끝까지 삭제
d0 커서부터 줄 시작까지 삭제
d^ 커서부터 첫 문자까지 삭제
dw 커서부터 다음 단어 시작까지 삭제
dW 커서부터 다음 단어 시작까지 삭제 (공백 기준)
de 커서부터 단어 끝까지 삭제
db 커서부터 이전 단어 시작까지 삭제
dG 커서부터 파일 끝까지 삭제
dgg 커서부터 파일 처음까지 삭제
d$ 커서부터 줄 끝까지 삭제 (D와 동일)
d{ 이전 문단까지 삭제
d} 다음 문단까지 삭제
J 현재 줄과 다음 줄 합치기 (줄바꿈 삭제)
gJ 공백 없이 줄 합치기

변경 명령어 (삭제 + 입력 모드)

명령어 설명
c 변경 (change, 삭제 후 입력 모드 진입)
cc 현재 줄 변경
C 커서부터 줄 끝까지 변경
cw 커서부터 단어 끝까지 변경
cW 커서부터 단어 끝까지 변경 (공백 기준)
ciw 커서가 있는 단어 변경 (in word)
caw 커서가 있는 단어와 공백 변경 (around word)
ci" 쌍따옴표 안의 내용 변경
ci' 홑따옴표 안의 내용 변경
ci( 소괄호 안의 내용 변경
ci{ 중괄호 안의 내용 변경
ci[ 대괄호 안의 내용 변경
cit HTML/XML 태그 안의 내용 변경
ca" 쌍따옴표와 내용 모두 변경
ca( 소괄호와 내용 모두 변경
r 커서 위의 문자 하나를 다른 문자로 교체
R 교체 모드 진입 (덮어쓰기)
s 문자 삭제하고 입력 모드 (substitute)
S 줄 삭제하고 입력 모드

숫자와 조합한 삭제

# 숫자 + 명령어 = 반복 횟수
3dd         # 3줄 삭제
5dw         # 5단어 삭제
2dd         # 2줄 삭제
10x         # 10글자 삭제
4J          # 4줄 합치기

# 모션과 조합
d3w         # 3단어 앞으로 삭제
d2j         # 현재 줄 포함 아래 2줄 삭제
d5k         # 현재 줄 포함 위 5줄 삭제
c3w         # 3단어 변경

텍스트 객체를 활용한 편집

# i (inner): 내부만
# a (around): 주변 포함

diw         # 단어 삭제 (공백 제외)
daw         # 단어 삭제 (공백 포함)
ciw         # 단어 변경 (공백 제외)
caw         # 단어 변경 (공백 포함)

di"         # "" 안의 텍스트 삭제
da"         # ""와 내용 모두 삭제
ci(         # () 안의 내용 변경
ca(         # ()와 내용 모두 변경
dit         # <tag> 안의 내용 삭제
dat         # <tag>와 내용 모두 삭제

# 실전 예시
let text = "hello";
커서가 hello 위에 있을 때:
di"         # hello 삭제, 결과: let text = "";
da"         # "hello" 삭제, 결과: let text = ;

삭제 실전 예시

# 시나리오 1: 함수 인자 수정
function test(oldParam, anotherParam) {
# oldParam에 커서 두고
ciw         # oldParam 삭제하고 입력 모드
# newParam 입력
}

# 시나리오 2: 문자열 내용 변경
const message = "old message";
# 문자열 안에 커서 두고
ci"         # old message 삭제하고 입력 모드
# new message 입력

# 시나리오 3: HTML 태그 내용 변경
<div>old content</div>
# old content 위에 커서 두고
cit         # old content 삭제하고 입력 모드
# new content 입력

# 시나리오 4: 여러 줄 삭제
# 불필요한 코드 5줄 삭제
5dd

# 시나리오 5: 줄 끝까지 삭제하고 수정
let x = 10; // old comment
# = 뒤에 커서 두고
C           # 끝까지 삭제하고 입력 모드
# 20; // new comment 입력

6. 복사 및 붙여넣기  |  Yank & Paste

Vim에서 복사는 yank라고 부르며, 삭제된 내용도 자동으로 레지스터에 저장되어 붙여넣을 수 있습니다. 레지스터를 활용하면 여러 개의 텍스트를 동시에 관리할 수 있으며, 시스템 클립보드와도 연동할 수 있습니다. 비주얼 모드와 조합하면 원하는 영역을 정확하게 선택하여 복사할 수 있습니다.

복사 명령어 (Yank)

명령어 설명
yy 현재 줄 복사
Y 현재 줄 복사 (yy와 동일)
yw 커서부터 단어 끝까지 복사
yW 커서부터 단어 끝까지 복사 (공백 기준)
yiw 커서가 있는 단어 복사
yaw 커서가 있는 단어와 공백 복사
y$ 커서부터 줄 끝까지 복사
y0 커서부터 줄 시작까지 복사
yG 커서부터 파일 끝까지 복사
ygg 커서부터 파일 처음까지 복사
y{ 이전 문단까지 복사
y} 다음 문단까지 복사
yi" 쌍따옴표 안의 내용 복사
yi( 소괄호 안의 내용 복사
ya" 쌍따옴표와 내용 복사
ya( 소괄호와 내용 복사

붙여넣기 명령어 (Paste)

명령어 설명
p 커서 뒤에 붙여넣기 (paste)
P 커서 앞에 붙여넣기
gp 붙여넣고 커서를 붙여넣은 텍스트 뒤로 이동
gP 붙여넣고 커서를 붙여넣은 텍스트 뒤로 이동 (앞)
]p 붙여넣되 들여쓰기 맞춤
[p 붙여넣되 들여쓰기 맞춤 (앞)

레지스터 (Register) 사용

# 레지스터 종류
"           # 기본 레지스터 (unnamed)
0           # 마지막 yank
1-9         # 삭제 히스토리
a-z         # 명명된 레지스터 (사용자 지정)
A-Z         # 명명된 레지스터에 추가
+           # 시스템 클립보드
*           # 선택 영역 (X11)
_           # 블랙홀 (저장하지 않음)
/           # 마지막 검색 패턴

# 레지스터 사용법
"ayy        # a 레지스터에 현재 줄 복사
"ap         # a 레지스터 내용 붙여넣기
"Ayy        # a 레지스터에 현재 줄 추가
"byiw       # b 레지스터에 단어 복사
"bp         # b 레지스터 내용 붙여넣기

# 시스템 클립보드 사용
"+yy        # 현재 줄을 시스템 클립보드에 복사
"+p         # 시스템 클립보드 내용 붙여넣기
"*yy        # 선택 영역에 복사 (X11)
"*p         # 선택 영역 내용 붙여넣기

# 블랙홀 레지스터 (히스토리에 남기지 않음)
"_dd        # 줄 삭제하지만 레지스터에 저장 안 함
"_x         # 문자 삭제하지만 저장 안 함

# 레지스터 내용 확인
:reg        # 모든 레지스터 내용 보기
:reg a      # a 레지스터 내용만 보기
:reg ab     # a, b 레지스터 내용 보기

복사/붙여넣기 실전 예시

# 시나리오 1: 줄 복사 및 붙여넣기
yy          # 현재 줄 복사
5j          # 5줄 아래로 이동
p           # 붙여넣기

# 시나리오 2: 여러 줄 복사
3yy         # 3줄 복사
G           # 파일 끝으로
p           # 붙여넣기

# 시나리오 3: 단어 복사
yiw         # 커서 위의 단어 복사
w           # 다음 단어로
viwp        # 다음 단어를 복사한 단어로 교체

# 시나리오 4: 여러 텍스트 관리
"ayy        # 첫 번째 줄을 a에 복사
j           # 아래로
"byy        # 두 번째 줄을 b에 복사
j           # 아래로
"ap         # a 레지스터 내용 붙여넣기
j
"bp         # b 레지스터 내용 붙여넣기

# 시나리오 5: 다른 프로그램과 복사/붙여넣기
"+yy        # 시스템 클립보드에 복사
# 다른 프로그램에 붙여넣기 가능
"+p         # 다른 프로그램에서 복사한 내용 붙여넣기

# 시나리오 6: 삭제 없이 교체
# "hello"를 "world"로 교체하고 싶지만 hello도 보존
yiw         # hello 복사 (레지스터 0에 저장)
ciw         # hello 삭제하고 입력 모드
world       # world 입력
ESC
j           # 다음 위치로
"0p         # hello 붙여넣기 (레지스터 0에서)

7. 검색 및 치환  |  Search & Replace

검색과 치환은 대량의 텍스트를 효율적으로 편집하는 핵심 기능입니다. 정규표현식을 활용하면 복잡한 패턴도 검색할 수 있으며, 범위를 지정하여 특정 영역에만 치환을 적용할 수 있습니다. 검색 히스토리를 활용하면 이전에 검색했던 패턴을 빠르게 다시 사용할 수 있습니다.

기본 검색

명령어 설명
/pattern 전방 검색 (아래 방향)
?pattern 후방 검색 (위 방향)
n 다음 검색 결과로 이동 (next)
N 이전 검색 결과로 이동 (previous)
* 커서 위의 단어를 전방 검색
# 커서 위의 단어를 후방 검색
g* 부분 일치 전방 검색
g# 부분 일치 후방 검색
/ 마지막 검색 패턴 재사용 (n과 동일)
? 마지막 검색 패턴 재사용 (N과 동일)

검색 옵션

# 대소문자 구분 제어
/pattern\c      # 대소문자 구분 없이 검색 (case insensitive)
/pattern\C      # 대소문자 구분하여 검색 (case sensitive)

# 단어 경계 검색
/\<word\>       # 정확히 "word"만 검색 (단어 경계)
/word           # "word", "words", "sword" 모두 검색

# 검색 하이라이트
:set hlsearch   # 검색 결과 하이라이트 활성화
:set nohlsearch # 검색 결과 하이라이트 비활성화
:noh            # 현재 하이라이트만 임시 제거
:nohlsearch     # 현재 하이라이트만 임시 제거

# 검색 시 점진적 이동
:set incsearch  # 입력하는 동안 검색 (기본값)
:set noincsearch # 검색 입력 완료 후 이동

# 대소문자 설정
:set ignorecase # 대소문자 구분 안 함
:set noignorecase # 대소문자 구분
:set smartcase  # 검색어에 대문자가 있으면 구분, 없으면 무시

치환 (Substitute)

# 기본 형식
:s/old/new/         # 현재 줄의 첫 번째 old를 new로 치환
:s/old/new/g        # 현재 줄의 모든 old를 new로 치환
:s/old/new/gc       # 현재 줄의 모든 old를 확인하며 치환

# 범위 지정
:%s/old/new/g       # 파일 전체에서 치환
:5,10s/old/new/g    # 5~10번째 줄에서 치환
:.,$s/old/new/g     # 현재 줄부터 끝까지 치환
:1,.s/old/new/g     # 첫 줄부터 현재 줄까지 치환
:'<,'>s/old/new/g   # 비주얼 모드에서 선택한 영역 치환

# 치환 플래그
g   # 전역 치환 (한 줄에서 모든 매칭)
c   # 확인하며 치환 (confirm)
i   # 대소문자 구분 안 함 (ignore case)
I   # 대소문자 구분 (match case)

# 확인 옵션 (c 플래그 사용 시)
y   # 치환 (yes)
n   # 건너뛰기 (no)
a   # 이후 모두 치환 (all)
q   # 종료 (quit)
l   # 이것만 치환하고 종료 (last)

# 특수 치환
:%s/old/new/g       # 모든 old를 new로
:%s/old//g          # 모든 old 삭제
:%s/old/&/g         # & = 매칭된 문자 (old)
:%s/\(old\)/[\1]/g  # 그룹 참조, old를 [old]로
:%s/^/\/\//g        # 모든 줄 앞에 // 추가
:%s/$/;/g           # 모든 줄 끝에 ; 추가
:%s/\s\+$//g        # 줄 끝 공백 제거
:%s/^[ \t]*//g      # 줄 앞 공백 제거

정규표현식 패턴

# 기본 메타문자
.       # 임의의 한 문자
*       # 0회 이상 반복
\+      # 1회 이상 반복
\?      # 0 또는 1회
^       # 줄 시작
$       # 줄 끝
\<      # 단어 시작
\>      # 단어 끝
\|      # OR (또는)
[]      # 문자 클래스
[^]     # 문자 클래스 부정

# 문자 클래스
\d      # 숫자 [0-9]
\D      # 숫자가 아닌 것
\s      # 공백 문자
\S      # 공백이 아닌 것
\w      # 단어 문자 [a-zA-Z0-9_]
\W      # 단어 문자가 아닌 것
\a      # 알파벳 [a-zA-Z]
\l      # 소문자 [a-z]
\u      # 대문자 [A-Z]

# 수량자
\{n}    # 정확히 n번
\{n,}   # n번 이상
\{,m}   # m번 이하
\{n,m}  # n번 이상 m번 이하

# 그룹 및 참조
\(pattern\)     # 그룹 캡처
\1, \2, ...     # 그룹 참조 (1번째, 2번째)

검색 및 치환 실전 예시

# 시나리오 1: 함수 이름 변경
:%s/oldFunction/newFunction/g

# 시나리오 2: 주석 추가
:%s/^/\/\/ /g               # 모든 줄 앞에 // 추가
:5,10s/^/# /g               # 5~10줄 앞에 # 추가

# 시나리오 3: 세미콜론 추가
:%s/$/;/g                   # 모든 줄 끝에 ; 추가

# 시나리오 4: 공백 정리
:%s/\s\+$//g                # 줄 끝 공백 제거
:%s/\t/    /g               # 탭을 4칸 공백으로

# 시나리오 5: 변수 이름 변경 (단어 경계 사용)
:%s/\<old\>/new/g           # old만 정확히 매칭
# "older"는 매칭되지 않음

# 시나리오 6: HTML 태그 제거
:%s/<[^>]*>//g              # 모든 HTML 태그 제거

# 시나리오 7: 날짜 형식 변경
:%s/\(\d\{4}\)-\(\d\{2}\)-\(\d\{2}\)/\3\/\2\/\1/g
# 2024-01-15 -> 15/01/2024

# 시나리오 8: 대소문자 변경
:%s/.*/\U&/g                # 모두 대문자로
:%s/.*/\L&/g                # 모두 소문자로
:%s/\<\w/\u&/g              # 각 단어 첫 글자만 대문자

# 시나리오 9: 중복 공백 제거
:%s/  \+/ /g                # 2칸 이상 공백을 1칸으로

# 시나리오 10: 확인하며 치환
:%s/old/new/gc
# 각 매칭마다 y(치환), n(건너뛰기), a(모두), q(종료) 선택

8. 비주얼 모드  |  Visual Mode

비주얼 모드는 텍스트를 시각적으로 선택하여 일괄 작업을 수행할 수 있게 합니다. 문자, 줄, 블록 단위로 선택할 수 있으며, 선택된 영역에 대해 삭제, 복사, 들여쓰기 등 다양한 작업을 수행할 수 있습니다. 특히 블록 비주얼 모드는 열 단위 편집에 매우 유용합니다.

비주얼 모드 진입

명령어 설명
v 문자 단위 비주얼 모드
V 줄 단위 비주얼 모드 (Line)
Ctrl+v 블록 비주얼 모드 (Block)
gv 이전 비주얼 선택 영역 다시 선택
o 선택 영역의 반대쪽 끝으로 커서 이동
O 블록 선택 시 같은 줄의 반대편으로

비주얼 모드에서 사용 가능한 명령어

명령어 설명
d 또는 x 선택 영역 삭제
y 선택 영역 복사
c 선택 영역 삭제하고 입력 모드
~ 대소문자 변환
u 소문자로 변환
U 대문자로 변환
> 들여쓰기
< 내어쓰기
= 자동 들여쓰기
! 외부 명령어로 필터링
: 명령 모드 (선택 영역에만 적용)
r 선택 영역의 모든 문자를 특정 문자로 교체
I 블록 선택 영역 앞에 삽입
A 블록 선택 영역 뒤에 삽입
J 선택한 줄들을 하나로 합치기
gJ 공백 없이 줄 합치기
p 선택 영역을 레지스터 내용으로 교체

텍스트 객체 선택

# 비주얼 모드에서 텍스트 객체 선택
viw         # 단어 선택 (inner word)
vaw         # 단어와 공백 선택 (around word)
vi"         # 쌍따옴표 안 선택
va"         # 쌍따옴표와 내용 선택
vi(         # 소괄호 안 선택
va(         # 소괄호와 내용 선택
vi{         # 중괄호 안 선택
va{         # 중괄호와 내용 선택
vit         # HTML 태그 안 선택
vat         # HTML 태그와 내용 선택
vi[         # 대괄호 안 선택
va[         # 대괄호와 내용 선택

# 문단/블록 선택
vip         # 문단 선택 (inner paragraph)
vap         # 문단과 공백 선택 (around paragraph)

비주얼 모드 실전 예시

# 시나리오 1: 여러 줄 들여쓰기
V           # 줄 단위 비주얼 모드
5j          # 5줄 아래까지 선택
>           # 들여쓰기
.           # 반복 (더 들여쓰기)

# 시나리오 2: 코드 블록 주석 처리
Ctrl+v      # 블록 비주얼 모드
5j          # 5줄 선택
I           # 맨 앞에 삽입
//          # 주석 입력
ESC         # 모든 줄에 적용됨

# 시나리오 3: 열 단위 편집
Ctrl+v      # 블록 비주얼 모드
10j         # 10줄 선택
$           # 줄 끝까지 선택
A           # 줄 끝에 추가
;           # 세미콜론 입력
ESC         # 모든 줄에 적용

# 시나리오 4: 특정 범위 대문자로 변환
v           # 문자 비주얼 모드
3w          # 3단어 선택
U           # 대문자로 변환

# 시나리오 5: 함수 전체 선택
vi{         # 중괄호 안 선택
# 또는
va{         # 중괄호 포함 선택

# 시나리오 6: HTML 태그 내용 변경
<div>content</div>
# content 위에 커서 두고
vit         # 태그 안 내용 선택
c           # 삭제하고 입력 모드
# 새 내용 입력

# 시나리오 7: 여러 줄 복사
V           # 줄 비주얼 모드
5j          # 5줄 선택
y           # 복사
G           # 파일 끝으로
p           # 붙여넣기

# 시나리오 8: 블록 삭제
Ctrl+v      # 블록 비주얼 모드
3j          # 3줄
5l          # 5칸 오른쪽
d           # 삭제

# 시나리오 9: 대소문자 토글
v           # 비주얼 모드
iw          # 단어 선택
~           # 대소문자 반전

# 시나리오 10: 정렬
V           # 줄 비주얼 모드
5j          # 5줄 선택
:sort       # 정렬

9. 파일 작업  |  File Operations

파일을 열고, 저장하고, 닫는 기본적인 작업뿐만 아니라 여러 파일을 동시에 관리하는 고급 기능까지 포함합니다. 버퍼, 윈도우, 탭을 이해하면 효율적인 다중 파일 편집이 가능합니다. 외부 파일을 읽어오거나 특정 영역을 다른 파일로 저장하는 것도 가능합니다.

파일 열기 및 저장

명령어 설명
:e 파일명 파일 열기 (edit)
:e! 현재 파일 다시 불러오기 (변경사항 버림)
:w 저장 (write)
:w 파일명 다른 이름으로 저장
:w! 강제 저장 (읽기 전용 무시)
:w >>파일명 현재 내용을 파일 끝에 추가
:sav 파일명 다른 이름으로 저장 후 새 파일 편집
:up 변경사항이 있을 때만 저장 (update)
:x 변경사항이 있으면 저장 후 종료
:wq 저장 후 종료
:q 종료
:q! 강제 종료 (변경사항 버림)
:qa 모든 파일 종료
:wqa 모든 파일 저장 후 종료
ZZ 저장 후 종료 (:x와 동일)
ZQ 저장 없이 종료 (:q!와 동일)

파일 범위 작업

# 특정 범위 저장
:10,20w 파일명          # 10~20번째 줄을 파일로 저장
:.,$w 파일명            # 현재 줄부터 끝까지 저장
:'<,'>w 파일명          # 비주얼 선택 영역 저장

# 외부 파일 읽어오기
:r 파일명               # 커서 아래에 파일 내용 삽입
:5r 파일명              # 5번째 줄 아래에 삽입
:0r 파일명              # 파일 맨 앞에 삽입
:$r 파일명              # 파일 맨 끝에 삽입

# 명령어 실행 결과 읽어오기
:r !ls                  # ls 명령 결과 삽입
:r !date                # 현재 날짜/시간 삽입
:r !cat 파일명          # cat 명령으로 파일 내용 삽입

버퍼 (Buffer) 관리

# 버퍼 = 메모리에 로드된 파일
:ls             # 버퍼 목록 확인
:buffers        # 버퍼 목록 확인 (:ls와 동일)
:files          # 버퍼 목록 확인 (:ls와 동일)

# 버퍼 상태
  % a           # 현재 버퍼, 활성
    a           # 활성 버퍼
    h           # 숨김 버퍼
    - m         # 수정된 버퍼
    = u         # 읽기 전용 버퍼

# 버퍼 간 이동
:b 번호         # 번호로 버퍼 이동
:b 파일명       # 파일명으로 버퍼 이동
:bn             # 다음 버퍼 (buffer next)
:bp             # 이전 버퍼 (buffer previous)
:bf             # 첫 번째 버퍼 (buffer first)
:bl             # 마지막 버퍼 (buffer last)
:b#             # 이전에 편집하던 버퍼로
Ctrl+^          # 이전 버퍼와 토글

# 버퍼 삭제
:bd             # 현재 버퍼 삭제 (buffer delete)
:bd 2           # 2번 버퍼 삭제
:bd 파일명      # 특정 버퍼 삭제
:1,3bd          # 1~3번 버퍼 삭제
:%bd            # 모든 버퍼 삭제
:bd!            # 강제 삭제

윈도우 (Window) 분할

# 수평 분할
:sp 파일명      # 수평 분할로 파일 열기 (split)
:split          # 현재 파일 수평 분할
Ctrl+w s        # 현재 창 수평 분할

# 수직 분할
:vs 파일명      # 수직 분할로 파일 열기 (vertical split)
:vsplit         # 현재 파일 수직 분할
Ctrl+w v        # 현재 창 수직 분할

# 새 파일
:new            # 수평 분할로 새 파일
:vnew           # 수직 분할로 새 파일

# 윈도우 간 이동
Ctrl+w h        # 왼쪽 창으로 이동
Ctrl+w j        # 아래 창으로 이동
Ctrl+w k        # 위 창으로 이동
Ctrl+w l        # 오른쪽 창으로 이동
Ctrl+w w        # 다음 창으로 이동
Ctrl+w p        # 이전 창으로 이동
Ctrl+w t        # 맨 위 창으로 이동
Ctrl+w b        # 맨 아래 창으로 이동

# 윈도우 크기 조절
Ctrl+w +        # 높이 증가
Ctrl+w -        # 높이 감소
Ctrl+w >        # 너비 증가
Ctrl+w <        # 너비 감소
Ctrl+w =        # 모든 창 크기 동일하게
Ctrl+w _        # 현재 창 높이 최대화
Ctrl+w |        # 현재 창 너비 최대화
:resize 20      # 높이를 20줄로 설정
:vertical resize 80  # 너비를 80칸으로 설정

# 윈도우 이동 및 배치
Ctrl+w H        # 창을 왼쪽 끝으로 이동
Ctrl+w J        # 창을 아래쪽 끝으로 이동
Ctrl+w K        # 창을 위쪽 끝으로 이동
Ctrl+w L        # 창을 오른쪽 끝으로 이동
Ctrl+w r        # 창 회전
Ctrl+w x        # 창 위치 교환

# 윈도우 닫기
Ctrl+w c        # 현재 창 닫기 (close)
Ctrl+w q        # 현재 창 닫기 (quit)
:q              # 현재 창 닫기
:only           # 다른 모든 창 닫기
Ctrl+w o        # 다른 모든 창 닫기

탭 (Tab) 관리

# 탭 열기
:tabnew         # 새 탭 열기
:tabnew 파일명  # 파일을 새 탭으로 열기
:tabe 파일명    # 파일을 새 탭으로 열기 (edit)
:tabedit 파일명 # 파일을 새 탭으로 열기

# 탭 간 이동
gt              # 다음 탭으로 이동
gT              # 이전 탭으로 이동
3gt             # 3번째 탭으로 이동
:tabn           # 다음 탭 (tab next)
:tabp           # 이전 탭 (tab previous)
:tabfirst       # 첫 번째 탭
:tablast        # 마지막 탭

# 탭 이동 및 정렬
:tabm 0         # 현재 탭을 첫 번째로 이동
:tabm           # 현재 탭을 마지막으로 이동
:tabm 2         # 현재 탭을 3번째 위치로 이동

# 탭 닫기
:tabc           # 현재 탭 닫기 (tab close)
:tabo           # 다른 모든 탭 닫기 (tab only)
:qa             # 모든 탭 닫기

파일 탐색기 (Explorer)

:Ex             # 파일 탐색기 (현재 창)
:Sex            # 수평 분할로 파일 탐색기
:Vex            # 수직 분할로 파일 탐색기
:Tex            # 새 탭으로 파일 탐색기

# 파일 탐색기 내 명령어
Enter           # 파일/디렉토리 열기
-               # 상위 디렉토리로
i               # 보기 형식 변경
s               # 정렬 방식 변경
r               # 파일 이름 변경
d               # 디렉토리 생성
D               # 파일/디렉토리 삭제

10. 고급 편집 기능  |  Advanced Editing

Vim의 강력한 고급 기능들을 활용하면 복잡한 편집 작업도 빠르게 처리할 수 있습니다. 매크로는 반복 작업을 자동화하고, 마크는 특정 위치를 저장하여 빠르게 이동할 수 있게 하며, 접기 기능은 코드 구조를 보기 쉽게 정리합니다.

매크로 (Macro)

# 매크로 기록
q<레지스터>     # 매크로 기록 시작 (a~z 중 선택)
<명령어들 실행>
q               # 매크로 기록 종료

# 매크로 실행
@<레지스터>     # 매크로 실행
@@              # 마지막 매크로 재실행
100@a           # a 매크로를 100번 실행

# 실전 예시
qa              # a 레지스터에 기록 시작
I"              # 줄 앞에 " 삽입
A"              # 줄 끝에 " 삽입
j               # 다음 줄로
q               # 기록 종료
10@a            # 10줄에 적용

# 매크로 편집
:let @a='...'   # a 매크로 내용 수정
:put a          # a 매크로 내용 붙여넣기 (수정 후 yank)

# 모든 줄에 매크로 적용
:%normal @a     # 전체 줄에 a 매크로 적용
:5,10normal @a  # 5~10줄에 a 매크로 적용

마크 (Mark) 및 점프

# 마크 설정
m<문자>         # 현재 위치에 마크 설정 (a~z: 파일 내, A~Z: 전역)
ma              # 현재 위치를 a 마크로 저장
mA              # 현재 위치를 A 마크로 저장 (다른 파일에서도 접근 가능)

# 마크로 이동
'<문자>         # 마크한 줄의 첫 문자로 이동
`<문자>         # 마크한 정확한 위치로 이동
''              # 이전 위치로
``              # 이전 정확한 위치로
'.              # 마지막 변경 위치로
'^              # 마지막 입력 위치로

# 마크 목록
:marks          # 모든 마크 보기
:marks abc      # a, b, c 마크만 보기

# 마크 삭제
:delmarks a     # a 마크 삭제
:delmarks a-d   # a~d 마크 삭제
:delmarks!      # 소문자 마크 모두 삭제

# 특수 마크 (자동 설정)
'0              # Vim을 마지막으로 종료한 위치
'1~'9           # 이전 종료 위치들
'"              # 현재 파일을 마지막으로 편집한 위치
'[              # 마지막 변경/yank 시작 위치
']              # 마지막 변경/yank 끝 위치
'<              # 마지막 비주얼 선택 시작
'>              # 마지막 비주얼 선택 끝

접기 (Folding)

# 수동 접기
zf              # 비주얼 선택 영역 접기
zf3j            # 현재부터 3줄 아래까지 접기
zf/pattern      # pattern까지 접기
zfap            # 문단 접기
zfi{            # 중괄호 블록 접기

# 접기 열기/닫기
zo              # 접기 열기 (open)
zc              # 접기 닫기 (close)
za              # 접기 토글 (toggle)
zO              # 재귀적으로 모든 접기 열기
zC              # 재귀적으로 모든 접기 닫기
zA              # 재귀적 토글

# 모든 접기 제어
zR              # 모든 접기 열기 (reduce)
zM              # 모든 접기 닫기 (more)
zr              # 접기 레벨 1 감소 (열기)
zm              # 접기 레벨 1 증가 (닫기)

# 접기 간 이동
zj              # 다음 접기로 이동
zk              # 이전 접기로 이동

# 접기 삭제
zd              # 현재 접기 삭제
zD              # 재귀적으로 접기 삭제
zE              # 모든 접기 삭제

# 접기 방식 설정
:set foldmethod=manual    # 수동 접기
:set foldmethod=indent    # 들여쓰기 기준
:set foldmethod=syntax    # 문법 기준
:set foldmethod=marker    # 마커 기준 ({{{ }}} 등)
:set foldmethod=expr      # 표현식 기준

실행 취소 및 재실행 (Undo & Redo)

# 기본 실행 취소
u               # 실행 취소 (undo)
U               # 현재 줄의 모든 변경 취소
Ctrl+r          # 재실행 (redo)

# 고급 실행 취소
:earlier 10s    # 10초 전 상태로
:earlier 5m     # 5분 전 상태로
:earlier 1h     # 1시간 전 상태로
:earlier 5      # 5번 변경 전으로
:earlier 10f    # 10번 파일 저장 전으로

# 재실행
:later 10s      # 10초 후 상태로
:later 5m       # 5분 후 상태로
:later 5        # 5번 변경 후로

# 실행 취소 트리
:undolist       # 실행 취소 리스트 확인
g-              # 실행 취소 트리에서 이전 상태로
g+              # 실행 취소 트리에서 다음 상태로
:undo 5         # 특정 변경 번호로 이동

반복 (Repeat)

# 마지막 명령 반복
.               # 마지막 변경 반복
@:              # 마지막 명령 모드 명령 반복
@@              # 마지막 매크로 반복

# 반복 활용 예시
dd              # 줄 삭제
.               # 다시 줄 삭제
...             # 계속 반복 가능

cw              # 단어 변경
hello           # hello 입력
ESC
w               # 다음 단어로
.               # 같은 작업 반복 (단어를 hello로 변경)

11. 설정 및 커스터마이징   |   Configuration

Vim의 동작을 자신의 작업 스타일에 맞게 조정할 수 있습니다. .vimrc 파일에 설정을 저장하면 Vim을 시작할 때마다 자동으로 적용됩니다. 플러그인 매니저를 사용하면 다양한 기능을 추가할 수 있으며, 키 매핑으로 단축키를 커스터마이징할 수 있습니다.

기본 설정 명령어

# 줄 번호
:set number         # 줄 번호 표시
:set nu             # 줄 번호 표시 (축약)
:set nonumber       # 줄 번호 숨김
:set relativenumber # 상대 줄 번호
:set rnu            # 상대 줄 번호 (축약)

# 들여쓰기
:set tabstop=4      # 탭 크기 4칸
:set ts=4           # 탭 크기 (축약)
:set shiftwidth=4   # 자동 들여쓰기 크기
:set sw=4           # 자동 들여쓰기 (축약)
:set expandtab      # 탭을 스페이스로 변환
:set et             # 탭을 스페이스로 (축약)
:set autoindent     # 자동 들여쓰기
:set ai             # 자동 들여쓰기 (축약)
:set smartindent    # 스마트 들여쓰기
:set si             # 스마트 들여쓰기 (축약)

# 검색
:set hlsearch       # 검색 결과 하이라이트
:set hls            # 검색 하이라이트 (축약)
:set incsearch      # 점진적 검색
:set is             # 점진적 검색 (축약)
:set ignorecase     # 대소문자 구분 안 함
:set ic             # 대소문자 무시 (축약)
:set smartcase      # 대문자 있으면 대소문자 구분
:set scs            # 스마트 대소문자 (축약)

# 표시
:set wrap           # 줄 바꿈 표시
:set nowrap         # 줄 바꿈 숨김
:set showmatch      # 매칭 괄호 강조
:set sm             # 매칭 괄호 (축약)
:set cursorline     # 현재 줄 강조
:set cul            # 현재 줄 강조 (축약)
:set cursorcolumn   # 현재 열 강조
:set cuc            # 현재 열 강조 (축약)

# 문법 강조
:syntax on          # 문법 강조 활성화
:syntax off         # 문법 강조 비활성화
:filetype on        # 파일 타입 감지
:filetype indent on # 파일 타입별 들여쓰기
:filetype plugin on # 파일 타입별 플러그인

# 기타
:set mouse=a        # 마우스 지원 활성화
:set clipboard=unnamedplus  # 시스템 클립보드 사용
:set ruler          # 커서 위치 표시
:set showcmd        # 입력 중인 명령 표시
:set wildmenu       # 명령어 자동완성 메뉴
:set laststatus=2   # 항상 상태바 표시
:set encoding=utf-8 # UTF-8 인코딩
:set backspace=indent,eol,start  # Backspace 키 설정

# 설정 확인
:set number?        # number 설정 상태 확인
:set ts?            # tabstop 값 확인
:set                # 변경된 설정 모두 보기
:set all            # 모든 설정 보기

.vimrc 파일 예시

" ~/.vimrc 또는 ~/.vim/vimrc 파일

" ===== 기본 설정 =====
set nocompatible        " Vi 호환 모드 비활성화
syntax on               " 문법 강조
filetype plugin indent on

" ===== 외관 =====
set number              " 줄 번호
set relativenumber      " 상대 줄 번호
set cursorline          " 현재 줄 강조
set showmatch           " 괄호 매칭
set ruler               " 커서 위치
set showcmd             " 명령어 표시
set laststatus=2        " 상태바 항상 표시
colorscheme desert      " 색상 테마

" ===== 들여쓰기 =====
set tabstop=4           " 탭 크기
set shiftwidth=4        " 들여쓰기 크기
set expandtab           " 탭을 스페이스로
set autoindent          " 자동 들여쓰기
set smartindent         " 스마트 들여쓰기

" ===== 검색 =====
set hlsearch            " 검색 하이라이트
set incsearch           " 점진적 검색
set ignorecase          " 대소문자 무시
set smartcase           " 스마트 대소문자

" ===== 편집 =====
set backspace=indent,eol,start
set clipboard=unnamedplus   " 시스템 클립보드
set mouse=a             " 마우스 지원
set wildmenu            " 명령어 자동완성
set encoding=utf-8      " UTF-8 인코딩

" ===== 성능 =====
set lazyredraw          " 매크로 실행 시 화면 갱신 지연
set ttyfast             " 빠른 터미널

" ===== 백업 및 스왑 =====
set nobackup            " 백업 파일 생성 안 함
set nowritebackup       " 쓰기 백업 안 함
set noswapfile          # 스왑 파일 생성 안 함

" ===== 키 매핑 =====
" 리더 키를 스페이스로 설정
let mapleader = " "

" ESC를 jk로 매핑
inoremap jk <ESC>

" 파일 저장
nnoremap <leader>w :w<CR>

" 파일 닫기
nnoremap <leader>q :q<CR>

" 새 탭
nnoremap <leader>t :tabnew<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

" 비주얼 모드에서 들여쓰기 후 선택 유지
vnoremap < <gv
vnoremap > >gv

" 검색 하이라이트 제거
nnoremap <leader>h :noh<CR>

" ===== 자동 명령 =====
" Python 파일에서 탭 크기 2로
autocmd FileType python setlocal ts=2 sw=2

" 파일 저장 시 자동으로 줄 끝 공백 제거
autocmd BufWritePre * :%s/\s\+$//e

" ===== 플러그인 (vim-plug 사용 예시) =====
" call plug#begin('~/.vim/plugged')
" Plug 'preservim/nerdtree'
" Plug 'junegunn/fzf.vim'
" Plug 'tpope/vim-fugitive'
" call plug#end()

키 매핑 (Key Mapping)

# 매핑 종류
:map            # 모든 모드
:nmap           # 일반 모드 (normal)
:imap           # 입력 모드 (insert)
:vmap           # 비주얼 모드 (visual)
:cmap           # 명령 모드 (command)

# 재귀 방지 매핑 (권장)
:noremap        # 재귀 방지
:nnoremap       # 일반 모드, 재귀 방지
:inoremap       # 입력 모드, 재귀 방지
:vnoremap       # 비주얼 모드, 재귀 방지
:cnoremap       # 명령 모드, 재귀 방지

# 매핑 예시
:nnoremap <C-s> :w<CR>              " Ctrl+s로 저장
:inoremap jk <ESC>                  " jk로 ESC
:nnoremap <leader>w :w<CR>          " 리더+w로 저장
:nnoremap <leader>q :q<CR>          " 리더+q로 종료
:vnoremap <C-c> "+y                 " Ctrl+c로 복사

# 매핑 확인
:nmap           # 일반 모드 매핑 확인
:imap           # 입력 모드 매핑 확인

# 매핑 해제
:unmap <C-s>
:nunmap <C-s>
:iunmap jk

색상 테마 (Colorscheme)

# 내장 색상 테마
:colorscheme desert
:colorscheme murphy
:colorscheme slate
:colorscheme pablo
:colorscheme koehler

# 색상 테마 목록
:colorscheme [Tab]      " Tab으로 확인

# 배경
:set background=dark    # 어두운 배경
:set background=light   # 밝은 배경

# 256 색상 활성화
:set t_Co=256

12. 생산성 팁 및 고급 테크닉  |  Advanced Technique

Vim을 더 효율적으로 사용하기 위한 실용적인 팁들입니다. 이러한 기법들을 익히면 편집 속도가 크게 향상됩니다.

효율적인 편집 패턴

# 1. 숫자 증가/감소
Ctrl+a          # 커서 위의 숫자 증가
Ctrl+x          # 커서 위의 숫자 감소
10Ctrl+a        # 10 증가

# 2. 줄 합치기
J               # 현재 줄과 다음 줄 합치기
3J              # 3줄 합치기

# 3. 대소문자 변환
~               # 커서 위 문자의 대소문자 반전
gu              # 소문자로 (모션과 함께)
gU              # 대문자로 (모션과 함께)
guu             # 현재 줄을 소문자로
gUU             # 현재 줄을 대문자로
g~~             # 현재 줄의 대소문자 반전
guiw            # 단어를 소문자로
gUiw            # 단어를 대문자로

# 4. 필터링 (외부 명령어 사용)
!}sort          # 다음 문단을 정렬
!}fmt           # 다음 문단을 포맷
:10,20!sort     # 10~20줄 정렬
:%!python -m json.tool  # JSON 포맷팅

# 5. 빠른 이동 조합
gg=G            # 전체 파일 자동 들여쓰기
ggyG            # 전체 파일 복사
ggdG            # 전체 파일 삭제

자주 사용하는 명령어 조합

# 빈 줄 제거
:g/^$/d         # 모든 빈 줄 삭제
:v/./d          # 빈 줄만 남기고 삭제

# 중복 줄 제거
:sort u         # 정렬하며 중복 제거
:sort|%!uniq    # 정렬 후 중복 제거

# 줄 번호와 함께 붙여넣기
:%s/^/\=line('.') . '. '/

# 모든 줄 끝에 특정 문자 추가
:%s/$/;/g       # 세미콜론 추가

# 특정 패턴이 있는 줄만 삭제
:g/pattern/d    # pattern이 있는 줄 삭제
:v/pattern/d    # pattern이 없는 줄 삭제

# 특정 패턴이 있는 줄만 복사
:g/pattern/t$   # pattern이 있는 줄을 파일 끝에 복사

# 줄 역순으로 정렬
:g/^/m0         # 모든 줄을 파일 맨 앞으로 이동 (역순)

# 여러 파일에서 치환
:args *.js      # 모든 .js 파일 대상
:argdo %s/old/new/ge | update

프로그래밍을 위한 팁

# 자동 완성
Ctrl+n          # 다음 단어 자동완성
Ctrl+p          # 이전 단어 자동완성
Ctrl+x Ctrl+l   # 줄 자동완성
Ctrl+x Ctrl+f   # 파일명 자동완성
Ctrl+x Ctrl+o   # 문법 기반 자동완성 (omni)

# 들여쓰기
=               # 자동 들여쓰기 (모션과 함께)
==              # 현재 줄 자동 들여쓰기
gg=G            # 전체 파일 자동 들여쓰기
=i{             # 중괄호 블록 자동 들여쓰기
>               # 들여쓰기 증가
<               # 들여쓰기 감소
>>              # 현재 줄 들여쓰기
<<              # 현재 줄 내어쓰기

# 주석 토글 (수동)
Ctrl+v          # 블록 비주얼 모드
5j              # 5줄 선택
I               # 맨 앞에 삽입
//              # 주석 입력
ESC             # 모든 줄에 적용

# 괄호 자동 닫기 (매핑)
:inoremap ( ()<Left>
:inoremap [ []<Left>
:inoremap { {}<Left>
:inoremap " ""<Left>
:inoremap ' ''<Left>

# 함수/클래스로 이동
]]              # 다음 함수/클래스로
[[              # 이전 함수/클래스로

시간 절약 트릭

# 1. 빠른 라인 이동
10gg            # 10번째 줄로
:10             # 10번째 줄로
G               # 마지막 줄로
gg              # 첫 줄로

# 2. 빠른 검색 및 치환
*               # 커서 위 단어 검색
cgn             # 검색된 단어 변경
.               # 다음 단어도 같게 변경

# 3. 마지막 삽입 텍스트 반복
Ctrl+a          # 마지막 삽입한 텍스트 재입력 (입력 모드)

# 4. 레지스터 활용
"ay             # a 레지스터에 복사
"ap             # a 레지스터 붙여넣기
"Ay             # a 레지스터에 추가

# 5. 전역 명령어
:g/pattern/command      # pattern이 있는 줄에 command 실행
:g!/pattern/command     # pattern이 없는 줄에 command 실행
:v/pattern/command      # g!와 동일

13. 자주 발생하는 상황 및 해결법  |  Troubleshooting

Vim 사용 중 자주 마주치는 문제들과 해결 방법입니다.

일반적인 문제 해결

# 1. Vim 종료하는 법을 모를 때
:q              # 종료
:q!             # 강제 종료
:wq             # 저장 후 종료
ZZ              # 저장 후 종료

# 2. 입력이 안 될 때
ESC             # 일반 모드로 돌아가기
i 또는 a        # 입력 모드 진입

# 3. 잘못된 편집을 되돌리고 싶을 때
u               # 실행 취소
Ctrl+r          # 재실행
U               # 현재 줄의 모든 변경 취소

# 4. 변경사항을 버리고 다시 열기
:e!             # 현재 파일 다시 로드

# 5. 읽기 전용 파일을 수정한 경우
:w !sudo tee %  # sudo 권한으로 강제 저장

# 6. 잘못된 모드에서 벗어나기
ESC ESC         # ESC 두 번 (확실하게)
Ctrl+[          # ESC와 동일
Ctrl+c          # 명령 취소 (ESC와 유사)

# 7. 화면이 이상할 때
Ctrl+l          # 화면 다시 그리기
:redraw!        # 강제로 화면 다시 그리기

# 8. 스왑 파일 경고
:e              # 읽기 전용으로 열기 (O)
:recover        # 복구 (R)
:q              # 종료 (Q)
:!rm .file.swp  # 스왑 파일 삭제 후 다시 열기

# 9. 실수로 Ctrl+s를 눌러 화면이 멈춘 경우
Ctrl+q          # 화면 멈춤 해제

# 10. 매크로 기록 중 실수
q               # 기록 중단

복구 및 백업

# 스왑 파일에서 복구
vim -r 파일명   # 스왑 파일에서 복구
:recover        # Vim 내에서 복구

# 백업 설정
:set backup             # 백업 활성화
:set backupdir=~/.vim/backup  # 백업 디렉토리
:set undofile           # 영구 실행 취소 파일
:set undodir=~/.vim/undo  # 실행 취소 디렉토리

# 스왑 파일 제거
:!rm .파일명.swp        # 스왑 파일 삭제

성능 최적화

# 큰 파일 편집 시
:syntax off     # 문법 강조 비활성화 (속도 향상)
:set nohls      # 검색 하이라이트 비활성화
:set lazyredraw # 화면 갱신 지연

# 매크로 실행 속도 향상
:set lazyredraw # 화면 갱신 지연

# 플러그인이 많을 때
:scriptnames    # 로드된 스크립트 확인
:profile start profile.log  # 프로파일링 시작
:profile func *
:profile file *

14. 유용한 명령어 치트시트  |  Cheat sheet

빠른 참조를 위한 핵심 명령어 요약입니다.

필수 명령어 TOP 20

# 모드 전환
i       # 입력 모드
ESC     # 일반 모드
:       # 명령 모드
v       # 비주얼 모드

# 저장 및 종료
:w      # 저장
:q      # 종료
:wq     # 저장 후 종료
:q!     # 강제 종료

# 이동
h j k l # 방향키
gg      # 맨 위
G       # 맨 아래
w       # 다음 단어
b       # 이전 단어

# 편집
dd      # 줄 삭제
yy      # 줄 복사
p       # 붙여넣기
u       # 실행 취소

# 검색
/패턴   # 검색
n       # 다음
N       # 이전

생산성 명령어

# 빠른 편집
ciw     # 단어 변경
ci"     # 따옴표 안 변경
di(     # 괄호 안 삭제
dat     # 태그 전체 삭제

# 빠른 이동
*       # 단어 검색
%       # 괄호 매칭
''      # 이전 위치
`.      # 마지막 편집 위치

# 일괄 작업
:%s/old/new/g   # 전체 치환
:g/pattern/d    # 패턴 줄 삭제
gg=G            # 전체 자동 들여쓰기

15.  학습 로드맵  |  Step of study

Vim을 효과적으로 학습하는 단계별 가이드입니다.

1주차 : 기본 생존 기술

# 목표: Vim을 종료할 수 있고 간단한 편집 가능
- vim 파일명으로 열기
- i로 입력 모드, ESC로 일반 모드
- h j k l로 이동
- :w로 저장, :q로 종료
- x로 문자 삭제, dd로 줄 삭제
- u로 실행 취소
- /로 검색, n으로 다음

2주차 : 효율적인 이동

# 목표: 마우스 없이 빠르게 이동
- w, b, e로 단어 이동
- 0, ^, $로 줄 내 이동
- gg, G로 파일 내 이동
- Ctrl+f, Ctrl+b로 페이지 이동
- f, F로 문자 찾기
- %, *, #로 특수 이동

3주차 : 편집 마스터

# 목표: 다양한 편집 기법 습득
- d, c, y + 모션 조합
- diw, ciw, yiw
- di", ci(, ci{
- >, <로 들여쓰기
- J로 줄 합치기
- .으로 반복

4주차: 고급 기능

# 목표: 생산성 극대화
- 비주얼 모드 활용 (v, V, Ctrl+v)
- 매크로 기록 및 실행 (q, @)
- 마크 사용 (m, ')
- 레지스터 활용 (", +)
- 윈도우 분할 (Ctrl+w s, v)
- 탭 사용 (:tabnew, gt)

평생: 지속적인 개선

# 목표: 자신만의 워크플로우 구축
- .vimrc 커스터마이징
- 플러그인 탐색 및 설치
- 키 매핑 최적화
- 새로운 기법 학습 및 적용
- 다른 도구와 통합 (git, tmux 등)

마치며

Vi/Vim은 처음에는 가파른 학습 곡선을 가지고 있지만, 익숙해지면 가장 효율적인 텍스트 편집 도구가 됩니다. 이 가이드에 있는 모든 명령어를 외울 필요는 없습니다. 필요할 때마다 이 문서를 참조하면서 자주 사용하는 명령어부터 천천히 익혀가세요. 처음 1-2주는 느리게 느껴질 수 있지만, 한 달 정도 지나면 기존 에디터보다 훨씬 빠르게 작업할 수 있게 됩니다. 매일 하나씩 새로운 명령어를 배우는 것을 목표로 하면, 어느새 Vim 마스터가 되어 있을 것입니다. 실수를 두려워하지 마세요. 실행 취소(u)가 항상 있습니다!

 

추가 학습 자료