vi 편집기
unix의 일반 text 모드에서 사용되는 편집기에는 vi, emacs, pico 등이 있다.
특징
pico 편집기는 쉽고 단순하다. 간단한 편집 유틸리티 정도로 볼수 있음.
vi - 유닉스에서 가장 널리 사용되는 대중적인 편집기 *. 위키백과사전에 설명되어 있는 vi
emacs - 강력한 편집 기능 제공, vi 편집기에 비하면 더 복잡하고 크다.
* 레드헷을 포함한 대부분의 리눅스에서 기본적으로 사용되는 vi 편집기는 vi 편집기의 기능을 좀 더 향상 시킨
vim(vi improved) 이라는 편집기가 vi 라는 이름으로 사용되고 있으며 본래의 vi 편집기에 비해 사용하기 편한 좀
더 많은 기능을 제공한다.
vi 편집기 mode
vi 편집기 명령어는 크게 세 가지 모드로 나뉘어 질수 있다.
명령 모드 : vi 편집기의 기본모드.( 입력 상태이면 편집 명령어 사용 불가능)
입력모드 : i,I,a,A,o.O (입력모드 상태가 아니면 편집기 입력이 불가능)
확장모드(ex 모드, 또는 last line 모드라고 부른다.? - 왼쪽 하단에 명령어가 표시된다)
각 모드에서 사용하는 명령어는 정해져 있으며 입력모드 명령어가 가장 적다(i,I,a,A,o.O)
확장 모드 명령어는 명령어를 입력할 때 대부분 먼저 ‘:’을 붙이고 명령어를 입력함으로써
다른 모드 명령어와 구분이 된다.
각 모드 사이의 전환
명령어 모드 => 입력모드 전환 ; 입력모드 명령어중 하나를 사용.
입력모드 => 명령모드전환 ; esc 키 입력
입력모드 => 확장모드 ; 명령모드로 전환 후 확장모드 명령어 입력.
vi 편집기 명령어
커서 이동 명령
j(↓) 아래로 이동
k(↑) 위로 이동
h(←) 왼쪽으로 이동
l (→) 오른쪽으로 이동
G(go) 제일 끝줄로 이동
nG n번째 행으로 이동.
^b(back) 한 화면 위로 이동
^f(forward) 한 화면 아래로 이동
^u(up) 반 화면 위로 이동
^d(down) 반 화면 아래로 이동
e 한 단어 뒤로 이동
b 한 단어 앞으로 이동
0 줄의 제일 처음부터 이동
$ 줄의 제일 끝으로 이동
*. vi 편집기 명령어중 반복할 수 있는 일부 명령어 앞에? n(숫자)을 붙일 수 있다.
이때 n 의 의미는 n 뒤의 명령을 n 번 반복하라는 의미이다.
ex) 3dd => dd 명령을 세 번 반복하라. => 세 줄이 삭제된다.
입력 명령어
i 현재 커서 위치에 삽입(커서 위치에 문자를 오른쪽으로 한 칸 밀고 삽입)
a 현재 커서 위치 다음에 삽입 (a == "l + i")
o 현재 커서가 위치한 줄의 아랫줄에 삽입(o == "$ + a + Enter")
I 현재 커서가 위치한 줄의?맨 앞에 삽입 (I == "0 + i")
A 현재 커서가 위치한 줄의?맨 뒤에 삽입 (A == "$ + a")
O 현재 커서가 위치한 줄의?바로 위에 삽입
지우기 명령어
x 현재 커서 위치의 문자를 지운다. (nx x를 n번 반복)
dd 현재 커서가 위치한 줄을 지운다. (ndd dd를 n번 반복)
dw 현재 커서가 위치한 단어를 지운다.
d$ 현재 커서가 위치한 곳부터 그 행의 끝까지를 지운다.
dG 현재 커서가 위치한 행부터 편집문서의 마지막 줄까지 삭제한다.
*. 삭제한 내용은 바로 지워지지 않고 버퍼에 저장되므로 붙여넣기 하거나 취소 할 수 있다.
* 리눅스에 서 사용하는 vim 편집기는 undo를 여러 번 수행할 수 있다
복사하기와 붙이기
yy(=Y) 현재 커서가 위치한 줄을 버퍼에 복사한다.
(nyy => 현재 커서가 위치한 곳부터 아래로 n 라인을 버퍼에 복사한다)
yw 현재 커서가 위치한 단어를 버퍼에 복사한다.
(nyw => 현재 커서가 위치한 단어부터 오른쪽으로 n개의 단어를 버퍼에 복사한다)
p 버퍼에 들어 있는 내용을 현재 커서가 위치한 줄의 아래에 붙인다.
P 버퍼에 들어 있는 내용을 현재 커서가 위치한 줄의 위에 붙인다.? "xyy x라는 버퍼에 라인을 카피한다. (버퍼에 이름을 붙여서 사용하면 편집기가 열려 있는 동안은?버퍼의 내용을 잊어버리지 않는다.)
치환
r 현재 위치의 문자를 한개만 바꾼다.
R 현재 커서위치에서 오른쪽으로 esc 키를 입력할 때 까지 바꾼다.
cw 현재 위치의 단어를 바꾼다.
cc 현재 커서가 위치한 줄을 바꾼다.
C 현재 커서가 위치한 곳으로부터 줄의 끝까지 바꾼다.
~ 대소문자를 서로 바꾼다.
기타 명령어
J 현재 줄과 다음 줄을 합한다.?
^g 현재 편집하고 있는 파일의 정보를 보여준다.
u 방금 한 명령을 취소한다.
^R (=redo) 취소한 명령을 다시 취소 (vim)
U 현재 커서가 위치한 줄에 대한 편집 명령을 취소한다.
. 방금한 명령을 되풀이 한다.
^l 화면 refresh
확장모드 명령어
:! shell command ; 편집기를 벗어나지 않은 상태로 shell command 를 실행한다.
:args 현재 편집하는 파일명을 보여준다.
:w 편집하는 내용을 덮어쓰기로 저장한다.
:w filename 현재 내용을 지정된 파일 이름으로 저장한다.
:w! 강제로 덮어쓰기를 한다.
:wq 현재 편집하는 내용을 저장하고 종료한다.
:wq! 현재 편집하는 내용을 강제로 저장하고 종료한다.
:q! 강제로 종료한다.
:e filename ;새로운 파일을 편집한다.
:e! 현재 파일을 저장하지 않고 편집이전의 상태에서 새로 작성한다.
:r filename 현재 커서위치 다음에 파일을 끼워 넣는다.
:14 r filename 14행 이후에 파일을 읽어 삽입한다.
:n1,n2d n1번째 행에서 n2번째 행까지를 지운다.
:n1,n2 w filename n1에서 n2행까지를 filename에 저장한다.
:3,$d 3번째 행에서 끝항까지 지운다.
:set 여러 가지 환경 변수를 설정한다. set all하면 현재 설정되어 있는 환경 변수를 보여준다.
:set nu ; 라인 넘버 붙이기 (<=> set nonu)
:set showmode ; 현재 명령 상태를 화면 하단에 표시
:set bg=dark 편집기 글자색을 밝게 표시 (vim)
:set ai 자동 들여쓰기
:set ic 문자열 검색시 대소문자 구분 안한다.
:ab문자 문자열? ; 문자열을 문자열 앞에 있는 문자로 줄여 사용할 수 있음.(아래아한글의 상용구 기능에 해당)
:set ts=n 기본 tab size를 n column 으로 한다.
:sp 편집기 화면 수평 분할(화면을 수평으로 여러 개 분할해서 사용할 때 쓴다) (vim)
:^ww 분할된 화면으로 커서 이동. (vim)
문자열검색
/패턴 ; 패턴에 해당하는 내용을 현재 커서위치로 부터 오른쪽에서 그리고 아래쪽으로 찾는다.
n 정방향 다음 찾기 (현재 진행방향으로 => 아래쪽으로)
N 역방향 다음 찾기 (현재 진행 방향 반대쪽으로 => 위쪽으로)
? 패턴 패턴에 해당하는 내용을 현재 커서위치로 부터 왼쪽에서 그리고 위쪽으로 찾는다.
문자열 치환
:n1,n2s/serch/replace/g ( => 시작행번호, 마지막행번호s/찾을패턴/바꿀패턴/옵션 )
(g 는 global의 의미 해당 라인의 문자열을 전부 치환, g옵션이 생략될 경우에는 한 라인에서 치환해야할 패턴이
여러 개일 경우 맨 왼쪽 에 있는 것만 치환됨.)
*. 옵션에 i 가 사용되면 intractive 모드로 명령어 실행, 바꾸기 전에 물어본다.
* . 키보드에 있는 'Del', 'PageUp','Home','End' 및 방향키는 vi 편집기에서는 사용되지 않는다.
(vi 편집기 명령에 사용되는 키가 아니므로 시스템 환경에 따라서 될 수도 있고 안될 수도 있음)
vi 환경설정.
환경설정 파일을 만들면 자주 사용되는 vi 명령을 디폴트값으로 사용 할 수 있다.
환경설정파일은 확장 모드 명령어만 사용
위치 $HOME/.exrc 또는 .vimrc
설정 파일예
set nu(=set number) : 라인번호를 붙임.
set ts=4 : tab 의 크기를 4칸으로 함
syn on(=syntax on) : syntax highlighting
set ai : 자동들여쓰기
set cindent : c 소스 코딩시 자동들여쓰기
set shiftwidth : 자동들여쓰기 간격
set showmode : 편집 상태를 화면 하단에 표시
set vb : visual beep (경고음을 시각적으로 표시)
set title : 제목표시줄에 현재 편집중인 파일명 표시
set ic(=ignorecase) : 문자열 검색 할 때 대/소문자 구분 안함
set bg=dark : 글자색을 밝게 표시되도록 한다.
*. 기타
매크로
qa 라고 하면 a 레지스터에 입력하는 모든 키가 순서대로 매크로로 저장이 된다. 매크로가 실행줄일때는 아래에 기록중이라는 메세지가 보인다. q 를 누르면 매크로 저장이 돤료된다.
매크로에 저장된 명령을 실행할때는 @a 라고 하면 된다. 반복실행할때는 5@a 이렇게 숫자를 앞에 붙여주면 된다.
* vi 편집기 연습문제 1* vi 편집기 연습문제 2
** vi 명령어 기타 **
vim 또는 vi에서 , Tab 문자를 보려면
:set list
그러면 현재 문서의 모든 탭문자가 ^I 라는 기호로 나타난다.
그리고 라인끝에는 $ 문자가 표시된다.
탭문자를 보이지 않게 하려면
:se nolist
-----------------------------------------------------------------------------------------------------------
** vi 편집기 연습문제1 **
아래와 같은 문장을 vi 편집기로 작성하시오.
The mind has a ten eyes,
And the heart but
Yet the right of a whole life dies
When its love is done.
The night has a ten eyes,
The day but one;
Yet the light of the bright world dies
With the dying sun.
** vi 편집기 연습문제2 **
1번 예제에서 작성한 문장을 아래와 같이 수정하시오.
1. 맨첫번째줄에 빈줄을 만들고 제목 Light 를 입력하시오.(O <= 대문자 오)
2. The 또는 the를 => 모두 THE(대문자)로 변경하시오 (확장모드에서 치환으로 처리하시오)
3. 두번째 문장과 첫번째 문장의 위치를 서로 바꾸시오.(dd / p 또는 대문자 P)
4. ten => thousand 로 수정하시오. (cw)
5. 각 라인앞에 '**%%**%%**' 기호를 붙이시오.
6. right를 => light 로 변경하시오.(cw)
7. heart but 뒤에 'one' 을 추가하시오.
9. 파일명을 light 로 저장하시오.(:wq light)
* 결과)
Light
**%%**%%** THE night has a ten thousand eyes,
**%%**%%** THE day but one;
**%%**%%** Yet the light of the bright world dies
**%%**%%** With THE dying sun.
**%%**%%** THE mind has a thousand eyes,
**%%**%%** And THE heart but one;
**%%**%%** Yet THE light of a whole life dies
**%%**%%** When its love is done.