
리눅스의 대표 텍스트 편집기인 vi를 사용해보자.
우선 기본 vi 편집기는 가장 기본적인편집 기능만 있어, 여러 기능이 추가되어 향상된 vim(VI iMproved)를 사용하는 편이 낫다.



:q 를 입력한 후 엔터 키를 누른다.vi에는 명령, 입력, ex 세 가지 모드로 텍스트를 편집할 수 있다.
| 모드 | 설명 |
|---|---|
| 명령모드 | 텍스트 편집기에서 사용할 수 있는 일반적인 기능을 활용할 수 있는 모드 커서 이동, 텍스트 삭제, 복사, 붙여넣기 등을 할 수 있다. |
| 입력모드 | 실제 텍스트를 입력할 수 있는 모드 명령모드에서 a, i, o 등을 누르면 입력 모드로 전환하며, esc 키를 누르면 입력을 끝내고 다시 명령모드로 돌아온다. |
| ex모드 | 확장기능을 사용할 수 있는 모드 파일 저장, 편집기 종료, 텍스트 검색, 치환 등이 가능하다. : 을 눌러 ex모드로 전환하며, esc 키를 누르면 다시 명령모드로 돌아온다. |
vi 외 다른 편집기
- emacs : 기능이 강력한 텍스트 편집기. 다만 여러 기능을 제공하므로 사용법을 쉽게 익히기 어렵다는 단점이 있다.
- nano : vim이나 emacs보다 사용하기 쉬우며, 우분투에도 기본 설치 되어있다. 방향키를 이용해 커서를 이동하고
ctrl또는Alt와 특정 키를 함께 입력하여 텍스트를 편집한다.- gedit : 우분투 데스크톱에서 사용가능한 그래픽 환경의 텍스트 편집기. 앱 버튼을 누르고 메뉴에서 연필모양의 텍스트 편집키를 클릭하여 실행한다.
터미널에서gedit [파일명]형식으로 입력하여 실행도 가능하다.
vi 편집기에서는 글자단위, 단어단위, 줄단위로 커서를 이동할 수 있다.
| 키 | 설명 |
|---|---|
| h | 한 칸 왼쪽으로 이동 |
| l | 한 칸 오른쪽으로 이동 |
| j | 한 줄 아래로 이동 |
| k | 한 줄 위로 이동 |
| w | 다음 단어의 첫 글자로 이동(word), 각 특수 문자를 단어로 취급 |
| W | 다음 단어의 첫 글자로 이동, 공백 단위로 이동 |
| b | 이전 단어의 첫 글자로 이동, 각 특수 문자를 단어로 취급 |
| B | 이전 단어의 첫 글자로 이동, 공백 단위로 이동 |
| e | 다음 단어의 마지막 글자로 이동(end word), 각 특수 문자를 단어로 취급 |
| E | 다음 단어의 마지막 글자로 이동, 공백 단위로 이동 |
| ^ | 커서가 있는 줄의 처음으로 이동 |
| $ | 커서가 있는 줄의 마지막으로 이동 |
enter | 다음 줄의 첫 글자로 이동 |
| } | 다음 문단으로 이동 |
| { | 이전 문단으로 이동 |
| ( | 다음 문장으로 이동 |
| ) | 이전 문장으로 이동 |
| gg | 파일 처음 위치로 이동 |
| G | 파일 마지막 위치로 이동 |
명령모드에서 입력모드로 전환하는 입력 키는 a(append), i(insert), o(open) 이다. 대문자와 소문자 키의 기능이 다르므로 주의한다.
| 키 | 설명 |
|---|---|
| a | 커서 위치의 다음 칸부터 입력 |
| A | 커서가 있는 줄의 끝부터 입력 |
| i | 커서 위치부터 입력, insert도 같은 기능 |
| I | 커서가 있는 줄의 맨 앞에서부터 입력 |
| o | 커서 바로 아래에 줄을 만들고 입력 |
| O | 커서 바로 위에 줄을 만들고 입력 |
기본적인 삭제 키는 x(backspace), d(delete) 이다.
| 키 | 설명 |
|---|---|
| x | 커서 위치의 글자 삭제 |
| X | 커서 바로 앞의 글자 삭제 |
| dh | 커서 바로 앞의 글자 삭제(delete + h), X와 동일 |
| dl | 커서 위치의 글자 삭제(delete + l), x와 동일 |
| dj | 커서가 있는 줄과 그 다음 줄을 삭제(delete + j) |
| dk | 커서가 있는 줄과 그 앞줄을 삭제(delete + k) |
| dw | 한 단어를 삭제(delete word) |
| d0 | 커서 위치부터 줄의 처음까지 삭제(delete + 0) |
| d$ | 커서 위치부터 줄의 끝까지 삭제(delete + $) |
| D | d$와 동일 |
| dd | 커서가 있는 줄을 삭제 |
| dgg | 커서가 있는 위치부터 처음 위치까지 모두 삭제(delete + gg) |
| dG | 커서가 있는 위치부터 파일 마지막 위치까지 모두 삭제(delete + G) |
명령모드에서 사용할 수 있는 수정 키는 r(replace), s(subst), c(change) 이다.
| 키 | 설명 |
|---|---|
| r | 커서 위치의 한 글자 수정 |
| R | 커서 위치부터 esc를 누를 때 까지 다른 글자로 수정, 단 같은 줄에만 해당 |
| s | 커서 위치의 한 글자를 지우고 입력 모드에서 수정 |
| S | 커서가 있는 줄을 지우고 입력 모드에서 수정 |
| ch | 커서 바로 앞의 한 글자를 지우고 입력 모드에서 수정(change + h), S와 동일 |
| cl | 커서 위치의 한 글자를 지우고 입력 모드에서 수정(change + l), s와 동일 |
| cj | 커서가 있는 줄과 그 다음 줄을 수정(change + j) |
| ck | 커서가 있는 줄과 그 앞줄을 수정(change + k) |
| cw | 커서 위치부터 한 단어를 수정(change word) |
| c0 | 커서 위치부터 줄의 처음을 지우고 입력 모드에서 수정(change + 0) |
| c$ | 커서 위치부터 줄의 끝까지 지우고 입력 모드에서 수정(change + $) |
| C | c$와 동일 |
| cc | 커서가 있는 줄을 지우고 입력 모드에서 수정 |
| J | 커서가 있는 줄과 다음 줄을 연결(join) |
복사 키는 y(yank), 붙여넣기는 p(paste) 이다.
| 키 | 설명 |
|---|---|
| yw | 커서 위치부터 단어 끝까지 복사(yank word) |
| y0 | 커서 위치부터 줄의 처음까지 복사(yank + 0) |
| y$ | 커서 위치부터 줄의 끝까지 복사(yank + $) |
| yy | 커서가 있는 줄을 복사 |
| yj | 커서가 있는 줄과 그 다음줄을 복사(yank + j) |
| yk | 커서가 있는 줄과 그 앞줄을 복사(yank + k) |
| p | 커서의 다음 위치에 붙여넣기 |
| P | 커서가 있는 위치에 붙여넣기 |
작업 취소는 u(undo), 다시 실행은 ctrl + r(redo) 이다. 취소된 작업에 한해서만 재실행이 가능하며 .는 명령을 반복한다.
| 키 | 설명 |
|---|---|
| u | 작업 취소 |
| U | 그 줄에 행해진 작업 모두 취소 |
| ctrl + r | 다시 실행 |
| . | 조금전에 했던 명령 반복 |
명령모드에서 텍스트를 검색할 수 있는 키는 /와 ?이다. 파일 내에 동일한 텍스트가 더 있는지 찾으려면 n(next)를 사용한다.
| 키 | 설명 |
|---|---|
| /[검색어] | 현재 커서를 기준으로 후방으로 텍스트 검색 |
| ?[검색어] | 현재 커서를 기준으로 전방으로 텍스트 검색 |
| n | 같은 방향으로 검색할 텍스트를 계속 검색 |
| N | 반대 방향으로 검색할 텍스트를 계속 검색 |
명령 모드에서 블록으로 영역을 선택하려면 v(visual)을 누른다.
영역 지정 후 y를 누르면 명령 모드로 돌아오면서 선택한 영역을 복사하며, 명령모드에서 다시 p를 눌러 복사한 내용을 붙여넣기 할 수 있다.
| 키 | 설명 |
|---|---|
| v | 커서가 위치한 곳부터 블록 지정 |
| V | 커서가 있는 줄부터 블록 지정 |
vi [파일명] 형식으로 새로 생성하거나 추가할 파일 이름과 함께 vi 편집기를 실행한다.

파일을 새로 생성하는 경우 위처럼 파일 명 오른쪽에 새 파일임이 표시된다.
틸트(~) 표시는 줄이 비어있다는 의미이다.
현재 상태는 명령모드이다.
a 또는 i를 누르면 화면 아래 정보가 다음과 같이 변경되며 입력모드로 전환된다.

한글 입력도 가능하나, 입력모드로 전환하는 a 또는 i는 반드시 영문 상태에서 입력해야한다.
파일 저장을 위해서는 다시 명령모드로 전환 후 ex모드로 전환해야한다.
파일 내용을 모두 입력했다면 esc 키를 눌러 명령 모드로 전환한다.

화면 아래 끼워넣기 또는 INSERT 문구가 사라졌다면 :을 눌러 ex모드로 전환하여 명령어를 입력한다.
이때, :wq는 파일을 저장하고 vi를 종료하여 명령행으로 되돌아가는 ex 명령이다.

명령행 프롬프트가 나타나면 ls 또는 cat 명령으로 파일이 제대로 생성되었는지 확인해본다.

문자열 복사 후 붙여넣기 실습을 해보자.
우선 파일을 다시 vi로 열고, 복사할 단어 앞으로 커서를 옮긴 후 v 키를 누르면 화면 아래 메시지가 비주얼 또는 VISUAL 로 바뀐다.

커서 이동 키를 누르면 텍스트를 블록으로 지정할 수 있다. 오른쪽 화살표를 눌러 문장 마지막까지 이동한 후 y를 누르면 비주얼 표시가 사라지며 다시 명령모드로 돌아온 것을 볼 수 있다.

내용을 붙여넣을 위치에 커서를 위치시키고 p를 누르면 복사한 내용을 불러온다.

dd를 누르면 커서가 있는 줄이 삭제된다.

커서를 가장 아래로 옮긴 후 다시 p를 누르면 삭제했던 줄을 불러온다.

y와 p가 복사, 붙여넣기라면 d와 p는 잘라내기와 붙여넣기로 볼 수 있다.
ex 명령의 장점은 일반 명령보다 빠르고 효율적으로 처리할 수 있다는 것이다.
한 번 실행으로 동시에 여러 부분을 변경할 수 있다.
| 키 | 설명 |
|---|---|
| :q | 아무런 변경 하지 않았을 때 종료 |
| :q! | 변경된 내용을 저장하지 않고 강제 종료 |
| :wq | 저장하고 종료 |
| :x | wq와 같은 기능 |
| :w | [파일]:새 이름으로 파일 저장(write) |
| 명령 | 설명 |
|---|---|
| :sh | 셸을 실행한다. exit명령 또는 ctrl + D를 눌러 vim으로 되돌아 올 수 있다 |
| :15 | 행 번호 15로 이동한다 |
| :r [파일명] | 파일 내용을 읽어 현재 위치 아래에 삽입(read)한다 |
| ;10,20w [파일명] | 10번부터 20번 줄까지 파일에 쓰기(write)한다 |
| :10,20d | 10번부터 20번 줄까지 삭제(delete)한다 |
| :0,$4-d | 0번부터 끝에서 네줄까지 제외($-4)하고 모두 삭제한다 |
| :20,25y | 20번부터 25번 줄까지 복사(yank)한다 |
| :10,15m40 | 10번부터 15번 줄까지 40번 줄 아래로 옮긴다(move) |
| :10,15co40 | 10번부터 15번 줄까지 40번 줄 아래로 복사(copy)한다 |
| :s/abc/def | 커서 위치부터 줄 끝까지 처 |
| :10,15s/abc/def | 10번부터 15번 줄까지 40번 줄 아래로 복사(copy)한다 |
| s/abc/def/g | 커서 위치부터 줄 끝까지 모든 문자열 abc를 def로 바꾼다 |
| :%s/abc/def/g | 파일 전체에서(%) 줄 끝까지 모든 문자열 abc를 def로 바꾼다 |
| :g/abc/m0 | 파일에서 문자열 abc를 포함하는 줄을 찾아 맨 위(행 번호0)으로 옮긴다 |
| :v/abc/m0 | 파일에서 문자열 abc를 포함하지 않는 줄을 찾아 맨 위로 옮긴다 |
| :10,15g/abc/m0 | 10번부터 15번 줄까지 문자열 abc를 포함하는 줄을 찾아 맨 위로 옮긴다 |
아래 명령어는 16번줄을 2번 줄로 옮긴다.

[시작 행 번호],[끝 행 번호] 형태로 명령을 적용할 줄을 선택할 수도 있다.
아래 명령어는 1번줄과 2번줄을 복사하여 3번줄 뒤에 붙인다.

문자열 치환도 가능하다.
파일 전체(%)에서 모든(g) 문자열 ball game을 찾아 BASEBALL GAME으로 바꾼다(s)


ex 모드에서 set 명령을 사용하면 vi 환경 설정 내용을 변경할 수 있다.
| 명령 | 설명 |
|---|---|
| :set number | 줄마다 행 번호 보이도록 설정. 단축 명령어는 se nu행 번호 해제하려면 set nonumber 또는 set nonu라고 입력한다 |
| :syntax on | 구문 강조 기능 사용 |
| :set autoindent | 자동 들여쓰기 기능 사용 |
| :set smartindent | 똑똑한 들여쓰기 기능 사용 |
| :set cindent | C 프로그램 들여쓰기 사용 |
| :set shiftwidth=4 | 들여쓰기 4칸으로 설정 |
| :set expandtab | tab을 누르면 공백 삽입 |
| :set tabstop=4 | 기본적인 탭 간격은 8칸인데 4칸으로 변경 |
| :set paste | 터미널에서 붙여넣을 때 자동 들여쓰기 활성화 |
| :set hlsearch | /나 ?로 검색한 텍스트 강조. 해제하려면 :nohl을 입력한다 |
| :set showmatch | 일치하는 괄호 강조 |
| :set ruler | 현재 커서 위치 표시 |
set 명령을 별도의 설정파일 .vimrc로 홈 디렉토리에 저장해두면 나만의 vim 환경을 만들 수 있다.
