23.10.26 최초 작성
리눅스 환경에서 주로 사용하는 문서 편집기로는 크게 행 단위 편집기, 화면 단위 편집기로 나눌 수 있다. 이 중 vi의 기능과 특징에 대해 알아보도록 한다.
| 화면 단위 편집기 | 특징 |
|---|---|
| vi | 리눅스에서 일반적으로 사용하는 편집기 |
| emacs | 제공하는 기능이 다양하지만 사용법이 복잡하다 |
| 행 단위 편집기 | 특징 |
|---|---|
| ed | 유닉스 초기의 행 편집기 |
| ex | 주로 vi와 조합해 vi에 기능을 더 편리하게 하는 역할 |
| sed | 지시된 명령에 따라 파일의 내용을 일괄적으로 바꿔 출력 |
vi 에디터의 설정은 홈 디렉토리의 .exrc 파일로 저장
환경 변수를 EXTINIT에 지정
vi의 마지막 행 모드에서 설정 가능
| 환경 설정 명령 | 기능 |
|---|---|
| :set nu | 파일에 각 행 번호를 표시 (실제 값 X) |
| :set nonu | 행 번호를 감춤 |
| :set list | 눈에 보이지 않는 특수문자 표시 |
| :set nolist | 특수문자 감춤 |
| :set showmode | 현재 모드 표시 |
| :set noshowmode | 현재 모드 감춤 |
| :set | set으로 설정한 모든 vi 환경 설정 값 출력 |
| :set all | 모든 vi 환경 변수와 현재 값 출력 |
사용자 홈 디렉토리에 .exrc 파일로 저장
기본적으로 없는 파일이므로 직접 작성해야 함
파일에는 set 명령과 옵션 지정
vi 실행시 마다 적용됨
set nu
set list
EXINIT = 'set nu list'
export EXINIT
au FileType * setl fo-=cro
syntax on / off
set number / nonumber
set wrap / nowrap
set hlsearch
set ignorecase
set ts = 4
au BufReadPost * if line("'\'")|execute("normal '\"")|endif

명령 모드 : 파일의 내용을 수정, 복사, 붙여넣기 등의 작업을 수행하는 모드입력 모드 : 파일의 내용을 입력하는 모드마지막 행 모드 : 문서 작성을 마무리하고 검색, 저장 등의 작업을 하는 모드vi [filename] ///filename을 이름으로 가진 파일을 생성하고 편집을 시작한다.
| 입력 | 기능 |
|---|---|
| :q | vi에서 작업한 것이 없을 때 종료 |
| :q! | 작업한 내용을 저장하지 않고 종료 |
| :w[파일명] | 작업한 내용을 저장 |
| :wq, :wq! | 작업한 내용을 저장하고 종료 |
| 범위 지정 | 기능 |
|---|---|
| 1.$, 1.% | 1행부터 마지막 행까지 지정 |
| 1.. | 1행부터 커서가 있는 행까지 지정 |
| ..$ | 커서가 있는 행부터 마지막 행까지 지정 |
| .-3 | 현재 행과 이전 세 행까지 지정 |
| 10.20 | 10행부터 20행 지정 |
| 복사, 잘라내기 | 기능 |
|---|---|
| :(번호)y | 지정한 행 복사 (1y) |
| :(번호.번호)y | 범위로 지정한 행 복사 (2.4y) |
| :(번호)d | 지정한 행 잘라내기 (3d) |
| :(번호.번호)d | 지정한 행 잘라내기 (1.4d) |
| :pu | 현재 행 다음에 버퍼의 내용 붙이기 |
| :(번호)pu | 지정핸 행 다음에 버퍼의 내용 붙이기 (4pu) |
| 검색 (/이나 ?으로 진입) | 기능 |
|---|---|
| /(문자열) | 문자열을 아래 방향으로 검색 |
| ?(문자열) | 문자열을 위 방향으로 검색 |
| n | 원래 찾던 방향으로 다음 문자열 검색 |
| N | 반대 방향으로 다음 문자열 검색 |
| 바꾸기 | 기능 |
|---|---|
| :s/(문자열1)/(문자열2)/ | 커서가 위치한 행에서 처음 나오는 문자열1을 문자열2로 바꿈 |
| :%s/(문자열1)/(문자열2)/g | 파일 전체에서 모든 문자열1을 문자열 2로 바꿈 |
| :(번호.번호)s/(문자열1)/(문자열2)/ | 범위 내 모든 각 행에서 첫번째로 나오는 문자열1을 문자열2로 바꿈 |
| :(번호.번호)s/(문자열1)/(문자열2)/g | 범위 내 모든 행에서 문자열1을 문자열2로 바꿈 |
| :(번호.번호)s/(문자열1)/(문자열2)/gc | 범위 내 모든 행에서 문자열1을 문자열2로 바꿀 때 수정할지 물어봄 |
| 파일 읽어오기, 여러 파일 편집하기 | 기능 |
|---|---|
| :r (파일) | 지정한 파일을 읽어들여 현재 파일에 삽입 |
| :e (파일) | 지정한 파일로 전환 (기존 파일 저장해야 함) |
| :n | vi 시작 시 여러 파일을 지정했을 경우 다음 파일로 이동 |
| 쉘 명령어 사용 | 기능 |
|---|---|
| :! 쉘 명령 | vi 작업을 잠시 중단하고 쉘 명령 실행 (Enter시 vi 복귀) |
| :sh | vi를 잠시 중단하고 쉘 명령 실행 (exit 입력시 복귀) |
| 입력 관련 | 기능 |
|---|---|
| ZZ | 작업한 내용을 저장하고 종료 |
| i | 커서 앞에서부터 입력 시작 |
| a | 커서 뒤어서부터 입력 시작 |
| o | 커서가 위차한 행의 다음 행에 입력 |
| I | 커서가 위치한 행의 첫 요소로 이동해 입력 |
| A | 커서가 위치한 행의 마지막 요소로 이동해 입력 |
| O | 커서가 위치한 행의 이전 행에 입력 |
| 커서 이동 | 기능 |
|---|---|
| k, 윗 방향키 | 커서 위로 이동 |
| j, 아래 방향키 | 커서 아래 이동 |
| l, 오른쪽 방향키 | 커서 오른쪽 이동 |
| h, 왼쪽 방향키 | 커서 왼쪽 이동 |
| ^, O, Home | 커서를 현재 행의 처음으로 이동 |
| $, End | 커서를 현재 행의 마지막으로 이동 |
| - | 앞 행의 처음으로 이동 |
| +, Enter | 다음 행의 처음으로 이동 |
| H | 화면의 맨 윗행으로 이동 |
| M | 화면의 중간 행으로 이동 |
| L | 화면의 아랫행으로 이동 |
| w | 다음 단어의 첫 글자로 이동 |
| b | 앞 단어의 첫 글자로 이동 |
| e | 다음 단어의 마지막 글자로 이동 |
| 화면 이동 | 기능 |
|---|---|
| ctrl + u | 반 화면 위로 이동 |
| ctrl + d | 반 화면 아래로 이동 |
| ctrl + b | 한 화면 위로 이동 |
| ctrl + f | 한 화면 아래로 이동 |
| ctrl + y | 한 행 화면 위로 이동 |
| ctrl + e | 한 행 화면 아래로 이동 |
| 특정 행으로 이동 | 기능 |
|---|---|
| gg | 파일의 첫 행으로 커서 이동 |
| G | 파일의 마지막 행으로 커서 이동 |
| (번호)G | 지정한 행으로 커서 이동 |
| :(번호) | 지정한 행으로 커서 이동 (마지막 행 모드) |
| :$ | 파일의 마지막 행으로 커서 이동 (마지막 행 모드) |
| 내용 수정 | 기능 |
|---|---|
| r | 커서가 위치한 글자를 다른 글자로 수정 (Esc 입력 필요 없음) |
| cw, #cw | 커서 위치부터 현재 단어의 끝까지 수정 (#에는 수정할 단어의 수) |
| s, #s | 커서 위치부터 Esc 입력할 때 까지 수정 |
| cc | 커서가 위치한 행의 내용 모두 수정 |
| C | 커서 위치부터 행의 끝까지 수정 |
| 내용 삭제 | 기능 |
|---|---|
| x, #x | 커서 위치의 글자 삭제 (#에는 삭제할 글자의 수) |
| dw, #dw | 커서 위치의 단어 삭제 (#에는 삭제할 단어의 수) |
| dd, #dd | 커서 위치의 행 삭제 (#에는 삭제할 행의 수) |
| D | 커서 위치부터 행 끝까지 삭제 |
| 복사 / 자르기 | 기능 |
|---|---|
| yy, #yy | 커서가 위치한 행을 복사 (#에는 복사할 행의 수) |
| p | 커서가 위치한 행의 아래쪽에 붙임 |
| P | 커서가 위치한 행의 위쪽에 붙임 |
| dd, #dd | 커서가 위치한 행을 잘라둠 (#에는 자를 행의 수) |
버퍼 사용하기
언네임드 버퍼
yy, dd 명령 키로 복사하거나 잘라낸 경우 복사하거나 잘라낸 내용이 저장되는 공간
내용을 하나만 저장 가능
네임드 버퍼
각각 다른 이름을 붙인 버퍼에 독립적으로 내용을 저장하고 사용
이름을 붙일 때 "(문자), "(숫자)의 형태로 사용 ("a, "1)
네임드 버퍼에 커서가 위치한 행을 저장하려면 (버퍼 이름)yy를 입력 ("ayy)
버퍼의 내용을 입력하려면 "(버퍼 이름)p를 입력 ("ap)
| 기타 명령 | 기능 |
|---|---|
| ctrl l | 현재 화면 다시 출력 |
| ctrl g | 현재 커서 위치의 행 번호 마지막 행에 출력 |
| shift j | 현재 행과 아랫행을 연결해 한 행으로 만듬 |
| . | 바로 직전에 했던 명령 반복 |
| 입력 모드 | 기능 |
|---|---|
| esc | 명령 모드로 복귀 |