vim

OS/리눅스 & 유닉스 2011. 8. 23. 18:17

① vim의 모드 이해

- 명령모드: 키 입력을 통해 vim에게 명령을 내리는 모드; 커서를 이동하거나, 삭제, 복사, 붙이기 등의 작업을 수행할 수 있다.

- 입력모드: 실제로 문서를 편집하기 위한 모드; 글자를 타이핑하게 되면 실제로 화면에 출력되면서 글자의 입력이 가능하게 된다.

- ex모드: 에디터인 ex 에디터의 기능을 사용하는 모드; 특정 패턴들을 특정 문자열로 대체한다는 것과 같이 일괄적으로 처리해야 할 작업에 매우 효율적이다.



vim을 처음 실행시키면 명령모드에서부터 시작한다. 명령모드에서 I, i, A, a, O, o, s 중 한키를 누르면 편집이 가능한 입력모드로 전환된다(입력모드 전환키를 다 기억할 필요는 없다).

입력모드에서 복사, 붙이기 등과 같은 작업을 수행하기 위해서는 명령모드로 다시 전환해야 한다. 입력모드에서 명령모드로의 전환은 ESC 키를 누르면 된다. 위 그림과 같이 입력모드에서 ex모드로 바로 전환하는 것은 불가능하다. 일단 명령모드로 전환한 후 ex모드로 전환해야 한다.

 

 

 

 

 

② 파일 열기, 저장, 종료

$ vi test.c

리눅스 셸 프롬프트 상에서 위 명령을 내리면 vim이 실행된다. '$'는 셸 프롬프트를 의미한다. 실행 시 기존에 test.c 파일이 존재한다면 test.c 파일이 열리게 되고 test.c 파일이 존재하지 않는다면 새로 생성하게 된다.

 

만약 test.c 파일이 있어서 기존의 파일을 편집하게 된다면 vim은 test.c 파일에 대응하는 .test.c.swp 파일을 생성한다.

 

 

.test.c.swp 파일에는 파일의 소유자, 사용자 이름, 파일명과 경로, 수정 시간 등과 같은 각종 제어정보와 함께 파일의 내용이 들어있다. 화면에 일단 편집하게 되면 이 .test.c.swp 파일에 기록되고 저장 명령을 내리면 .test.c.swp 파일에 기록된 내용이 test.c 파일에 반영된다. 파일이 존재하지 않아 새로 생성하는 경우 생성하는 파일의 임시 파일에 일단 기록하고 저장 명령이 내려졌을 때 임시 파일에 기록된 내용을 새로 생성할 파일에다 기록하게 된다.

 

텍스트 입력이 끝나면 ESC키를 눌러 입력모드에서 명령모드로 전환한다. 저장하기 위해서는 : 키를 눌러 ex모드로 전환하여 w 키를 누르고 Enter를 치면 된다.

종료는 명령모드에서 : 키를 눌러 일단 ex모드로 전환하여 q 키를 누르고 Enter를 치면 된다. 일반적으로 저장 후 종료하는 것은 ex모드에서 다음과 같은 형식으로 사용한다.

  :wq!

 

명령어

설명

:w

저장

:w file.txt

file.txt 파일로 저장

:w >> file.txt

file.txt 파일에 덧붙여서 저장

:q

vi 종료

ZZ

저장 후 종료

:wq!

강제 저장 후 종료

:e file.txt

file.txt 파일을 불러옴

:e

현재 파일을 불러옴

 

vim을 처음 시작하는 사람은 다음 명령만 반드시 기억하자.

- 저장: ESC + :w

- 저장 후 종료: ESC + :wq!

- 저장하지 않고 종료: ESC + :q!

- file.txt를 불러옴: ESC : :e file.txt

 

 

 

 

 

③ 입력

입력은 입력모드에서 가능하다.

a

커서 위치 다음 칸부터 입력

A

커서 행의 맨 마지막부터 입력

i

커서의 위치에 입력

I

커서 행의 맨 앞에서부터 입력

o

커서의 다음 행에 입력

O

커서의 이전 행에 입력

s

커서 위치의 한 글자를 지우고 입력

cc

커서 위치의 한 행을 지우고 입력

 

위 키는 대표적인 키를 나열한 것이고 위에서 나열한 키 말고도 몇 가지 키가 더 있다. 위 키 중 특히 많이 사용하는 키의 경우에는 음영으로 처리했다.

vim 을 처음 시작하는 사용자는 i(insert) 키만 기억하도록 하자.

 

 

 

 

 

④ 이동

입력모드에서 커서 이동은 일반 편집기와 같이 화살표 키를 이용하면 된다. 명령모드에서는 화살표 키로 커서를 이동할 수도 있고, h, j, k, l 키를 이용할 수도 있다.

h

j

k

l

 

 

명령모드에서 단어 단위의 이동은 w 키와 b 키로 가능하다. w 키를 누르면 다음 단어의 첫 글자로 이동하고 b 키를 누르면 이전 단어의 첫 글자로 이동하게 된다.

h

왼쪽으로 이동

l

오른쪽으로 이동

j

아래 행으로 이동

k

위 행으로 이동

w or W

다음 단어의 첫 글자로 이동

b or B

이전 단어의 첫 글자로 이동

e or E

단어의 마지막 글자로 이동

<CR>

다음 행의 첫 글자로 이동

^

그 행의 첫 글자로 이동

$

그 행의 마지막 글자로 이동

+

다음 행의 첫 글자로 이동

-

위 행의 첫 글자로 이동

(

이전 문장의 첫 글자로 이동

)

다음 문장의 첫 글자로 이동

{

이전 문단으로 이동

}

다음 문단으로 이동

H

커서를 화면의 맨 위로 이동

z<CR>

현재 행을 화면의 맨 위로 이동

M

커서를 화면의 중앙으로 이동

z.

현재 행을 화면의 중앙으로 이동

L

커서를 화면 최하단으로 이동

z-

현재 행을 화면의 최하단으로 이동

[n]H

커서를 위에서 n행으로 이동

[n]L

커서를 아래에서 n행으로 이동

Ctrl + u

반 화면 위로 스크롤

Ctrl + d

반 화면 아래로 스크롤

Ctrl + b

한 화면 위로 스크롤

Ctrl + f

한 화면 아래로 스크롤

gg, 1G

문서의 맨 첫 행으로 이동

G

문서의 맨 마지막 행으로 이동

[n]G

n행으로 이동

:[n]

n행으로 이동

 

한 글자씩 이동: h, j, k, l

단어 단위 이동: w. b

문단 단위 이동: {. }

행의 시작과 끝: ^, $

n행으로 이동: :[n]

문서의 시작과 끝: gg, G

 

 

 

 

 

 

⑤ 편집

삭제

명령모드에서 x를 누르면 현재 커서 위치의 한 글자를 삭제한다.

dw는 커서 위치의 한 단어를 삭제하고 dd는 한 행을 삭제한다.

※ vi의 명령에는 규칙이 하나있는데 명령 앞에 숫자를 넣게 되면 그 명령을 앞에 누른 숫자 만큼 반복한다는 의미가 있다.

    그래서 10x를 누르게 되면 현재의 커서부터 10개의 글자가 삭제된다. 마찬가지로 10dw하게 되면 10개의 단어가, 10dd하게 되면 10개의 행이 삭제된다.

x, dl

커서 위치의 글자 삭제

X, dh

커서 바로 앞의 글자 삭제

dw

한 단어를 삭제

d0

커서 위치부터 행의 처음까지 삭제

D, d$

커서 위치부터 행의 끝까지 삭제

dd

커서가 있는 행을 삭제

dj

커서가 있는 행과 그 다음 행을 삭제

dk

커서가 있는 행과 그 앞행을 삭제

 

복사 & 붙이기

yw는 현재 커서 위치의 한 던어를 복사한다. yy는 현재 커서 위치의 한 행을 복사한다. 이렇게 복사한 문자들은 p로 붙여넣을 수 있다. 10yw는 현재 커서 위치에서 10개의 단어를 복사하고, 10 yy는 10개의 행을 복사한다. 마찬가지로 2p를 하게 되면 복사한 내용을 2번 붙여넣게 된다.

 

잘라내기

잘라내기에 대해서 이해하려면 먼저 vi의 레지스터에 대해서 알아야 한다. vi는 총 17개의 레지스터를 가지고 있는데 일단 dd 명령어로 한 행을 지웠다면 화면에 지워짐과 동시에 그 내용은 "1 레지스터에 들어가게 된다. 그리고 다시 dd 명령어로 한 행을 지우게 되면 "1 레지스터에 들어 있는 내용은 "2 레지스터로 옮겨가고 "1 레지스터에 새로 지운 내용이 들어가게 된다.

 

aaa를 지웠을 때

“1

“2

“3

“4

“5

“6

“7

“8

“9

aaa

 

 

 

 

 

 

 

 

bbb를 지웠을 때

“1

“2

“3

“4

“5

“6

“7

“8

“9

bbb

aaa 

 

 

 

 

 

 

 

ccc를 지웠을 때

“1

“2

“3

“4

“5

“6

“7

“8

“9

ccc

bbb

aaa 

 

 

 

 

 

 

 

이러한 레지스터는 ex모드에서 :reg 명령으로 볼 수 있다.

 

 

"" 레지스터는 바로 이전에 지워진 내용이 항상 들어간다. "1 부터 "9 까지 레지스터는 지워지느 내용이 큐 형식으로 들어가게 된다.

"1부터 "9외에 나머지 레지스터는 특수한 목적이 있다. ": 레지스터에는 최근까지 타이핑한 내용이 들어간다. "% 레지스터 버퍼에는 현재 편집하는 파일명이 들어간다. 화면에는 안나오나 "/ 레지스터에는 가장 최근에 검색한 문자열이 들어간다.

 

p 명령으로 붙여넣기 할 때 특정 레지스터를 선택할 수 있다. "2p 하게 되면 2번 레지스터에 있는 내용이 붙여넣어 진다. 만약 이전에 지우긴 했는데 그 내용이 어떤 레지스터에 있는지 모르겠다면 ex모드에서 :reg 명령을 입력하여 확인할 수 있고 또 다른 방법으로는 "1pu.u.u 명령으로 각 레지스터에 있는 내용을 하나씩 되돌리면서 붙여넣기 할 것을 선택할 수 있다. "1p는 1번 레지스터의 내용을 붙여넣는 명령이고 u는 되돌리기 명령이다. 그리고 .은 바로 이전에 했던 작업을 반복하는 명령이다.

 

블록지정

v를 누르고 j 키로 커서를 아래로 이동시키면 역상으로 블록이 형성되는 것을 볼 수 있다.

 


일단 원하는 범위만큼 블록을 지정했다면, 지우고 싶은 경우에는 d를 누르면 지워진다. 또한 지정된 블록을 복사하고 싶은 경우 y를 누르면 지정된 블록에 대한 복사가 일어난다.


Ctrl 키를 누른 상태에서 v 키를 누르게 되면 커서의 위치를 기점으로 사각형으로 블록을 형성할 수 있다. 원하는 만큼 지정한 후 삭제(d), 복사(y)를 하면 된다.

 

 


블록지정 후 사용 가능한 키

~

대소문자 전환

d

삭제

y

복사

c

치환

> 

행 앞에 탭 삽입

< 

행 앞에 탭 제거

:

선택된 영역에 대하여 ex 명령

J

행을 합침

U

대문자로 만듦

u

소문자로 만듦


 

 

 

⑥ 되돌리기와 되살리기

되돌리기 기능은 u 명령을 사용한다. 그리고 되살리기는 Ctrl + r 키를 이용하면 된다. 원래 u 명령의 의미는 되돌리기가 아니라 명령 취소의 의미다. 그러나 결국 되돌리기가 되는 것은 사실이기 때문에 되돌리기 기능이라고 말하곤 한다.

 

 

 

 

 

⑦ 문자열 탐색

'/' 키{역방향 탐색은 ? 키)를 누른 후 찾기 원하는 문자열을 입력하기만 하면 된다.

 

 

위 화면에서 n 키를 누르면 커서가 다음에 매칭되는 'rc' 문자열로 이동하고 대문자 N키를 누르면 이전 매칭한 'rc' 문자열로 이동한다.

 

 

 

 

 

⑧ 문자열 치환

ex 모드에서 아래 명령을 내리면 문서에 있는 모든 old 문자열을 new로 바꾼다.

     :%s/old/new/g

치환전

치환후

 

위 명령은 슬레쉬(/)를 구분자로 총 4개의 부분으로 나누어져 있는데 다음과 같다.

  :[범위]/[매칭 문자열]/[치환 문자열]/[행 범위]

먼저 범위는 매칭 문자를 치환할 문서상의 범위를 의미한다. %s는 문서 전체를 의미한다. 그래서 :%s/old/new/g하게 되면 문서 전체에 있는 old 문자열이 new 문자열로 치환되는 것이다. 아래 예제들은 범위 지정의 예다.

 

문서 전체에서 제일 처음 매칭되는 행의 문자열만 치환된다.

 

    :s/old/new/g

치환전

치환후

 

 

 

 

2행에서 4행 사이에 매칭되는 문자열을 치환한다.

   :2.4s/old/new/g

치환전

치환후

 

 

 현재 커서의 위치에서 위로 1행 아래로 3행 되는 범위에 매칭되는 문자열을 치환한다.

    :-1,+3s/old/new/g

치환전

치환후

 

 

 

 

행 범위에 g를 쓰지않고 명령을 내리면 한 행에서 여러 개의 매칭 문자열이 존재한다고 해도 한번만 치환이 일어나게 된다.

    :%s/old/new/

치환전

치환후

 

 

 

 

행 범위에 c를 두게 되면 매칭되는 문자열에 대해 치환할 것인지 사용자에게 물어본다.

    :%s/old/new/gc

치환전

치환후

 

 

 

 

 출처 : http://bestheroz.blog.me/66860084

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

awk  (0) 2011.09.08
awk  (0) 2011.08.26
[Linux/Unix]쉘 (Shell) 의 정의와 종류  (0) 2011.08.23
[Linux/Unix]쉘 변수($#, $*, $$, $!)  (0) 2011.08.23
[Linux/Unix]환경설정, 환경변수  (0) 2011.08.23
: