vi 에디터 완벽 마스터 가이드
리눅스 개발자의 필수 도구
vi는 리눅스와 유닉스 환경에서 가장 널리 사용되는 텍스트 에디터다. 서버 환경에서 파일을 편집할 때 필수적인 도구이며, 모든 명령어와 모드 전환을 완벽하게 익히면 생산성이 크게 향상된다.
1. vi 에디터란?
vi는 "Visual Editor"의 약자로, 1976년에 개발된 텍스트 에디터다. 거의 모든 리눅스/유닉스 시스템에 기본으로 설치되어 있어 서버 환경에서 파일을 편집할 때 필수적이다.
1.1 vi vs vim
- vi: 원본 에디터, 기본 기능만 제공
- vim: "Vi Improved", vi의 개선 버전으로 더 많은 기능 제공
현재 대부분의 리눅스 시스템에서는 vi 명령어를 입력해도 실제로는 vim이 실행된다.
2. vi 시작하기
2.1 파일 열기
새 파일 생성 또는 기존 파일 열기
vi filename.txt
여러 파일 동시에 열기
vi file1.txt file2.txt
특정 라인으로 이동하며 열기
vi +10 filename.txt 10번째 라인으로 이동
파일의 마지막 라인으로 이동하며 열기
vi + filename.txt
2.2 vi 종료하기 (긴급)
vi를 종료하는 방법을 모르면 곤란하다. 가장 먼저 익혀야 할 명령어:
명령 모드에서 입력
:q 저장하지 않고 종료
:q! 강제 종료 (변경사항 무시)
:wq 저장하고 종료
:x 저장하고 종료 (변경사항이 있을 때만)
ZZ 저장하고 종료 (대문자 Z 두 번)
:q!를 외워두자!3. vi 모드 이해하기
vi는 3가지 모드로 동작한다. 모드를 이해하는 것이 vi 마스터의 첫걸음이다.
| 모드 | 설명 | 전환 방법 |
|---|---|---|
명령 모드 |
기본 모드, 커서 이동, 삭제, 복사 등 | ESC 키 |
입력 모드 |
텍스트 입력 | i, a, o 등 |
ex 모드 |
명령어 입력 (저장, 종료 등) | : (콜론) |
4. 명령 모드 명령어
명령 모드는 vi의 기본 모드다. 커서 이동, 삭제, 복사, 붙여넣기 등을 수행한다.
4.1 커서 이동
기본 이동
h 왼쪽으로 한 글자
l 오른쪽으로 한 글자
j 아래로 한 줄
k 위로 한 줄
단어 단위 이동
w 다음 단어의 시작으로
b 이전 단어의 시작으로
e 현재/다음 단어의 끝으로
라인 단위 이동
0 라인의 시작으로
$ 라인의 끝으로
^ 라인의 첫 번째 문자로 (공백 제외)
문서 단위 이동
gg 문서의 첫 번째 라인으로
G 문서의 마지막 라인으로
:n n번째 라인으로 이동 (예: :10)
화면 단위 이동
H 화면의 맨 위로
M 화면의 중간으로
L 화면의 맨 아래로
Ctrl+f 다음 페이지
Ctrl+b 이전 페이지
4.2 삭제 명령어
삭제 명령어
x 현재 커서의 문자 삭제
X 현재 커서 앞의 문자 삭제
dw 현재 단어 삭제
dd 현재 라인 삭제
D 커서 위치부터 라인 끝까지 삭제
d$ 커서 위치부터 라인 끝까지 삭제
d0 커서 위치부터 라인 시작까지 삭제
여러 라인 삭제
3dd 3줄 삭제
dG 현재 위치부터 문서 끝까지 삭제
dgg 현재 위치부터 문서 시작까지 삭제
4.3 복사 및 붙여넣기
복사 (yank)
yy 현재 라인 복사
yw 현재 단어 복사
y$ 커서 위치부터 라인 끝까지 복사
y0 커서 위치부터 라인 시작까지 복사
3yy 3줄 복사
붙여넣기 (put)
p 커서 다음에 붙여넣기
P 커서 앞에 붙여넣기
4.4 실행 취소 및 재실행
u 실행 취소 (undo)
Ctrl+r 재실행 (redo)
U 현재 라인의 모든 변경사항 취소
5. 입력 모드 명령어
입력 모드로 전환하는 다양한 방법이 있다. 상황에 맞게 선택하자.
5.1 입력 모드 전환
입력 모드로 전환
i 현재 커서 위치에서 입력 모드
I 현재 라인의 시작에서 입력 모드
a 현재 커서 다음 위치에서 입력 모드
A 현재 라인의 끝에서 입력 모드
o 현재 라인 아래에 새 라인 추가 후 입력 모드
O 현재 라인 위에 새 라인 추가 후 입력 모드
입력 모드 종료
ESC 명령 모드로 돌아가기
i는 "insert", a는 "append", o는 "open new line"의 약자다.6. 파일 저장 및 종료
ex 모드(콜론 모드)에서 파일을 저장하고 종료한다.
6.1 파일 저장
ex 모드에서 입력 (: 입력 후 명령어 입력)
:w 현재 파일 저장
:w filename.txt 다른 이름으로 저장
:wq 저장하고 종료
:x 저장하고 종료 (변경사항이 있을 때만)
ZZ 저장하고 종료 (명령 모드에서, 대문자 Z 두 번)
6.2 종료 명령어
:q 종료 (변경사항이 없을 때만)
:q! 강제 종료 (변경사항 무시)
ZQ 저장하지 않고 종료 (명령 모드에서)
6.3 파일 읽기 및 쓰기
:r filename.txt 현재 커서 위치에 파일 내용 삽입
:w >> filename.txt 현재 내용을 파일에 추가 (append)
7. 검색 및 치환
vi에서 텍스트를 검색하고 치환하는 방법을 설명한다.
7.1 검색
명령 모드에서 입력
/search "search" 문자열을 아래로 검색
?search "search" 문자열을 위로 검색
n 다음 검색 결과로 이동
N 이전 검색 결과로 이동
* 현재 커서의 단어를 아래로 검색
현재 커서의 단어를 위로 검색
7.2 치환
ex 모드에서 입력
:s/old/new/ 현재 라인의 첫 번째 "old"를 "new"로 치환
:s/old/new/g 현재 라인의 모든 "old"를 "new"로 치환
:%s/old/new/g 문서 전체의 모든 "old"를 "new"로 치환
:%s/old/new/gc 문서 전체 치환 (각각 확인하며)
:5,10s/old/new/g 5번째부터 10번째 라인까지 치환
:%s/^ //g (라인 시작의 " " 제거)8. 고급 기능
8.1 여러 파일 편집
여러 파일 열기
vi file1.txt file2.txt file3.txt
ex 모드에서 파일 전환
:n 다음 파일로
:N 이전 파일로
:files 열린 파일 목록 보기
8.2 라인 번호 표시
:set number 라인 번호 표시
:set nonumber 라인 번호 숨기기
:set nu 라인 번호 표시 (줄임말)
:set nonu 라인 번호 숨기기 (줄임말)
8.3 기타 유용한 명령어
기타 명령어
. 마지막 명령 반복
~ 대소문자 전환
J 현재 라인과 다음 라인 합치기
r 현재 문자를 다른 문자로 교체
R 교체 모드 (여러 문자 교체)
>> 현재 라인 들여쓰기
<< 현재 라인 내어쓰기
:%!sort 문서 전체를 정렬
:set list 탭과 공백 문자 표시
:set nolist 탭과 공백 문자 숨기기
8.4 명령어 조합
명령어를 조합하면 더 강력하다:
명령어 조합 예제
d3w 3개 단어 삭제
y5j 아래 5줄 복사
c$ 커서 위치부터 라인 끝까지 변경 (입력 모드로 전환)
ci" 따옴표 안의 내용 변경
di( 괄호 안의 내용 삭제
va" 따옴표와 내용 선택 (visual mode)
8.5 vi 설정 파일 (.vimrc)
홈 디렉토리에 .vimrc 파일을 만들어 vi 설정을 저장할 수 있다:
~/.vimrc 예제
set number 라인 번호 표시
set tabstop=2 탭 크기 2칸
set shiftwidth=2 들여쓰기 크기 2칸
set expandtab 탭을 공백으로 변환
set autoindent 자동 들여쓰기
set syntax on 문법 하이라이팅
set hlsearch 검색 결과 하이라이트
set ignorecase 검색 시 대소문자 무시
마무리
vi는 처음 사용하면 어렵게 느껴지지만, 익숙해지면 매우 강력한 도구다. 서버 환경에서 파일을 편집할 때 필수적이며, 모든 리눅스 시스템에 기본으로 설치되어 있다.
가장 중요한 것은 모드를 이해하는 것이다. 명령 모드, 입력 모드, ex 모드를 구분하고, ESC 키로 항상 명령 모드로 돌아가는 습관을 기르자.
- 3가지 모드: 명령 모드, 입력 모드, ex 모드
- 종료:
:q!(강제 종료),:wq(저장 후 종료) - 입력 모드:
i,a,o - 삭제:
dd(라인),dw(단어) - 복사/붙여넣기:
yy,p - 검색:
/,? - 치환:
:%s/old/new/g

카카오톡 오픈 채팅 링크
https://open.kakao.com/o/seCteX7h
'개발 > BACK' 카테고리의 다른 글
| SpringBoot 파일 전송 구현하기 (MVC 패턴 + QueryDSL) (0) | 2025.12.24 |
|---|---|
| WEB-INF 정적 리소스 경로 찾기 - 로컬환경과 배포환경의 차이점 (0) | 2025.12.24 |
| Angular + Ionic + Capacitor에서 Firebase 완벽 연동 가이드 예제포 (0) | 2025.12.21 |
| Spring Boot 환경에서 "Java Error Occurred During Initialization of Boot Layer" 에러 해결 방법 (0) | 2024.07.12 |
| 리눅스에서 "Error Occurred During Initialization of VM" 에러 해결 방법 (0) | 2024.07.12 |