본문 바로가기

공부/리눅스

vi 편집기

반응형

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.


반응형