본문 바로가기

Computer Engineering/Tools & Tip

VI 편집기 사용법

 

이 문서는 vi 에디터의 이름은 들어 보았으나, 사용법을 잘 모르는 사용자를 위한 것입니다. 자세한 설명서는 http://www.vim.org 에서 찾아 보시기 바랍니다.

 

 

1. vi 실행 방법

 

커맨드 라인에서 다음과 같이 입력하면, 인자로 입력한 이름의 파일을 편집할 수 있습니다.

 

$ vi 파일_이름...

 

파일의 이름에는 다수의 파일 이름을 넣을 수 있으며, vi 내에서 :n 명령으로 다음 파일로 넘어 갈 수 있습니다.

 

 

2. vi 실행 모드


vi 에디터는 크게 명령 모드와 입력 모드로 나눌 수 있고, 명령 모드에는 vi 명령 모드와 ex 명령 모드가 있습니다. vi 시작시, vi 명령 모드로 시작하며, 특정 키를 눌러, 입력 모드 및 ex 명령 모드로 전환할 수 있습니다. vi 명령 모드로 돌아오기 위해서는, Esc(Escape)키를 누르면 됩니다.

 

아래에, 입력 모드 및 명령 모드에서, 자주 사용되는 명령어를 적어 보았습니다(이것은 제가 선호하는 명령들로, 실제로는 훨씬 다양한 명령들이 있습니다).

 

실질적으로 vi 에디터를 이용하여 편집 작업을 하기 전에, 아래의 명령들을 전부 다 사용해 보시기 바랍니다. 어떤 명령들은 너무 강력해서 수습하기 어려운 경우도 있으니, 각각의 명령들의 특성을 미리 알아 두는 것이 필요합니다.

 

 

1) 입력 모드 전환 키 : 실질적으로 문서에 글자를 입력하기 위해서는 명령 모드에서 입력 모드로 모드 전환이 이루어져야 합니다. 이 때 사용할 수 있는 키가 여러 가지가 있는데, 여기서는 그것들에 대해 설명하겠습니다. 단순 입력 작업이 끝나고, 커서 이동이나 편집 작업 등을 하려고 할 때는 Esc키를 눌러서 입력 모드에서 빠져 나와야 합니다.

 

i : 현재 커서 위치에 글자 삽입이 가능해 짐, i 키를 누르고 난 이후에 쓰는 글은 커서 위치에 쓰여지게 됨
I : 현재 줄 처음에 삽입
a : 현재 커서 다음 위치에 추가
A : 현재 줄 마지막에 추가
o : 아랫 줄에 추가
O : 윗 줄에 추가
s : 현재 커서 글자 지우고 입력 모드로 전환
r : 현재 커서 글자 지우고 한 글자 입력 받아 명령 모드로 돌아감
Esc : 입력 모드 또는 ex 명령 모드에서 vi 명령 모드로 전환, vi 명령 모드에서 Esc키를 누르면 삑 소리가 남

 

 

2) vi 명령 모드 키: Esc키를 눌러서 들어 올 수 있는 모드입니다. vi 에디터 시작할 때의 초기 모드이기도 합니다. 키 앞에 숫자를 입력하면 그 명령이 숫자 만큼 반복됩니다. 입력 모드에서 입력 작업 완료 후, 커서 이동이나 삭제, 복사, 붙여 넣기 등의 편집 작업 등을 할 때는 Esc키를 눌러 vi 명령 모드로 전환시킨 후에 해야 합니다.

 

[ 커서 이동 ]

h : 한 문자 왼쪽으로 커서 이동(도스용이나 윈도우즈용 vi 에디터의 경우는 대부분, 커서 이동에 방향키를 사용할 수 있으나, 방향키가 없는 터미널 키보드에서 vi 에디터를 사용하기 위해서는 여기서 설명하는 키들을 알아둘 필요가 있습니다)
j : 한 줄 아래쪽으로 커서 이동
k : 한 줄 위쪽으로 커서 이동
l : 한 문자 오른쪽으로 커서 이동
w : 다음 단어 첫 문자로 커서 이동
b : 이전 단어 첫 문자로 커서 이동
Ctrl+f : 한 페이지 아래로 커서 이동
Ctrl+b : 한 페이지 위로 커서 이동
G : 마지막 줄로 커서 이동, 숫자G로 눌렀을 때, 숫자에 해당되는 줄로 커서 이동
^ : 공백 문자가 아닌, 현재 줄의 첫 문자로 커서 이동
0 : 공백 문자를 포함한, 현재 줄 첫 문자로 커서 이동
$ : 현재 줄 마지막 문자로 커서 이동

 

[ 삭제 ] : 삭제된 것은 버퍼에 저장되므로 p나 P 명령으로 붙여 넣기가 가능함

x : 현재 커서 위치 문자 삭제
X : 현재 커서 위치 이전 문자 삭제
dw : 현재 커서 위치 단어 삭제, 숫자dw로 쓰면 숫자만큼의 단어가 삭제됨, 다른 삭제 명령도 마찬가지로 숫자 입력 방식이 적용됨
db : 현재 커서 위치 이전 단어 삭제
dd : 현재 커서 위치 줄 삭제, 숫자dd로 쓰면 숫자만큼의 줄이 삭제됨
d^ : 현재 줄에서 현재 커서 위치 이전 문자열 삭제
d$ : 현재 줄에서 현재 커서 위치 이후 문자열 삭제
D : d$와 같음

 

[ 복사, 붙여 넣기 ] : 여기서의 복사란, 버퍼로의 복사를 말함, 실제로 붙여 넣기를 하려면 p나 P키를 눌러야 함

yw : 현재 커서 이후 단어 복사, 숫자yw로 쓰면 숫자만큼의 단어가 복사됨, 다른 복사 명령에도 이와 같은 숫자 입력 방식이 적용됨
yb : 현재 커서 이전 단어 복사
yy : 현재 줄 복사, 숫자yy로 쓰면 숫자만큼의 줄이 복사됨
p : 복사된 항목을 현재 커서 위치 이후에 붙여 넣기, 삭제된 항목도 붙여 넣기 가능
P : 복사된 항목을 현재 커서 위치 이전에 붙여 넣기, 삭제된 항목도 붙여 넣기 가능

 

[ 검색 ]

/검색어 : 전진 검색
?검색어 : 후진 검색
n : 검색 반복

N : 반대 방향 검색 반복

 

[ 되돌리기(undo) ]

u : 되돌리기(undo). u키를 계속 치게되면, undo 버퍼가 빌 때까지 계속 되돌리기할 수 있음. 유용함
U : 라인 되돌리기. 한 줄에 대해서 모든 편집을 없던 것으로 하고 원상태로 되돌림

Ctrl+r : Redo(undo undo)

 

[ 기타 ]

J : 커서 위치 아랫줄을 현재 줄에 붙임. 커서 이동의 j와 혼동될 수가 있으므로, 대소문자 구별에 유의해야 함

. : 이전 실행 명령 반복. 같은 명령을 빠르게 반복하고자 할 때 유용함. 참고로, 문자열 입력 후, 명령 모드로 돌아와서 .을 입력하면 입력된 문자열이 커서 위치에 삽입됨

ZZ : 현재 문서 저장하고, 종료하기

 


3) ex 명령 모드 : ex 라인 에디터의 명령어를 사용할 수 있습니다. vi 명령 모드 상태에서, : 키를 눌러서 들어가고, Esc키를 눌러서 다시 vi 명령 모드로 나옵니다. 아래에 제가 자주 사용하는 명령들을 적어 봅니다. 각각의 명령을 입력한 후, 실행을 하기 위해서는 엔터키를 누르면 됩니다.

 

시작줄번호,끝줄번호d : 시작줄번호에서 끝줄번호까지의 줄을 지움, 붙여 넣기 가능, 문서의 처음 줄은 1, 현재 줄은 . , 마지막 줄은 $로 지정 가능, 줄번호 입력없이 d만 입력했을 경우에는, 현재 줄을 지움

 

시작줄번호,끝줄번호y : 시작줄번호에서 끝줄번호까지의 줄을 복사

 

시작줄번호,끝줄번호s/찾을문자열/바꿀문자열/g : 시작줄번호에서 끝줄번호까지 '찾을문자열'을 찾아 '바꿀문자열'로 바꿈, g를 사용하지 않으면, 한 줄에 '찾을문자열'이 여러 개 있더라도, 그 줄에 대해서는 한 번만 바꿔짐. 유닉스 정규 표현식을 써서 강력한 검색 및 치환이 가능함

 

se nu : 줄 번호 표시

 

n : 다음 파일 편집, vi 실행시 인자로 입력한 파일이 여러 개일 경우에 해당

 

r 파일이름 : '파일이름'의 파일을 읽어 와서 현재 커서 아랫줄에 삽입

 

sh : 쉘로 잠깐 빠져 나가기, 쉘에서 exit 치면, 다시 vi로 돌아옴. vi를 백그라운드로 돌려서(Ctrl+z), 쉘로 나가 다른 작업을 한 후, fg로 돌아오는 방법도 있음

! 명령 : 밖으로 빠져 나가지 않고 바로 '명령'을 실행시킴

 

w : 저장하기, w!로 쓰면, 강제로 저장하기
w 파일이름 : '파일이름'으로 저장하기
q : vi 종료하기, q!로 쓰면 강제로 종료하기
wq : 저장하고, 종료하기. wq!로 쓰면 강제로 저장하고 종료하기


 

 

이상이 vi 에디터에서 제가 자주 사용하는 명령들입니다. 이 정도만 익숙하게 쓰실 수 있으면, 웬만한 편집 작업은 문제없이 할 수 있습니다. 이 외에도, 아주 많은 명령들이 있습니다. 그런 명령들을 잘 사용하시면 vi 에디터를 아주 편리하게 사용하실 수 있을 것 같습니다. 특히, 최근의 vi 에디터들은 기능이 다양해져서 Syntax highlighting 기능 등을 비롯하여 여러 가지 기능들을 지원하는 것 같습니다. 그 설정 방법을 찾아서 공부하시면 매우 유용하게 사용할 수 있을 것 같습니다.

 

이 문서를 읽고, 연습도 했는데, 잘 모르겠다 싶은 분은, Cygwin에서 vimtutor라는 명령을 내리세요. 하나 하나 따라 하면서 연습할 수 있습니다.

 

 

 

--------------------------------------------------------------------------------------


VI 사용하기

 

Vi 시작하기

  • $ vi : vi 시작하기
  • $ vi aaa.txt : aaa.txt 파일을 편집하면서 vi 시작
  • $ vi -R aaa.txt : 읽기 전용으로 열기

  Esc   : 또는 /  
편집상태
명령대기상태
(Esc모드)

명령줄상태
  삽입명령어
i,a,A,I,o,O
  Esc 또는 Enter  

  • 명령대기상태 → 편집상태 : 삽입명령어 (아래참조.)
  • 편집상태 → 명령대기상태 : Esc글쇠.
  • 명령대기상태 → 명령줄纘?: : 또는 / (아래참조)
  • 명령줄상태 → 명령대기상태 : Esc 또는 Enter (아래참조)

 

커서의 이동

  • h, l, j, k : 왼쪽(←, Back space), 오른쪽(→, space), 위(↑), 아래(↓)
  • b, w : 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동.
  • B, W : 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동. (문장부호 무시)
  • e : 다음 단어의 끝 글자로 이동.
  • E : 다음 단어의 끝 글자로 이동. (문장부호 무시)
  • H, M, L : 화면의 맨 위/ 중간 / 맨 아래로
  • 0 : 그 줄의 맨 처음으로 (숫자 0이다.)
  • $ : 그 줄의 맨 끝으로
  • + : 다음 줄의 처음으로
  • - : 윗 줄의 처음으로
  • 3| : 현재 줄의 3번째 열로
  • 4H : 화면 상의 처음 줄부터 4줄 밑으로
  • 4L : 화면 상의 마지막 줄부터 4줄 위로
  • (, ) : 이전 문장의 시작으로 / 다음 문장의 시작으로
  • {, } : 이전 문단의 시작으로 / 다음 문단의 시작으로
  • [[, ]] : 이전 섹션의 시작으로 / 다음 섹션의 시작으로

편집 버퍼를 통한 이동

  • ^F, ^B : 한 화면 앞으로 / 뒤로 (^는 Ctrl글쇠를 의미.)
  • ^D, ^U : 반 화면 앞으로 / 뒤로
  • 4^B : 4화면 위로 이동
  • 4^F : 4화면 아래로 이동
  • 7^U : 7줄 위로 이동
  • 7^D : 7줄 아래로 이동
  • ^Y : 커서는 현재 위치 그대로 화면만 한 줄씩 아래로 이동
  • ^E : 커서는 현재 위치 그대로 화면만 한 줄씩 위로 이동

행 단위 이동

  • :0 : 파일의 첫 번째 행으로 가기 (숫자 0)
  • :10 : 10번째 행으로 가기
  • :$ : 파일의 마지막 행으로 가기
  • G : 파일의 마지막 행으로 가기
  • 10G : 10번째 행으로 가기

삽입명령어

  • i : 커서 위치부터 삽입 시작
  • a : 커서 위치 오른쪽부터 삽입 시작
  • A : 현재 줄의 맨 끝 부터 삽입 시작
  • I : 현재 줄의 맨 처음 부터 삽입 시작
  • o : 커서 아래에 행 삽입
  • O : 커서 위에 행 삽입

삭제명령

  • x : 현재 커서위치의 한 문자 삭제
  • X : 현재 커서 왼쪽의 한 문자 삭제
  • dd : 한 줄 지우기
  • 4dd : 4 줄 지우기
  • dw : 한 단어 지우기
  • d2w : 2 단어 지우기
  • D : 커서 오른쪽 행 삭제
  • :5 d : 5 째 행 삭제
  • :5,10 d : 5-10 째 행 삭제

파일의 저장 및 종료

  • :wq : 저장 후 vi 종료
  • :w : 저장 (종료는 하지 않고 계속 편집)
  • :q! : 저장하지 않고 vi 빠져나가기
  • :w filename : filename으로 저장 후 계속 편집
  • ZZ : 변경사항 저장 후 vi 종료

내용의 복사 및 이동

  • yy : 현재의 행 복사
  • 5yy : 현재의 행 위치부터 5행 복사
  • p : 아래(오른쪽)에 붙여넣기
  • P : 위(왼쪽)에 붙여넣기
  • f4yy : 현재의 행 위치부터 4행을 'f'라는 이름의 버퍼에 복사
  • fp : 'f'라는 이름의 버퍼에 복사된 내 용을 현재 행 위치에 붙여넣기
  • :3 co 7 : 3 행을 7행 다음으로 복사
  • :1,3 co 7 : 1-3 행을 7행 다음으로 복사
  • :3 m 7 : 3 행을 7행 다음으로 이동
  • :1,3 m 7 : 1-3 행을 7행 다음으로 이동

내용 고치기

  • J : 현재 행과 아래 행 결합
  • 3J : 3줄 합치기
  • u : 이전 명령 취소
  • cw : 단어 변경
  • cc : 행 변경
  • C : 커서 오른쪽의 행 변경
  • s : 커서가 위치한 문자열 대체
  • r : 한 글자만 변경 (입력 모드로 바뀌지 않음)
  • R : 입력하는 대로 겹쳐써서 변경
  • xp : 커서 위치 문자와 오른쪽 문자 교환
  • - : 문자형(대,소문자) 변경
  • U : 행 변경사항 취소
  • :u : 이전의 최종행 취소

명령 취소 및 반복

  • . : 마지막 명령 반복
  • 2. : 마지막 명령 2회 반복
  • u : 마지막 명령 취소
  • U : 현재 줄을 저장

행 번호 설정 및 화면표시

  • :set nu : 행 번호 표시
  • :set nonu : 행 번호 숨기기
  • := : 현재 줄번호 보여주기
  • :/pattern/ = : pattern이 위치한 줄번호 보여주기

시스템이 다운된 후에 파일 되살리기

  • vi -r : 되살릴 수 있는 모든 파일 이름 보여주기
  • vi -r file.txt : vi를 시작하여 지정한 파일 되살리기

다른 파일을 파일 내로 삽입

  • :r filename : 커서 다음에 파일 삽입
  • :20 r filename : 파일을 20번째 행 다음에 삽입

새로운 파일 편집하기

  • :e fine.txt : file.txt 편집하기
  • :e! : 현재의 편집중인 내용 무시하고 가장 최근에 편집한 내용 다시 편집하기

다중 편집하기

    % vi file1 file2 file3
    혹은
    :e file1 file2 file3
    했을 때,
  • :args : 편집 중인 파일목록 보여주기
  • :n[ext] : 다음 파일로 넘어가기
  • :prev[ious] : 이전 파일로 넘어가기 (단 편집 중인 파일이 저장되지 않으면 다음 파일로 넘어갈 수 없다.)

문자열 탐색

  • /aaa : 'aaa' 찾기 (현재 위치부터 뒤로)
  • ?aaa : 'aaa' 역방향 찾기 (현재 위치부터 앞으로)
  • / : 가장 최근에 검색한 문자열 다시 검색
  • ? : 가장 최근에 검색한 문자열 다시 역방향 검색
  • :set noh : 문자열 검색 후 문자열 강조 끄기

치환

vi에서 치환은 정규표현식이 이용된다. (실제로 이 상태에서 실행하는 명령어는 ed나 ex라는 프로그램이 처리하게 된다. 그래서 보통 이 상태를 "ed-모드"라고 한다.) 문서에서 원하는 패턴을 찾으려면 바로 위에 '문자열 탐색'에서 설명된 바와 같이 /문자열 이나 ?문자열 을 사용한다. 문자치환 명령은 다음과 같다.

[형식] :범위s/변경전/변경후/수정자  

'범위'는 명령이 실행될 범위(예: 10,20 이면 10행 부터 20행 까지)를 나타낸다. 's'는 치환(substitute)의 약자이며 '수정자'는 치환 명령의 세부사항을 결정한다. 필요한 것만 뒤에 적어주면 된다. (중복 가능)

  • g (global) - 한 줄에서 일치하는 부분을 여러개 찾았을 때 전부 치환한다. 이것을 사용하지 않으면 처음 것만 치환.
  • c (confirm) - 만족하는 정규표현식을 찾았을 때 치환하기 전에 확인한다.
  • i (ignore-case) - 대소문자를 구별하지 않는다.

"변경전"과 "변경후"에 치환할 내용을 입력한다. "변경전"에 정규표현식을 적는다. 정규표현식으로 ., *, ^, $, [], \(...\), \<...\>, POSIX.2 단축 표현을 사용할 수 있다. 여기서 여러 문자를 묶여서 단위를 만들고 찾은 내용을 기억하는 특수문자가 \(, \)임을 주의해야 한다. 반대로 (, )가 일반문자이다. vim(VI iMproved)에서는 vi에 추가로 |, +, (?와 같은) =, {n,m}을 사용할 수 있지만, 앞에 \ 를 붙여야 한다. 또, vim에는 \i, \k, \p, \s 등의 단축 표현들이 있다.

"변경후"에 \n & 를 사용할 수 있다. \n 는 "변경전"에서 n번째 \(...\) 에 대응하는 부분이고, & 는 "변경전"에 만족한 전체를 나타낸다. 예를 들어,
:%s/\([0-9][0-9]*\) \([Cc]hapter\)/\2 \1/
는 문서에서 12 Chapter같은 부분을 Chapter 12와 같이 치환하고,
:%s/F[1-9][12]*/&/g
는 HTML 문서에서 "F1" ~ "F12"란 단어 모두를 굵은 체로 바꿉니다. (주의! &는 정규표현식의 특수문자는 아니지만 vi의 특수문자이므로, 문자그대로의 &를 사용하려면 대신 \& 를 사용해야 한다.) 이외에도 (뒤를 모두 대문자로) \u 나 (뒤를 모두 소문자로) \l 같은 기능이 있다.

    :%s/aaa/bbb/g - 파일 전체(g)에서 'aaa'을 'bbb' 로 치환
    :%s/^M//g - 파일 전체(g)에서 ^M 을 삭제. ^M은 Ctrl+V+Enter로 입력한다.
    :s/aaa/bbb/ - 현재 행에서 'aaa'을 'bbb' 로 치환
    :1,10 s/aaa/bbb/ - 1행부터 10행 까지 'aaa'을 'bbb' 로 치환
    :1,. s/str/rep/ - 1부터 현재행까지 'aaa'를 'bbb' 로 전부 바꾸기
    :g/감자/s//바위/gc - 각 발생 확인 후 대체

주의할 점은 치환명령어가 / 문자로 각 부분을 구분하기때문에 "변경전"이나 "변경후"에 / 문자를 사용하려면 \/ 같이 써야한다.
필요하다면 / 대신 다른 문자를 사용해도 된다. 예를 들어,
:%s/\/usr\/local\/bin\//\/usr\/bin\//g
대신
:%s#/usr/local/bin/#/usr/bin/#g
가 알아보기 더 쉽다.