그래픽 환경 없는 원격 서버에도, 최소 설치 시스템에도 vi는 거의 예외 없이 존재한다. 그래서 관리자에게는 선택이 아니라 필수이다.
vi에서 vim으로.vi(visual editor)는 1976년 빌 조이(Bill Joy)가 만든 에디터이다. vim(Vi IMproved)은 1991년 브람 무레나르(Bram Moolenaar)가 vi를 개선해 만든 현대적 버전으로, 구문 강조, 다중 실행 취소, 분할 화면 등을 추가했다. 오늘날 대부분의 리눅스에서 vi를 입력하면 실제로는 vim이 실행된다.
vi를 이해하는 열쇠는 모드이다. 같은 키를 눌러도 어떤 모드에 있느냐에 따라 전혀 다르게 동작한다.
모드
역할
진입 방법
명령(Command) 모드
커서 이동, 복사/삭제, 명령 실행
시작 시 기본, Esc로 복귀
입력(Insert) 모드
실제 텍스트 입력
i, a, o 등
마지막 행(ex/Last-line) 모드
저장, 종료, 검색/치환
명령 모드에서 :
vi를 켜면 명령 모드에서 시작한다.
글자를 입력하려면 i 등을 눌러 입력 모드로 들어가고, 입력이 끝나면 Esc로 명령 모드로 돌아온다.
저장하거나 종료하려면 명령 모드에서 :를 눌러 마지막 행 모드로 들어간다.
왜 모드를 나누었을까? 일반 에디터는 글자 키가 곧 입력이고, 기능은 Ctrl이나 Alt 조합으로 처리한다. vi는 발상을 뒤집어, 명령 모드에서는 모든 글자 키가 편집 명령으로 작동한다. 덕분에 dd(행 삭제), yy(행 복사)처럼 손을 움직이지 않고 한두 타로 강력한 편집을 할 수 있다. 이 효율이 수십 년간 vi가 사랑받는 이유이다.
⚠️ 함정: i와 a, o와 O의 차이
시험에서 "커서 위치 다음부터 입력하는 키는?"이라고 물으면 답은 a(append)이지 i(insert)가 아니다. 또 o는 아래 행, O(대문자)는 위 행을 연다는 점, I는 행 맨 앞, A는 행 맨 끝이라는 점을 정확히 구분해야 한다. 대소문자 한 글자가 결과를 완전히 바꾼다.
h ← 왼쪽 한 칸
l → 오른쪽 한 칸
j ↓ 아래 한 행
k ↑ 위 한 행
w 다음 단어의 시작으로
b 이전 단어의 시작으로
e 단어의 끝으로
0 행의 맨 앞(0번 컬럼)으로
^ 행의 첫 글자(공백 제외)로
$ 행의 맨 끝으로
gg 파일의 첫 행으로
G 파일의 마지막 행으로
5G 5번째 행으로 (또는 :5)
Ctrl+f 한 화면 아래로(forward)
Ctrl+b 한 화면 위로(backward)
hjkl이 화살표가 된 이유.vi를 만든 빌 조이가 사용하던 ADM-3A 단말기에는 화살표 키가 없었고, h/j/k/l 키에 화살표가 그려져 있었다. 그래서 이 네 키가 이동 키가 되었다. 오늘날까지 이어진 이 관습 덕분에, vim 사용자는 손을 홈 포지션에서 떼지 않고도 빠르게 이동할 수 있다.
vi의 "잘라내기"는 곧 복사다.vi에는 별도의 클립보드가 없는 대신 레지스터(register)라는 임시 저장 공간이 있다. dd로 행을 삭제하면 그 내용이 레지스터에 저장되므로, p로 다른 곳에 붙여넣을 수 있다. 즉 dd는 "삭제"이자 동시에 "잘라내기"이다. 그래서 행 순서를 바꿀 때 dd 후 원하는 위치에서 p를 누르는 패턴을 자주 쓴다.
⚠️ 함정: :wq, :x, ZZ의 미묘한 차이:wq는 변경 여부와 관계없이 항상 파일을 다시 쓴다(타임스탬프가 갱신됨). :x와 ZZ는 변경된 경우에만 저장하므로, 내용을 안 바꿨다면 파일을 건드리지 않아 타임스탬프가 보존된다. 미세한 차이지만 시험에 출제되고, 빌드 시스템처럼 타임스탬프가 중요한 환경에서는 실무적으로도 의미가 있다.
ex 모드에서 s(substitute) 명령으로 텍스트를 치환한다. 문법은 sed와 매우 비슷하다.
%는 "파일 전체 행"을 의미하는 범위 지정자이다. :%s/.../.../g가 대표적인 패턴이다.
:s/old/new/ 현재 행의 첫 번째 old를 new로
:s/old/new/g 현재 행의 모든 old를 new로
:%s/old/new/g 파일 전체의 모든 old를 new로
:%s/old/new/gc 파일 전체 치환하되 매번 확인(confirm)
:1,10s/old/new/g 1~10행 범위에서 치환
:%s/old/new/gi 대소문자 무시하고 전체 치환
vi의 치환과 sed의 뿌리.vi의 ex 모드 치환 :%s/old/new/g와 sed의 s/old/new/g가 닮은 것은 우연이 아니다. 둘 다 행 단위 에디터 ed에서 비롯된 한 가족이기 때문이다. ed → ex → vi로 이어지는 계보를 알면, ex 모드 명령들이 왜 이런 문법인지 자연스럽게 이해된다.
set number " 행 번호 표시set autoindent " 자동 들여쓰기set tabstop=4 " 탭 너비 4칸set expandtab " 탭을 공백으로 변환set hlsearch " 검색 결과 강조(highlight)set ignorecase " 검색 시 대소문자 무시syntax on " 구문 강조 켜기
점(.) 으로 시작하는 설정 파일..vimrc, .bashrc처럼 점으로 시작하는 파일은 ls에 기본적으로 표시되지 않는 숨김 파일이다. 끝의 rc는 "run commands"의 약자로, 프로그램이 시작할 때 자동으로 실행하는 명령 모음이라는 뜻이다. 유닉스 초기 CTSS 시스템의 "runcom"에서 유래한 오래된 관습이다.
emacs는 vi와 함께 유닉스 양대 에디터로 꼽힌다. 리처드 스톨먼이 만들었으며, 사실상 운영체제에 가까울 만큼 확장성이 높다.
vi가 모드 기반이라면, emacs는 모든 기능을 Ctrl/Meta(Alt) 조합 키로 호출한다.
단축키
동작
Ctrl+X Ctrl+S
저장
Ctrl+X Ctrl+C
종료
Ctrl+K
행 끝까지 잘라내기
Ctrl+Y
붙여넣기
Ctrl+S
검색
vi vs emacs 논쟁. 수십 년간 이어진 "에디터 전쟁"에서 vi는 가볍고 어디에나 있다는 점, emacs는 무한히 확장 가능하다는 점으로 각각의 진영을 형성했다. 시험과 실무 관점에서는 어떤 최소 시스템에도 설치되어 있는 vi를 다룰 줄 아는 것이 가장 안전한 선택이다.
# 1. vi로 새 파일 만들기vi practice.txt# vi 안에서 차례대로:# i 를 눌러 입력 모드 진입# 아래 내용 입력:# Hello Linux# This is vi practice# Line three# Esc 를 눌러 명령 모드 복귀# 2. 커서 이동 연습 (명령 모드에서)# gg → 첫 행으로, G → 마지막 행으로# w → 단어 이동, $ → 행 끝, 0 → 행 처음# 3. 편집 연습# dd → 한 행 삭제, u → 실행 취소# yy 후 p → 행 복사 붙여넣기# 4. 검색과 치환# /vi 입력 후 Enter → vi 검색, n으로 다음# :%s/Line/행/g 입력 → Line을 행으로 전체 치환# 5. 저장하고 종료# :wq 입력 후 Enter# 6. 결과 확인cat practice.txtrm practice.txt
처음에는 모드 전환이 헷갈리지만, "글자가 안 들어가면 일단 Esc 후 i"라는 리듬을 익히면 금세 편해진다.