vi 에디터 사용법 (vim editor)

HYEONG HWAN, MUN/ 9월 26, 2018/ 미분류/ 2 comments

이 글에서는 거의 대부분의 리눅스 배포판에 포함되어 있는 vi 호환 에디터vim 에디터의 사용법에 대해 설명합니다.
당신이 최근 5년 이내에 배포된 리눅스를 설치하였다면 vim 에디터는 이미 설치되어 있을 것입니다. (또한 기본값입니다)


만약 당신의 시스템이 오래되어 vim 에디터가 설치되어 있지 않다면 다음의 명령어를 통해 vim 을 설치하세요.
vim 은 VI iMproved 의 약자입니다. (향상된 vi)

Ubuntu 의 경우

# apt-get install vim

CentOS 의 경우

# yum install vim

 


vi 에디터는 모든 Linux/ Unix 시스템에서 사용할 수 있습니다.
vi 에디터를 사용하기 위해서 마우스 입력 장치가 필요 없으며, 키보드 입력으로 모든 기능을 사용할 수 있기 때문에 터미널 환경에서 주로 사용되는 프로그램 입니다.

vi editor 는 vi(sual) editor약자이며 “브이-아이 에디터” 라고 부릅니다.

< vi 에디터 개발자 Bill Joy >

 

현재는 예전 초기의 original vi 로는 사용하지 않고, 리눅스 배포판에 포함되는 Vim, 그리고, BSD 라이선스로 제공되며 원본 vi의 동작과 호환성으로 정평이 나 있는 nvi, 독자적인 팬층을 확보한 elvis 가 주로 사용됩니다.
이것들을 굳이 비유하자면, 리눅스의 Ubuntu, CentOS, Fedora, Redhat 의 관계라고 보면 됩니다. 파생관계이죠. 약간의 부분만 다르고 대부분은 비슷합니다.

저는 실무 위주의 설명을 할 것이기 때문에 리눅스 배포판에 포함된 vim 에디터에  대해 설명할 것입니다.

 

개인적으로 조언하자면, 본문에 나타난 기초적인 것만 vi 로 처리하고, 복잡한 소스는 ftp나 ide 로 서버에 직접 연결해서 마우스와 함께 비쥬얼 위지윅 에디터 환경에서 작업하기를 권장합니다. 굳이 옛방식을 쓸 필요는 없습니다. 더 능률이 좋은 방식이 있다면 그것을 사용하세요.

당신이 vi 와 친숙하지 않다면 사용하지 않아도 서버 운영에 아무런 지장이 없습니다. 다만 light user 가 아니라 이쪽 분야 직업을 하시려면 vi 에디터를 어느정도 사용할 줄 알아야 합니다.

아주 드물게 (터널링, 프록시, 쉘 전환 등) 반드시 vi 로 처리해야 할 경우가 생기기도 합니다.


vi 에디터를 실습하려면 다음의 더미텍스트(lorem ipsum, 의미없는 채우기 텍스트) 를 다운로드하세요.

http://www.loremipsum.de/downloads/version5.txt

리눅스에서 다운로드 명령어

# wget http://www.loremipsum.de/downloads/version5.txt

 


vi 에디터 모드

vi 는 네개의 모드가 있습니다.

  • 명령 모드 (command mode)
  • 입력 모드 (insert mode)
  • EX 모드 (ex mode)
  • 비쥬얼 모드 (visual mode)

비쥬얼 모드를 실전에서 쓰는 사례는 잘 보지 못했습니다. 현재 본문 글에서는 설명하지 않습니다.
비쥬얼 모드 설명글 : https://m.blog.naver.com/nfwscho/220351071053

참고로 나무위키(https://namu.wiki/w/vi) 에서 설명하는 mode 분류는 잘못되었습니다. 관련된 일부 설명도 잘못되었습니다. 위의 비쥬얼 모드 설명글의 diagram이 더 올바릅니다.

명령 모드에서는 입력 기능 이외의 특수한 동작을 할 수 있습니다. (복사, 붙여넣기, 되돌리기 등등)
입력 모드에서는 키보드를 통해 글자를 입력할 수 있습니다.
EX 모드에서는 ex 명령어 (저장, 나가기 등)를 사용할 수 있습니다.

The vi editor editor is built on an earler Unix text editor called ex. ex commands can be used within vi.

참조https://www.washington.edu/computing/unix/vi.html#twenty

아주 먼 예전에는 메모리나 입력장치 등의 제약이 커서 파일을 한 줄씩만 편집 가능했습니다. 이때 사용하던 에디터는 줄단위 편집기ex editor 이었습니다. 하드웨어가 발달하면서 파일 단위로 편집할 수 있는 vi 에디터가 개발되었습니다. 이것은 ex 에디터 코드를 확장해서 만들어졌습니다. (ex 와 vi 의 개발자는 같다.) 따라서 vi 에디터에서 ex 에서 사용하던 명령을 사용할 수 있습니다.

 

vi 에디터 시작하기

다음의 명령어를 통해 vi 에디터를 시작할 수 있습니다.

vi filename

filename 은 현재 폴더에 존재하는 파일명을 입력하세요. 다른 폴더에 존재하는 파일을 수정하려면 파일의 전체 경로를 입력하세요.
잘못된 입력을 방지하기 위해 키보드 tab 키 자동 완성을 사용하는 것을 권장합니다.

 

또는 새로운 파일을 생성하려면 새로운 파일 이름을 지정하면 됩니다.

vi newfilename

 

에디터가 열리면 “~” 문자로 시작하는 빈줄이 보이고, 마지막 줄에서는 편집할 파일의 이름과 상태를 볼 수 있습니다.

“~” 문자로 시작하는 빈줄은 NULL 라인이며, 에디터상에서만 존재하는 여백입니다.

 

vi 에디터는 워드프로세서 에디터와 다르게 처음 실행시 입력 모드가 아니라 명령 모드로 시작합니다.

 

vi 에디터 종료하기

켰으면 끄는 법을 알아야 합니다.

명령 모드에서 실행합니다.
참고로 vi 에디터 사용중, <ESC> 키를 두번 누르면 무조건 vi 명령 모드가 됩니다.

Key 동작
:w 현재 변경사항 저장
:wq 현재 변경사항 저장 후 나가기
:q! 저장하지 않고 나가기
:q 나가기 (변경사항이 있다면 오류가 발생하고 나가지지 않음)
:!bash (편집 상태를 그대로 두고 bash 쉘 실행. 재 진입하려면 exit 후 엔터)
(대문자) ZZ 현재 변경사항 저장 후 나가기

 

입력 모드 전환 후 글자 입력하기

글자를 입력하기 위해서는 먼저, 명령 모드에서 입력 모드로 전환해야 합니다. 일반적으로 사용하는 입력 모드(insert mode)로 전환하는 명령어는 다음과 같습니다.

Key 동작
i 명령 모드에서 입력 모드로 전환 (현재 커서의 위치에)
I 명령 모드에서 입력 모드로 전환 (현재 커서 줄의 맨앞 위치에)
a 명령 모드에서 입력 모드로 전환 (현재 커서의 바로 뒤 위치에)
A 명령 모드에서 입력 모드로 전환 (현재 커서 줄의 맨뒤 위치에)

i 만 기억하시면 됩니다. (나머지는 알면 좋고, 몰라도 별 문제 없음)

 

커서 이동하기

다른 위치로 커서를 이동하려면 명령 모드로 전환한 후 방향에 맞추어 이동 명령키를 입력합니다.
<ESC> 키를 누르면 명령 모드로 전환합니다.

커서 이동 명령키
Key 동작
h 왼쪽으로 1 space 이동
l 오른쪽으로 1 space 이동
j 아래줄로 이동
k 윗줄로 이동
왼쪽으로 1 space 이동
오른쪽으로 1 space 이동
아래줄로 이동
윗줄로 이동

 

물론 입력 모드로 전환 후 키보드 방향키를 사용해 커서를 이동해도 됩니다.

유의할 점은, 라인(row line)의 시작과 끝에서 좌우 커서 이동을 하더라도, 줄 변경이 일어나지 않는다는 것입니다.

 

입력 되돌리기

워드프로세서의 control-z 와 동일한 기능입니다. 한 입력 단계를 되돌립니다.(undo)

Key 동작
u 한 단계 되돌리기 (반복입력 가능)

잘못 입력하거나, 잘못 삭제했을 경우 사용하는 명령어입니다. 자주 사용합니다.

 

글자 지우기

글자를 지우기 위해서는 명령모드 상태에서 커서를 지울 글자로 이동 후 x 키를 누릅니다.

Key 동작
x 커서 위치 글자 삭제
5x 커서 위치 포함 5글자 삭제
X 커서 앞 글자 삭제(backspace 처럼)

 

단어 지우기 (Delete Word)

dw 명령은 현재 커서로부터 다음 단어 첫글자 전까지 지우는 명령입니다. 지우려는 단어의 첫 단어로 커서를 이동 후 dw 를 입력하면 단어(word)가 삭제(delete) 됩니다.

Key 동작
dw 커서 위치로부터 다음 단어 첫글자 전까지 지우기

헷갈리고 실수할 확률이 있으므로 dw 명령 대신 편집모드(insert mode) 에서 작업하도록 합시다.

 

줄 지우기 (delete row)

한 줄 전체를 지우려면 커서를 지우려면 줄로 이동 후 dd 를 입력합니다.

Key 동작
dd 커서 위치의 줄 삭제
2dd 커서 위치로부터 2줄 삭제
D 커서 위치로부터 줄 끝까지 삭제

 

줄 복사하기 (copy row)

한 줄 전체를 지우려면 커서를 복사하려면 줄로 이동 후 yy 를 입력합니다.

Key 동작
yy 커서 위치의 줄 버퍼로 복사
2yy 커서 위치로부터 2줄 버퍼로 복사
p 버퍼에 담긴 내용을 커서 다음 줄에 삽입
P 버퍼에 담긴 내용을 커서 이전 줄에 삽입

 

한 글자 치환하기

글자 하나를 다른 글자로 변경하려면, 커서를 변경할 글자 위로 이동 후

Key 동작
r 글자 입력시 해당위치의 글자가 치환됨

키를 입력합니다. 그 후 입력하는 글자로 해당 글자가 변경됩니다.

 

빈 줄 추가하기

Key 동작
o (소문자) 커서 다음줄에 빈줄 추가 + 입력 모드 전환
O (대문자) 커서 윗줄에 빈줄 추가 + 입력 모드 전환

 

줄 합치기

현재줄 + 공백 + 다음줄의 첫단어를 연결하는 명령어 입니다.

Key 동작
J (대문자) 현재 줄에 이어 다음줄을 붙입니다. (현재줄 + 공백 + 다음줄의 첫단어)

 

빠른 위치 탐색

다음의 명령어를 사용하여 파일을 빠르게 탐색할 수 있습니다.

Key 커서
w 한 단어 앞으로 이동
b 한 단어 뒤로 이동
^ 줄 맨 앞으로 이동
0 줄 맨 앞으로 이동
$ 줄 맨 뒤로 이동
1G 파일 1번째 줄로 이동
5G 파일 5번째 줄로 이동
G 파일 마지막 줄로 이동

 

파일 내 검색하기 (검색 이동)

문서 내의 단어를 찾아서 이동하려면 명령 모드에서 다음을 입력합니다.

Key 동작
/helloworld 문서 내의 helloworld 를 찾아서 이동
n (검색 이동 상태에서) 다음 일치 항목으로 이동
N (검색 이동 상태에서) 이전 일치 항목으로 이동

파일 내 문자 치환

앞단어를 찾아서 뒷단어로 변경합니다. 의외로 많이 쓰는 명령어 입니다. 정규식 사용 가능합니다.

:%s/hello/goodbye/ig

hello 를 찾아서 goodbye 로 변경.
뒤에 i 는 대소문자 구분안함(case Insensitive). 없을 경우 대소문자 일치가 일치 한 것만 변경.
뒤에 g 는 줄 내 모두변경(Global). 없을 경우 라인에서 첫번째 일치 항목만 변경.

거의 ig 파라미터를 같이 쓰기 때문에 위의 패턴을 그대로 외우기를 권장합니다. (한 10번 정도 쓰면 자동으로 외워짐)

 


글 작성에 참고한 글

vi 에 대한 정의 - https://ko.wikipedia.org/wiki/Vi
vi 설명 - https://namu.wiki/w/vi
vim Cheat Sheet - https://vim.rtorr.com/
VIM Editor Commands - https://www.radford.edu/~mhtay/CPSC120/VIM_Editor_Commands.htm
How to Use the vi Editor - https://www.washington.edu/computing/unix/vi.html
비주얼모드 진입, 비주얼 라인, 비주얼 블럭 - https://m.blog.naver.com/nfwscho/220351071053
vi편집기 사용법 - http://igoto.x-y.net/xe/linux/154
VI 에디터 사용법 - https://wiki.kldp.org/KoreanDoc/html/Vim_Guide-KLDP/Vim_Guide-KLDP.html


감사합니다!

2 Comments

  1. vim 배우려고 유료게임 하면서 조금 익숙해 졌어요..

    근데 여긴 더 정리가 잘되있고 훌륭하네요

    1. vi 설명해달라는 요청이 있어서 글을 작성해봤습니다.
      vi 사용하는 동영상도 찍을 예정이에요.

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*