8편 · 에디터 — vi/vim
이번 강의에서 배울 것
- vi·vim·emacs·nano·pico·gedit의 개발자와 특징을 구분한다.
- vi의 명령 모드·입력 모드·ex 모드와 모드 전환 키를 설명한다.
- 이동·삭제·복사·붙여넣기·검색·치환(:%s/a/b/g)·저장 명령을 정확히 쓴다.
- set 옵션(nu, ai, ic, ts…)과 설정 파일, vim 실행 옵션(+n, -R, -r, -o, -O)을 활용한다.
학습 경로 · 2과목 4장
← 7편 · 프로세스 관리 · 다음: 9편 · 소프트웨어 설치 →
범위: 2과목 4장 "에디터" — 편집기의 종류와 특징, vi/vim의 모드와 명령(이동, 편집, 검색, 치환, 저장), 환경 설정, 실행 옵션.
형광펜 읽는 법: 노랑 핵심 정의·결론 · 빨강 시험에서 헷갈리는 구분·함정 · 파랑 외워야 할 순서·목록
단원 도입
| 출제 포인트 | 빈도 | 이렇게 나온다 |
|---|---|---|
치환 명령 :%s/old/new/g, 범위 지정 | ★★★ | "파일 전체의 A를 B로 바꾸는 명령은?" |
| 편집기와 개발자·특징 (vi, vim, emacs, nano, pico, gedit) | ★★★ | 설명 → 편집기 이름 |
| 모드 전환 키 (i a o, ESC, :) | ★★★ | "입력 모드로 바꾸는 키가 아닌 것은?" |
저장·종료 (:wq, :q!, :x, ZZ) | ★★ | 저장하지 않고 강제 종료 |
| 이동·편집 명령 (dd, yy, p, x, u, G, gg) | ★★ | 동작 → 명령 |
| set 옵션 (nu, ai, ic, ts) | ★★ | 행 번호 표시 |
vim 실행 옵션 (+n, -R, -r, -o, -O) | ★ | 특정 행에서 열기, 읽기 전용 |
PART 1 · 편집기의 종류
1. 리눅스의 대표 편집기
핵심 필기
| 편집기 | 개발 | 특징 |
|---|---|---|
| ed | 켄 톰프슨(Ken Thompson) | 유닉스 초기 라인 편집기, 한 줄씩 명령으로 편집 |
| ex | 빌 조이 | ed를 개선한 라인 편집기 — vi의 콜론(:) 명령이 여기서 왔다 |
| vi | 빌 조이(Bill Joy), BSD, 1976 | ex의 비주얼(visual) 모드로 출발한 화면 편집기, 모드형, 거의 모든 유닉스·리눅스에 기본 설치 |
| vim | 브람 무를레나르(Bram Moolenaar), 1991 | Vi IMproved — 문법 강조(구문 색), 다단계 실행 취소, 창 분할, 비주얼 블록, 플러그인 |
| emacs | 리처드 스톨먼(Richard Stallman), GNU Emacs 1984 | LISP으로 확장하는 강력한 편집 환경, 모드가 없고 Ctrl·Alt(Meta) 조합 키 사용 |
| pico | 워싱턴 대학교 | 메일 프로그램 Pine에 딸린 쉬운 편집기, 화면 아래에 단축키 안내 |
| nano | GNU 프로젝트(크리스 알레그레타), 1999 | pico를 복제·개선한 자유 소프트웨어 편집기, 초보자용 |
| gedit | GNOME 프로젝트 | GNOME 데스크톱의 기본 GUI 텍스트 편집기 |
| kate / kwrite | KDE 프로젝트 | KDE의 GUI 편집기 |
PART 2 · vi의 모드와 기본 조작
2. vi의 세 가지 모드
핵심 필기
| 모드 | 다른 이름 | 하는 일 |
|---|---|---|
| 명령 모드 | 일반(normal) 모드 | vi를 열면 처음 있는 모드. 커서 이동, 삭제, 복사, 붙여넣기 |
| 입력 모드 | 편집(insert) 모드 | 글자를 실제로 입력 |
| ex 모드 | 콜론 모드, 라인 모드, 마지막 행 모드 | 화면 맨 아래 줄에서 : 명령 — 저장, 종료, 치환, 설정 |
모드 전환
- 명령 → 입력:
iaoIAO,sSRc… - 입력 → 명령:
ESC - 명령 → ex:
:(검색은/,?) - ex → 명령: 명령 실행 후
Enter(자동 복귀) 또는ESC
그림 8-1 · vi의 세 모드와 전환 키 — 누르면 원본 크기로 열린다.
3. 입력 모드로 들어가는 명령
핵심 필기
| 키 | 입력 시작 위치 |
|---|---|
i | 커서 앞(현재 글자 앞) |
a | 커서 뒤 |
o | 현재 줄 아래에 새 줄 |
I | 현재 줄의 맨 앞(첫 비공백 문자) |
A | 현재 줄의 맨 끝 |
O | 현재 줄 위에 새 줄 |
s | 커서 글자를 지우고 입력 |
S (= cc) | 현재 줄을 지우고 입력 |
cw | 커서부터 단어 끝까지 지우고 입력 |
R | 덮어쓰기(치환) 모드 — ESC까지 계속 덮어씀 |
r | 한 글자만 바꾸고 명령 모드에 그대로 남음 |
4. 커서 이동
핵심 필기
| 키 | 이동 |
|---|---|
h j k l | 왼쪽 · 아래 · 위 · 오른쪽 |
w / b / e | 다음 단어 처음 / 이전 단어 처음 / 단어 끝 |
0 / ^ / $ | 줄의 맨 앞 / 첫 비공백 문자 / 줄의 맨 끝 |
gg (= 1G) | 파일 첫 줄 |
G | 파일 마지막 줄 |
nG (= :n) | n번째 줄 |
H / M / L | 화면 맨 위 / 가운데 / 맨 아래 줄 |
Ctrl+f / Ctrl+b | 한 화면 아래 / 위 (forward / backward) |
Ctrl+d / Ctrl+u | 반 화면 아래 / 위 (down / up) |
) ( / } { | 다음·이전 문장 / 다음·이전 문단 |
% | 짝이 맞는 괄호로 |
5. 삭제 · 복사 · 붙여넣기 · 취소
핵심 필기
| 키 | 동작 |
|---|---|
x / X | 커서 글자 / 커서 앞 글자 삭제 |
dw | 단어 삭제 |
dd / ndd | 현재 줄 / n줄 삭제 (삭제한 내용은 버퍼에 남아 붙여넣기 가능 = 잘라내기) |
D (= d$) | 커서부터 줄 끝까지 삭제 |
d0 | 줄 처음부터 커서 앞까지 삭제 |
dG / dgg | 커서 줄부터 파일 끝 / 파일 처음까지 삭제 |
yy (= Y) / nyy | 현재 줄 / n줄 복사(yank) |
yw | 단어 복사 |
p / P | 커서 아래(뒤) / 위(앞)에 붙여넣기 |
u | 직전 작업 취소(undo) |
U | 현재 줄의 변경을 한꺼번에 취소 |
Ctrl+r | 다시 실행(redo, vim) |
. | 직전 편집 명령 반복 |
J | 아래 줄을 현재 줄 끝에 이어 붙임(join) |
~ | 커서 글자의 대소문자 전환 |
$ cat t.txt
linux linux
unix linux
windows
linux master
$ vim -es -c 'normal ggddp' -c 'wq' t.txt # 첫 줄 잘라 두 번째 줄 아래에 붙이기
$ cat t.txt
unix linux
linux linux
windows
linux masterddp는 "두 줄의 순서 바꾸기"로 자주 쓰는 조합이다.
PART 3 · 검색·치환과 ex 명령
6. 검색
핵심 필기
| 명령 | 뜻 |
|---|---|
/문자열 | 커서 아래 방향(앞쪽)으로 검색 |
?문자열 | 커서 위 방향(뒤쪽)으로 검색 |
n | 같은 방향으로 다음 결과 |
N | 반대 방향으로 다음 결과 |
* (vim) | 커서 아래 단어를 앞으로 검색 |
7. 치환 (substitute)
핵심 필기
형식: :[범위]s/찾을문자열/바꿀문자열/[플래그]
| 명령 | 뜻 |
|---|---|
:s/a/b/ | 현재 줄의 첫 번째 a만 b로 |
:s/a/b/g | 현재 줄의 모든 a를 b로 |
:%s/a/b/g | 파일 전체의 모든 a를 b로 |
:%s/a/b/ | 파일 전체에서 각 줄의 첫 번째 a만 |
:%s/a/b/gc | 전체를 바꾸되 하나씩 확인(confirm) |
:n,ms/a/b/g | n번째 줄부터 m번째 줄까지 |
:.,$s/a/b/g | 현재 줄(.)부터 마지막 줄($)까지 |
:%s/a/b/gi | 대소문자 무시(vim) |
:g/패턴/s/a/b/g | 패턴이 있는 줄에서만 치환 |
범위 기호: . 현재 줄, $ 마지막 줄, % 전체(= 1,$), n,m n–m번째 줄.
8. 저장 · 종료 · 파일 다루기 (ex 명령)
핵심 필기
| 명령 | 뜻 |
|---|---|
:w | 저장 |
:w 파일 | 다른 이름으로 저장 |
:n,mw 파일 | n–m번째 줄만 파일로 저장 |
:q | 종료 (변경이 있으면 거부) |
:q! | 저장하지 않고 강제 종료 |
:wq | 저장 후 종료 |
:wq! | 강제 저장 후 종료 (읽기 전용 파일, 권한이 있을 때) |
:x / ZZ | 저장 후 종료 (변경이 있을 때만 기록) |
ZQ (vim) | 저장하지 않고 종료 (= :q!) |
:e 파일 | 다른 파일 열기 |
:e! | 마지막 저장 상태로 되돌리기 |
:r 파일 | 파일 내용을 커서 아래로 읽어 넣기 |
:r !명령 | 명령 실행 결과를 커서 아래에 넣기 |
:!명령 | vi를 나가지 않고 셸 명령 실행 |
:sh | 셸로 잠시 나감 (exit로 복귀) |
:n,md | n–m번째 줄 삭제 |
:n,m co k / :n,m m k | n–m번째 줄을 k번째 줄 아래로 복사 / 이동 |
:n / :N (:prev) | 여러 파일을 열었을 때 다음 / 이전 파일 |
$ vim -es -c '1,2w! part.txt' -c '$r !echo appended' -c 'wq' t.txt
$ cat part.txt # 1–2줄만 따로 저장됨
linux linux
unix linux
$ tail -1 t.txt # 명령 결과가 마지막 줄 아래에 들어감
appendedPART 4 · 환경 설정과 실행 옵션
9. set 옵션과 설정 파일
핵심 필기
| 옵션 | 줄임 | 뜻 |
|---|---|---|
:set number | :set nu | 행 번호 표시 (해제 :set nonu) |
:set autoindent | :set ai | 윗줄과 같은 들여쓰기 자동 적용 (해제 :set noai) |
:set ignorecase | :set ic | 검색 시 대소문자 무시 (해제 :set noic) |
:set tabstop=4 | :set ts=4 | 탭 문자를 몇 칸으로 보일지 |
:set shiftwidth=4 | :set sw=4 | 자동 들여쓰기·>> 이동 폭 |
:set list | 탭(^I)과 줄 끝($) 같은 숨은 문자 표시 | |
:set hlsearch | :set hls | 검색어 강조 (vim) |
:set showmode | :set smd | 아래에 -- INSERT -- 같은 모드 표시 |
:set ruler | :set ru | 커서 위치(줄, 열) 표시 |
:syntax on | :sy on | 문법 강조 (vim) |
:set | 기본값에서 바뀐 옵션 목록 | |
:set all | 전체 옵션 목록 |
no 접두사를 붙이면 끄고(nonu), 이름 뒤에 !를 붙이면 토글한다(:set nu!).
설정 파일 — 열 때마다 자동 적용
| 파일 | 대상 |
|---|---|
~/.exrc | vi(ex) 개인 설정 |
~/.vimrc | vim 개인 설정 |
/etc/vimrc (레드햇 계열) · /etc/vim/vimrc (데비안 계열) | vim 전역 설정 |
" ~/.vimrc — 큰따옴표로 시작하는 줄은 주석, 콜론 없이 적는다
set nu
set ai
set ts=4
syntax on10. vim 실행 옵션
핵심 필기
| 실행 형태 | 뜻 |
|---|---|
vi 파일 | 파일 열기 (없으면 새 파일) |
vi +n 파일 | n번째 줄에서 커서 시작 |
vi + 파일 | 마지막 줄에서 시작 |
vi +/패턴 파일 | 패턴이 처음 나오는 줄에서 시작 |
vi -R 파일 (= view 파일) | 읽기 전용으로 열기 |
vi -r 파일 | 비정상 종료로 남은 스왑 파일(.파일.swp)로 복구 |
vi -r | 복구 가능한 스왑 파일 목록 |
vim -o 파일1 파일2 | 창을 가로(위아래)로 분할해 여러 파일 열기 |
vim -O 파일1 파일2 | 창을 세로(좌우)로 분할 |
vim -p 파일1 파일2 | 탭 페이지로 열기 |
vim -d 파일1 파일2 (= vimdiff) | 두 파일 비교(diff) 모드 |
vim -c 명령 파일 | 파일을 연 뒤 ex 명령 실행 |
vim -n 파일 | 스왑 파일을 만들지 않음 |
$ vim +25 /etc/ssh/sshd_config # 25번째 줄에서 바로 시작
$ view /etc/passwd # 읽기 전용 (vi -R 과 같다)
$ vim -O httpd.conf httpd.conf.bak # 좌우로 나란히 비교하며 편집창 분할 (vim 안에서): :split(:sp) 가로 분할, :vsplit(:vs) 세로 분할, Ctrl+w w 다음 창으로 이동, :q로 현재 창 닫기. 비주얼 모드는 v(글자 단위), V(줄 단위), Ctrl+v(블록 단위).
기출 유형 연습
vi 편집기에서 파일 전체의 unix를 모두 linux로 바꾸는 명령은?
힌트 1 보기
"파일 전체"는 범위 기호, "모두"는 플래그다. 찾을 문자열이 앞이다.
정답·해설 보기
C. %는 전체 줄, g는 줄 안의 모든 일치. A는 현재 줄 첫 번째만, B는 현재 줄 전체만, D는 방향이 반대다.
다음 중 vi의 명령 모드에서 입력 모드로 전환하는 키가 아닌 것은?
힌트 1 보기
넷 중 하나는 글자를 지우는 명령이다.
정답·해설 보기
C. x는 커서 글자를 삭제하고 명령 모드에 머문다. a(커서 뒤), o(아래 새 줄), I(줄 맨 앞)는 입력 모드로 들어간다.
편집기와 설명의 연결이 틀린 것은?
힌트 1 보기
원조와 복제판을 바꿔 놓았다.
정답·해설 보기
C. Pine용으로 워싱턴 대학교가 만든 것은 pico이고, nano는 pico를 복제·개선한 GNU 편집기다.
vi에서 편집한 내용을 저장하고 종료하는 방법이 아닌 것은?
힌트 1 보기
느낌표는 "변경을 무시하고"라는 뜻이다.
정답·해설 보기
D. :q!는 저장하지 않고 강제로 종료한다. 나머지 셋은 저장 후 종료다.
두 파일을 좌우로 나란히(세로 분할) 열어 편집하려 할 때 알맞은 명령은?
힌트 1 보기
대문자와 소문자 o 가운데 "세로 분할" 쪽이다.
정답·해설 보기
B. -O는 세로 분할(좌우), -o는 가로 분할(위아래), -R은 읽기 전용, +2는 2번째 줄에서 시작이다.
vi 명령 모드에서 현재 줄을 복사해 바로 아랫줄에 붙여 넣는 키 조합은?
힌트 1 보기
복사는 yank, 아래(뒤)에 붙이는 것은 소문자.
정답·해설 보기
B. yy로 현재 줄 복사, p로 아래에 붙여넣기. A는 줄을 잘라 아래로 옮기기(두 줄 순서 바꾸기), C는 위에 붙여넣기, D는 두 글자 순서 바꾸기다.
단원 마무리
장 요약
| 주제 | 꼭 기억할 것 |
|---|---|
| 편집기 | vi = Bill Joy, vim = Bram Moolenaar, emacs = Richard Stallman(LISP), pico = Pine(워싱턴대), nano = pico 복제(GNU), gedit = GNOME |
| 모드 | 명령 모드 ⇄ 입력 모드(i a o / ESC), 명령 모드 ⇄ ex 모드(: / Enter) |
| 이동 | hjkl, 0 $, gg G nG, w b, Ctrl+f Ctrl+b |
| 편집 | x, dd, yy, p/P, u, ., J, r/R |
| 검색·치환 | / 아래, ? 위, n/N. :%s/old/new/g — % 전체, g 줄 안 모두, c 확인 |
| 저장·종료 | :w, :q, :q!, :wq = :x = ZZ, :r 파일, :!명령 |
| 설정 | :set nu ai ic ts= list, ~/.exrc, ~/.vimrc (콜론 없이) |
| 실행 옵션 | +n 줄, -R 읽기 전용(view), -r 복구, -o 가로 분할, -O 세로 분할, -d 비교 |
책을 덮고 꺼내 보기
- vi의 개발자는 , vim의 개발자는 다.
- pico를 개선한 GNU 편집기는 다.
- 입력 모드에서 명령 모드로 돌아가는 키는 다.
- 커서 아래에 새 줄을 열고 입력하는 키는 다.
- 파일 전체의 a를 b로 모두 바꾸는 명령은 다.
- 저장하지 않고 강제 종료하는 명령은 다.
- 행 번호를 표시하는 설정은 다.
- 파일을 읽기 전용으로 여는 옵션은 이다.
vi의 세 모드와 전환 키는?
명령 모드(시작 모드) → 입력 모드는 i·a·o·I·A·O 등, 입력 → 명령은 ESC. 명령 → ex 모드는 :(검색은 / ?), ex 명령 실행 후 Enter로 명령 모드 복귀.
i, a, o, I, A, O의 입력 위치는?
i 커서 앞, a 커서 뒤, o 아래 새 줄, I 줄 맨 앞, A 줄 맨 끝, O 위 새 줄.
:s/a/b/, :s/a/b/g, :%s/a/b/g, :%s/a/b/gc 의 차이는?
현재 줄 첫 번째만 / 현재 줄 모두 / 파일 전체 모두 / 파일 전체 모두를 하나씩 확인하며.
저장·종료 명령 :w, :q, :q!, :wq, :x, ZZ 의 뜻은?
저장 / 종료(변경 있으면 거부) / 저장 없이 강제 종료 / 저장 후 종료 / 저장 후 종료(변경 있을 때만 기록) / 명령 모드에서 저장 후 종료.
vim 실행 옵션 +n, -R, -r, -o, -O 는?
n번째 줄에서 시작, 읽기 전용(view), 스왑 파일로 복구, 가로 분할로 여러 파일, 세로 분할로 여러 파일.
dd, yy, p, P, u, x, J 의 동작은?
줄 삭제(잘라내기), 줄 복사, 아래(뒤)에 붙여넣기, 위(앞)에 붙여넣기, 실행 취소, 글자 삭제, 아랫줄 이어 붙이기.
vi·vim의 개인 설정 파일은?
vi는 ~/.exrc, vim은 ~/.vimrc. 전역은 /etc/vimrc(레드햇) 또는 /etc/vim/vimrc(데비안). 파일 안에는 set nu처럼 콜론 없이 적는다.
다음으로 갈 기준: 치환 명령의 %와 g의 역할, 저장·종료 명령 여섯 개를 보지 않고 말할 수 있으면 다음 편으로 간다: 9편 · 소프트웨어 설치.
정답과 해설
확인 문제 정답
- nano — pico는 Pine 메일 프로그램과 함께 배포된 원조, nano는 그 GNU 복제판.
- emacs(GNU Emacs).
3dd.- 마지막 줄
G, 첫 줄gg(또는1G,:1). O(대문자). 소문자o는 아래에 새 줄.:%s/http/https/g.:10,20w backup.txt.:q!(vim에서는ZQ도 같다).- 표시
:set nu(:set number), 해제:set nonu. vi -R /etc/fstab,view /etc/fstab.
내용을 이해했다면 학습 완료를 체크해 주세요.