리눅스 vi 에디터

2015. 10. 18. 13:31개발노트

명령모드(Command mode)


  한 문자 또는 두 문자로 구성된 vi 전용 명령어를 사용하는 모드로서 "커서이동/문자삭제/문자(열)교체/문자열검색" 등을 할 수 있는 모드를 의미합니다. vi를 처음 실행하면 명령모드로 시작합니다. vi는 대문자와 소문자 명령을 구분하게 되며 이런 점에 유의하여 잘 사용해야 합니다.


입력모드(Input mode)


  vi 편집화면에서 문자를 입력할 수 있는 상태를 의미합니다. 명령모드에서 입력모드로 전환할 수 있는 명령어인 i, a, o, I, A, O, R 등으로 명령을 내리면 입력모드로 전환됩니다. 입력모드로 전환되면, 화면 하단에 "--INSERT--"라고 표시됩니다. 이 상태에서 <Esc> 키를 누르면 다시 명령모드로 전환됩니다.


EX모드(execution mode)


  vi의 특별한 명령어를 실행하는 실행모드를 의미합니다. 명령모드에서 콜론(:)을 누르면 vi 화면 하단 좌측에 vi 특수 명령어를 입력할 수 있는 ":"이 나타납니다. 이 상태에서 vi의 특별한 명령어를 사용할 수 있습니다.



이동 명령


vi에서 이동 명령은 앞에서 배운 명령모드 상태에서 이루어집니다.


글자단위 이동

h : 왼쪽으로 한 글자 이동

l : 오른쪽으로 한 글자 이동

k : 아래쪽으로 한 글자 이동

j : 위쪽으로 한 글자 이동


단어단위 이동

W : 다음 단어의 처음으로 이동

B : 현재 단어의 처음으로 이동

E : 다음 단어의 끝으로 이동


행, 문장 및 단락의 처음과 끝으로 이동

0 또는 ^ : 현재 행의 다음 행으로 이동

$ : 현재 행의 맨 끝으로 이동

+ : 다음 행의 처음으로 이동

- : 이전 행의 처음으로 이동

( : 문장의 시작으로 이동

) : 문장의 끝으로 이동

{ : 단락의 시작으로 이동

} : 단락의 끝으로 이동


화면 내에서 행 단위로 이동

H : 현재 화면의 맨 위로 이동

M : 현재 화면의 가운데행으로 이동

L : 현재 화면의 맨 아래로 이동


한 화면씩 스크롤

Ctrl + F : 한 화면 다음으로 이동

n + Ctrl + F : n 화면 다음으로 이동

Ctrl + B : 한 화면 이전으로 이동

n + Ctrl + B : n 화면 이전으로 이동

Ctrl + D : 반 화면 다음으로 이동

n + Ctrl + D : n 행 다음으로 이동

Ctrl + U : 반 화면 이전으로 이동

n + Ctrl + U : n행 이전으로 이동


행 번호를 알 경우

[행번호]G : 원하는 행으로 직접 이동



입력하기


i : 현재 위치부터 입력

I : 현재 행 맨 처음부터 입력

a : 현재 위치 다음부터 입력

A : 현재 행 끝부터 입력

o : 현재 행 다음 행에 입력

O : 현재 행과 앞 행 사이에 입력



저장 및 종료


  저장을 하기 위해서는 우선 입력모드에서 빠져 나와 명령모드로 변경해야 합니다. <Esc> 키를 눌러 명령모드로 바꾼 뒤에, ":w test.txt"와 같이 명령을 내리면 test.txt 이름으로 문서가 저장됩니다. 그리고 ":q" 명령을 내리면 vi가 종료됩니다. 다음과 같이 ":wq test.txt"와 같이 혼합하여 사용합니다. 만약 기존 문서를 연 상태라면 ":w", ":q", ":wq" 등의 명령을 내립니다.

  명령 뒤에 ":q!"와 같이 "!"을 붙이는 경우도 있는데, 이것은 명령을 강제로 적용할 때 사용합니다. ":q!" 명령은 종료를 강제로 하는 것을 의미합니다. 저장하지 않고는 종료가 불가능하기 떄문에 저장하지 않고 그냥 종료를 원할 때 사용합니다. 그리고 쓰기 권한이 없으나 자신 소유의 파일일 경우에도 "w!"와 같이 강제 명령을 내려서 사용할 수 있습니다.


:w : 불러온 파일명으로 데이터 저장

:w [파일명] : 지정 파일명으로 데이터를 저장

:w >> [파일명] : 지정 파일명으로 데이터를 추가하여 저장

:w! : 강제 저장

:q : 종료

:q! : 저장 없이 강제 종료

:wq : 파일 저장 후 종료. 파일명 지정 가능.

:wq! : 강제로 파일 저장 후 종료. 파일명 지정 가능.

ZZ : 파일을 저장하고 vi 종료

:x : 파일에 변경이 있었다면 파일을 저장하고 vi를 종료



삭제, 수정 및 복사


한 글자 삭제하기

  명령모드에서 지우고자 하는 글자에 커서를 이동한 뒤 "x"를 누르면 커서 위치부터 뒷 글자가 한자씩 지워지며 당겨지게 됩니다. 이처럼 "x" 명령은 글자를 한 글자씩 지우는 역할을 하게 됩니다.


한 단어 삭제하기

  명령모드에서 "dw" 명령을 내리면 한 단어가 삭제됩니다. 그리고 "cw" 명령을 내리면 한 단어를 삭제하고 다른 내용을 삽입할 수 있도록 합니다. 앞에서 알아본 "x" 명령으로 계속 지운 후 "i"를 이용해서 다시 써야 하는 불편한 경우에 아주 유용합니다.


줄 단위로 삭제하기

  명령모드에서 지우고자 하는 행으로 이동한 뒤 "dd" 명령을 입력하면 현재 줄이 삭제되게 됩니다. 그럼 현재 커서가 위치한 행에서 커서 위치 뒷부분의 글들을 모두 지우고 싶을 때는 행의 끝을 가리키는 정규 표현식인 "$"를 함께 사용하면 됩니다.


실행취소(Undo)

  Undo 기능은 지금까지 실행한 것들을 역순으로 돌려놓는 것입니다. 명령모드에서 "u"를 실행하여, 앞에서 실행했던 명령을 취소할 수 있습니다.


복사 및 붙이기

  우선 복사를 원하는 행으로 이동합니다. 커서가 그 행의 어떤 위치에 있든 상관은 없습니다. "yy"라는 명령은 한 줄을 버퍼에 넣는 명령으로 복사와 비슷합니다. 명령모드에서 "yy"를 입력하면, 버퍼에 현재 행이 복사됩니다. 붙이기를 할 행의 한 줄 전에서 "p"를 입력하면 아래 한 줄이 밀리면서 붙여집니다. 대문자 "P"를 입력하면, 아랫줄이 아닌 윗줄로 붙이기가 됩니다.


두 파일 합치기

  두 개의 파일을 합쳐야 할 경우 ":r" 명령을 사용할 수 있습니다. 다음 화면에서 명령 전에 커서가 위치했던 곳 뒷부분에 cut.txt에 저장되었던 세 줄이 붙여졌습니다. 만약 현재 파일의 뒷부분에 내용을 붙이려면 커서를 마지막에 두고 r 명령을 내리면 됩니다.



삭제, 수정 및 복사에 관한 명령들


x : 현재 위치에서 한글자 삭제하기

X : 현재 위치에서 앞글자 삭제하기

dd : 현재 행 지우기

D : 현재 위치에서 행의 끝까지 지우기

dw : 단어 삭제하기

cw : 단어 삭제 후 입력

d$ : 커서가 있는 곳부터 행의 끝까지 지우기

dG : 커서가 있는 곳부터 파일 끝까지 지우기

p : 마지막으로 지워진 내용을 커서의 뒤/아래에 삽입

P : 마지막으로 지워진 내용을 커서의 앞/뒤에 삽입

xp : 두 문자를 바꿈

deep : 두 단어를 바꿈

ddp : 두 줄을 바꿈

yy : 현재 행을 복사

u : 바로 전에 수행한 명령 취소

U : 바로 전에 수행한 행의 모든 명령 취소

r : 다른 파일의 내용을 읽어 들여 붙이기



패턴 찾기


/문자열 : 아래 방향으로 문자열 검색

/ : 이전 패턴에 대해 아래 방향으로 검색을 반복

?문자열 : 위 방향으로 문자열 검색

? : 이전 패턴에 대해 위 방향으로 검색을 반복

n : / 또는 ? 명령에 대해 같은 방향으로 반복 검색

N : / 또는 ? 명령에 대해 반대 방향으로 반복 검색



외부 명령어 실행


  콜론(:)을 누른 후에 느낌표(!)를 입력하고 이것을 붙여서 외부 쉘 명령을 입력한 후에 <Enter>를 누르면 외부 명령어가 실행됩니다. 실행된 후에 다시 <Enter>를 누르면 vi 편집 화면으로 돌아갑니다.



화면상태 제어


^L : 화면을 다시 디스플레이

:set nu : 편집 중인 문서의 행 번호를 보여줌

:set number : :set nu와 동일

:set nonu : 편집 중인 문서의 행 번호를 보여주지 않음

:set nonumber : :set nonu와 동일



약자의 사용


:ab short long : short를 long에 대한 약어로 변경

:ab : 현재 약어 목록을 표시.

:una short : 편집 중인 문서의 줄 번호를 보여주지 않음



화면 줄 길이 조정


r <Return> : 문자를 뉴 라인으로 변경

J : 줄의 결합

:set wm=n : 오른쪽으로 n 문자 위치에서 자동적으로 줄 나눔



문자열 치환


:g/search-string/s//replace-string/g : 앞부분의 문자열을 찾아서 뒷부분의 문자열로 대체

:s/str/rep/ : 현재 행의 str을 rep로 대체

:1,.s/str/rep/ : 1부터 현재 행의 str을 rep로 대체

:%s/str/rep/g : 파일 전체 str을 rep로 전부 대체

:.$/aaa/bbb/ : 커서의 위치로부터 파일의 끝까지 있는 모든 aaa를 bbb로 대체

multi file 작업하기

vi * 로 폴더의 모든 파일 열기
:n 다음파일 열기
:n! 다음파일 강제로 열기