■ VI(Visual Editor)
vi는 1976년 빌 조이가 초기 BSD 릴리즈에 포함될 편집기로 만들었다. 한 줄씩 편집하는 줄단위 편집기가 아니라 한 화면을 편집하는 비주얼 에디터(visual editor)라는 뜻에서 편집기의 이름인 vi가 유래했다. 그래픽 사용자 인터페이스(GUI)가 익숙한 사용자에게는 매우 낯설은 에디터지만 프로그래머 등 텍스트 작업을 주로 하는 사용자에게는 간결한 인터페이스와 키보드를 벗어나지 않고 모든 일을 할 수 있는 막강한 기능으로 크게 환영받고 있다. 파일의 간단한 편집, 전자 우편 쓰기, 복잡한 프로그래밍까지 vi는 유닉스 시스템에 널리 사용되고 있는 편집기이다.
■ VI의 기본개념
vi는 두가지 모드, 즉 명령 모드(Command Mode)와 입력 모드(Input Mode)가 있다. 명령 모드에서는 문서의 삭제·복사·이동 등 여러 가지 편집을 수행하며, 입력 모드에서는 문서를 작성하거나 수정하는 작업을 한다.
vi를 수행하면 명령 모드에서 시작한다. 문서를 작성하기 위해서는 입력 모드 변환 명령을 사용하여 입력 모드로 들어가야 한다. 문서의 입력이 끝나면 [ESC] 키를 사용하여 다시 명령 모드로 돌아온다.
Unix(Linux)
Shell |
vi filename
→ |
명령모드 |
a A i I o O
→ |
입력모드 |
|
|
←
ZZ :q :wq :q! |
←
<ESC> |
■ VI 의 명령형식
1. [count] command [object]
count - 명령의 반복 횟수 지정
object - 명령의 대상 지정
ex) 8dw - 단어 8개를 삭제
2. ex command
`:` 으로 시작하며 화면 하단에 명령이 표시된다.
ex) :wq - 파일의 내용을 저장하고 vi 를 종료
* vi는 줄단위 편집기인 ex 를 화면단위 편집기로 만든 것이다. 그래서 vi 에서 ex 명령을 모두 사용할 수 있다. `:` 을 누르면 커서가 화면 하단으로 가면서 ex 명령 모드로 들어간다.
■ VI 의 명령어
vi |
파일 이름 없이 시작, 문서 작성 후 저장할 때 파일 이름을 주어야 한다. |
vi filename |
지정한 파일로 vi 편집기를 시작한다. |
vi -r filename |
이전의 작업중이던 문서가 비정상적으로 종료되어 저장되지 못하였을 경우 파일을 어느정도 복구할 수 있다. |
vi filename1 filename2 .. |
여러개의 화일을 동시에 편집할 수 있다. |
vi +10 filename |
지정한 파일의 10번째 줄에서 시작한다. |
vi +/young filename |
지정한 파일에서 young 이라는 단어가 나오는 줄에서부터 시작한다. |
<vi 의 시작>
ZZ |
문서를 현재 지정된 파일에 저장하고 vi를 종료한다. |
:q |
vi를 종료한다. 수정된 내용이 있다면 vi가 계속 수행된다. |
:q! |
vi를 무조건 종료한다. 수정된 내용은 저장되지 않는다. |
:wq |
ZZ와 동일한 명령 |
:w |
문서의 내용을 현재 파일에 저장한다. |
:w filename |
문서의 내용을 지정하는 파일에 저장한다. |
:w! |
vi가 읽기전용모드로 실행되더라도 강제적으로 저장한다. |
:10,20 w filename |
문서 10~20째 줄의 내용을 파일에 저장한다. |
:r filename |
지정한 파일의 내용을 현재 커서가 있는 줄 다음에 읽어 들인다. |
:e filename |
현재 파일을 지정한 파일로 변경한다. |
<문서의 읽기와 저장>
h,[Del],[BackSpace] |
왼쪽으로 한 글자 이동 |
l,[Space Bar] |
오른쪽으로 한 글자 이동 |
j, + |
아래쪽으로 한 글자 이동 |
k, - |
위쪽으로 한 글자 이동 |
* 명령앞에 숫자를 주면 그 숫자 만큼 반복하여 명령을 실행한다. ex) 100j - 100줄 아래로 |
<커서의 이동, 문자 단위의 이동>
w, W |
다음 단어의 첫 글자로 이동 |
b, B |
이전 단어의 첫 글자로 이동 |
e, E |
다음 단어의 끝 글자로 이동 |
* 소문자 명령과 대문자 명령의 차이는 단어의 범위 결정방법에 따라 생긴다. 즉 문자, 숫자, 밑줄, 특수 문자등의 단위로 수행되는 명령이 w, b, e 이고, [Space
Bar] 와 [Enter] 으로만 구분하여 수행하는 명령이 W, B, E 이다. |
<단어 단위의 이동>
0 |
행의 첫번째 위치로 이동 |
^ |
행의 첫번째 문자로 이동 |
$ |
행의 끝 위치로 이동 |
[Enter] |
다음줄 첫 문자로 이동 |
H |
화면의 상단으로 커서를 이동 |
M |
화면의 중간으로 커서를 이동 |
N |
화면의 하단으로 커서를 이동 |
<행에서의 이동>
( |
문장의 시작점으로 이동 |
) |
문장의 끝점으로 이동 |
{ |
단락의 시작점으로 이동 |
} |
단락의 끝점으로 이동 |
[[ |
절의 시작점으로 이동 |
]] |
절의 끝점으로 이동 |
* vi에서는 `?`, `!`, `.` 으로 끝나고 공백이 두개 이상 있을 때 한 문장으로 본다. 단락구분은 공백 행이 있을 때 기준으로 하고, formfeed(^l)나 { 로 시작되는 줄을 절의 시작으로 } 로 끝나는 줄을 절의 끝으로 본다. C 언어에서 프로그램 함수의 시작과 끝으로 {, } 를 사용하므로 함수 하나가 하나의 절이 된다. 따라서 ]] 명령은 함수 단위로 이동하는 효과를 가져온다. |
<문장, 단락, 절 단위의 이동>
G |
파일의 맨 끝 줄로 이동 |
nG |
n 번째 줄로 이동 |
:n[Enter] |
nG와 같다. |
<지정된 행으로의 이동>
^f |
한화면 분량만큼 위로 스크롤 시킨다. |
^d |
한화면 분량만큼 아래로 스크롤 시킨다. |
^b |
반화면 분량만큼 위로 스크롤 시킨다. |
^u |
반화면 분량만큼 아래로 스크롤 시킨다. |
<화면 제어>
a |
현재 위치의 다음부터 입력 시작 |
A |
현재 줄의 끝에서부터 입력 시작 |
i |
현재 위치의 앞에서부터 입력 시작 |
I |
현재 줄의 처음에서 입력 시작 |
o |
현재 줄과 다음 줄 사이에 입력 시작 |
O |
현재 줄과 앞 줄 사이에 입력 시작 |
<문서의 입력>
x |
현재 위치의 한글자 삭제 |
X |
현재 위치의 앞 글자 삭제 |
dd |
현재 줄을 삭제 |
D |
현재 위치에서 줄 끝까지 삭제 |
d<object> |
object를 삭제, 즉 db, dw, d$ 등등.. |
yy, Y |
현재 줄을 버퍼에 복사 |
y<object> |
object를 버퍼에 복사, 즉 yw, yb, y$ 등등.. |
p |
버퍼에 저장된 내용을 현재 커서의 오른쪽이나 아랫줄에 추가 |
P |
버퍼에 저장된 내용을 현재 커서의 왼쪽이나 윗줄에 추가 |
" |
버퍼를 지정 |
* vi에서는 여러개의 버퍼를 제공한다. 그리고 이 버퍼들은 모두 이름을 가지고 있다. 따라서 삭제나 복사 명령시 버퍼 이름을 지정하면 해당하는 버퍼에 저장이 되고, 붙여넣기 명령에도 버퍼의 이름을 지정하면 그 버퍼의 내용이 첨부된다. 버퍼의 이름은 1~9, a~z 이다. |
<문서의 삭제, 복사 및 붙여 넣기>
r |
한 글자를 교환한다. |
R |
현재 위치에서 [ESC]를 칠 때까지 교환한다. |
s |
현재 위치의 글자를 지우고 다른 것으로 치환한다. |
S |
현재 줄을 삭제하고 다른 것으로 치환한다. |
cc |
S 명령과 같다. |
C |
현재 위치에서 줄 끝까지 지우고 다른 것으로 변경한다. |
c<object> |
object를 삭제하고 다른 것으로 변경한다. |
<문서의 교환과 치환>
u |
바로 전에 수행한 명령을 취소한다. |
U |
현재 줄에서 수행된 모든 것을 원상태로 복구한다. |
. |
바로 전에 수행한 명령을 반복한다. |
<명령 취소 및 반복>
/pattern |
현재 위치에서 뒤쪽으로 pattern 을 찾는다. |
?pattern |
현재 위치에서 앞쪽으로 pattern 을 찾는다. |
n |
뒤쪽으로 반복해서 pattern 을 찾는다. |
N |
앞쪽으로 반복해서 pattern 을 찾는다. |
/[Enter] |
뒤쪽으로 반복해서 패턴을 찾는다. |
f[character] |
현재 커서의 위치에서 앞방향으로 가면서 지정한 character를 찾아 커서를 옮긴다. |
F[character] |
현재 커서의 위치에서 뒤방향으로 가면서 지정한 character를 찾아 커서를 옮긴다. |
t[character] |
현재 커서의 위치에서 앞방향으로 가면서 지정한 character를 찾아 다음칸에 커서를
옮긴다. |
T[character] |
현재 커서의 위치에서 뒤방향으로 가면서 지정한 character를 찾아 다음칸에 커서를
옮긴다. |
; |
f, F, t, T 명령 중 가장 최근에 수행된 명령을 반복한다. |
<검색>
:s/string/newstring/ |
현재 줄에 있는 첫번째 해당 문자열을 새 문자열로 치환한다. |
:s/string/newstring/g |
현재 줄에 있는 모든 해당 문자열을 새 문자열로 치환한다. |
:g/string/command |
해당 문자열을 찾을 때마다 명령을 수행한다. |
:g/string/s//newstring/g |
파일 전체에 대해 해당 문자열을 새 문자열로 치환한다. |
:1,$ s/string/newstring/g |
파일 전체에 대해 해당 문자열을 새 문자열로 치환한다. |
<치환>
:sh |
shell 을 수행시킨다. |
:!<shell command> |
shell 명령을 수행한 후 vi 로 돌아온다. |
* 예를 들어 현재 작성중인 파일이름이 test.c 라 할때 !cc test.c 명령을 주면 컴파일된다. |
<shell 사용>
~ |
대문자는 소문자로, 소문자는 대문자로 치환한다. |
J |
현재줄과 아래줄을 연결한다. |
^I |
화면을 지우고 다시 그린다. |
% |
( ) 나 { } 의 대칭되는 위치를 찾는다. |
^g |
파일에 관한 정보(파일이름, 총 줄수, 크기, 현재 커서의 위치좌표 등)를 표시한다. |
<기타>
noautoindent |
nonumber |
noslowopen |
autoprint |
nonovice |
nosourceany |
noautowrite |
nooptimize |
tabstop |
nobeautify |
paragraphs |
taglength |
directory |
prompt |
tags |
noedcompatible |
noreadonly |
tagstack |
noerrorbells |
redraw |
term |
flash |
remap |
noterse |
hardtabs |
report |
timeout |
noignorecase |
scroll |
ttytype |
nolisp |
sections |
warn |
nolist |
shell |
window |
magic |
shiftwidth |
wrapscan |
mesg |
noshowmatch |
wrapmargin |
nomodeline |
noshowmode |
nowriteany |
|
|
|
* vi 에서 :set all 명령을 사용하면 현재 지정되어 있는 vi 의 옵션을 모두 보여준다. 특정옵션을 고치고자 할 때는 :set autoinden , :set tapstop=4 등과 같이 하면 된다.
* 변경하는 옵션 설정 명령을 홈 디렉토리의 .exrc파일에 저장하여두면 vi 는 실행될때마다 자동적으로 읽어 수행한다. |
<환경설정>
|