본문 바로가기
오픈소스SW

vi editor 초급

by sepang 2021. 9. 3.

 이번에 알아볼건 vi editor이다. 텍스트 에디터의 한 종류인데 우리가 흔히 쓰는 메모장도 텍스트 에디터의 한 종류이다. vi editor는 리눅스를 비롯한 unix 계열 os에서 많이 사용되는 텍스트 에디터이다. 처음 든 생각은 '그러면 메모장이랑 비슷한거 아닌가? 이거를 따로 학습할 필요가 있나?'였다. 그런데 사용법도 차이가 있고 기능도 굉장히 많아 학습 난이도가 꽤 있는편이라고 한다. 그래서 이번에는 vi editor를 처음 다룰때 알아야할 기본적인 내용에 대해 학습해보았다.

 사용할 vi editor는 vim이다. 'vi improved'의 줄임말이다. 윈도우에서 편하게 실습하기 위해 https://www.vim.org/ 에서 windows용 vim을 다운로드 받았다.

vim 모드의 이해

vim mode

우선 vim은 마우스를 잘 사용하지 않고 거의 키보드로만 조작해야 한다. 심지어 방향키도 잘 안쓰고 영문키안에서 왠만한 작업이 가능하다고 한다. 설치하면 gvim이라는 것이 있는데 이는 주요기능을 gui로 제공한다. 나는 익숙치 않으니 이것을 사용했다. 한번 vim을 열어서 아무거나 입력해보자. 아무것도 입력이 되지 않는다... 나는 처음에 무슨 오류가 발생한 줄 알았다. 이런 혼란을 없애기 위해 우리는 모드에 대해 알 필요가 있었다.

 위의 그림을 살펴보자. 4가지의 모드가 있는데, 우선 처음 시작했을 때의 모드는 normal mode이다. normal mode는 모드를 변경할 때 거쳐야하는 경유지라고 생각하자. normal mode에서는 i, :, v 키를 누르면 해당하는 모드로 변경된다. 이후 다른 모드로 변경을 하려면 일단 esc 키를 눌러 normal mode로 전환해야 한다. 그 뒤 다시 i, :, v 키를 눌러 다른 모드로 전환할 수 있다. 이 정도 이해를 하고 이제 기본적인 기능에 대해 알아보자.

위 사진이 이번에 알아볼 기본적인 기능들이다. 조금씩 살펴보자.

insert mode

 'i'를 눌러 insert mode로 진입한 뒤 글을 써보면 일반 메모장 처럼 글이 적힌다. 커서는 방향키를 이용하여 움직일 수 있다. 다음과 같이 입력하고 다른 이름으로 저장을 이용해 .txt파일로 저장해보자.

 분명 나는 'test1.txt'파일만 저장했는데 .txt.swp라는 파일이 하나 더 생겨났다. 이 파일은 vi editor가 작업을 자동으로 저장하고 백업을 하기위한 파일이다. vi editor가 종료되면 자동으로 삭제된다.

문자 조작

 일반모드에서 커서를 이동할 때. 방향키를 써도 되지만 'h(left), l(right), k(up), j(down)'을 사용해도 된다. 굳이 방향키를 사용하지 않고 영문키로 모든걸 하기 위함이라고 한다. 입력할 때 normal mode에서 내가 원하는 위치로 커서를 이동하고 'i'를 눌러 문자를 입력하는 식으로 한다고 한다. 아니 이게 더 귀찮은거 아닌가? 아직 익숙치 않은 내게는 이해하기 힘든 구조이다,,,

문자 추가

 위를 보면 커서가 한 문자위에서 깜빡인다. 해당 블럭 기준으로 왼쪽으로 내용을 추가하고 싶으면 'i(insert)'를, 오른쪽으로 추가하고 싶으면 'a(append)'를 누르자.(insert mode로 자동전환) 현재 행의 맨 앞으로 커서를 이동시키려면 'shift + i (대문자 I)'를 누른다. 행 시작시 'tab'을 눌러 들여쓰기를 할 수 있는데 이 경우에는 'shift + i'입력시 행 앞이 아닌 행 첫문자 앞으로 커서가 위치한다. 반대로 'shift + a(대문자 A)'를 누르면 행의 맨 끝자리로 이동한다. 해당 단축키는 tab키를 눌러 행 맨 뒤에 빈칸을 만들어도 무조건 행의 가장 끝으로 이동한다.

행 추가

 새 행을 만들때는 행의 맨 끝에서 enter를 눌러도 되지만 'o(알파벳)'을 누르면 현재 행에 커서가 어디에 위치하든 밑에 새 행을 만든다. 'shift + o(대문자 O)'를 누르면 반대로 현재 행에서 위에 새 행을 만든다(insert mode로 자동전환). 

내용 삭제

 내용을 지우고 싶을 때는 어떻게 해야 할까? delete 키를 누르면 한 글자씩 지울 수가 있다. 만약 insert mode라면 익숙한 back space를 써도 된다. normal mode에서는 좀더 다양한데 'x'를 누르면 한 글자씩 지울 수 있다. 그런데 행의 내용을 전부지워도 그 행이 삭제되지는 않는다. normal mode에서 행을 삭제하려면 'd'를 두번 누르면 된다(dd). 

 ⁕ 같은 키를 두번 누른다는 것은 '적용 범위를 행으로 한다'라고 생각하자. 그리고 w(word)키를 두번쨰로 누르면 '적용 범위를 현재 커서가 위치한 단어로 한다'라고 생각하자.

 ⁕ 소재목을 내용 삭제라고 했는데 삭제가 아니라 '잘라내기'와 유사하다. 이후 붙여넣기 기능을 사용하면 삭제한 내용을 붙여넣을 수 있다.

내용 수정

 normal mode에서 문자하나를 수정하고 싶으면 수정할 문자위에 커서를 올리고 'r(replace)'을 누른뒤 바꿀 문자를 입력하면 해당 문자로 수정되고 다시 normal mode로 돌아온다. 한 단어를 수정하고 싶으면 'c(change)'를 누른 뒤 'w(word)'를 누르면 단어가 삭제된다. 'c'를 두번 누르면 해당 줄 전체가 삭제된다. 이 두 단축키는 누른 뒤 계속 insert mode가 유지된다. 그리고 현재 커서위치에서 행 끝까지의 내용을 지우려면 'c + $'를 누르면 된다.

undo & redo

 만약 실수로 내용을 지우거나 했다면 undo를 하여 이전 상태로 되돌리면 된다. 이제는 당연하겠지만 우리가 늘상 써왔던 'ctrl+z'가 아니다. normal mode에서 'u'를 누르면 undo가 된다. 반대로 redo를 하려면 'ctrl+r'을 누르면 된다.

 방금 실행했던 명령을 실행하려면 동일한 단축키를 입력해도 되지만 '.'을 입력하면 최근 명령이 다시 실행된다.

색인

 'ctrl+f'같은 색인기능을 사용하려면 normal mode에서 '/'를 누르고 찾을 내용을 입력하면 된다. 해당하는 내용을 가진 부분이 강조된다. 이후 enter를 누르고 n키를 누르면 커서가 다음 강조표시를 가리킨다.

복사

 복사를 하려면 y(yank)키를 이용하자. 행 복사는 'y를 두번 입력(yy)'하면 되고 단어를 복사하려면 'y+w'를 누르면 된다. 붙여넣기를 할 때는 p키를 이용하자. 그냥 'p(paste)'를 누르면 현재 커서의 오른쪽에 붙여넣고, 'ctrl + p'를 누르면 왼쪽에 붙여넣어진다. 위에서도 설명했지만 delete 했던 내용을 붙여넣을 수도 있다.

※ vi editor의 명령 형식

  • [operator] + [count] + [motion]
  • [count] + [operator] + [motion]

 vi editor의 명령 체계는 'operation(명령), count(숫자), motion(방향or행동)으로 구성되고 위처럼 순서가 있다. 예를 들어보자. normal mode에서 숫자키 5를 누르고 o를 눌러 새 행에 'abc'를 입력한 뒤 esc로 normal mode로 돌아오면 abc가 적힌 행이 5줄 생겨나있다. 즉 count는 반복횟수라고 생각하면 되겠다. 다른 예로 x키는 문자하나를 지우는데 숫자키 5를 누르고 x를 누르면 5글자가 지워진다. 이런 방법은 'dd'나 'c+w'등의 단축키에도 적용이 되니 시도해보자.

save & exit

 

 gvim에서는 위처럼 중요기능이 gui로 구성되어 있기에 파일 저장이 쉽다. 그래도 키보드만으로 파일을 종료와 저장을 하는 방법을 알아보자. 친절하게 사진을 보면 단축키를 가르쳐주고 있다. 공통적으로 ':'가 있음을 확인할 수 있는데 바로 command mode로 전환하는 키이다. command mode로 들어가면 창의 맨 밑에 커맨드 입력창이 생겨나는데 특정 내용을 입력하면 해당하는 명령을 수행하는 것이다.

저장

 이미 저장된 파일을 수정하고 저장하는 것이라면 그냥 ':w(write)'를 입력하면 된다. 하지만 처음 저장하거나 다른 이름으로 저장을 하려면 ':w (파일이름)'을 입력하면 된다. 만약 저장되는 디렉토리에 (파일이름)과 같은 파일명의 파일이 있는데 여기에 덮어쓰기하려면 ':w! (파일이름)'을 입력하자. 그러면 저장이 되긴하는데 어디에 저장 되었는지를 알아야 한다.

 여기서 이 카테고리에서 다뤘던 '리눅스 기초 명령어'가 사용된다. 현재 저장 위치를 알기 위해서는 command mode 진입 후 'pwd'를 입력하면 저장이 되는 위치를 확인할 수 있다. 다른 곳에 저장을 하려면 'cd' 커맨드를 이용하면 된다.

종료

command mode에서 'q(quit)'를 입력하면 종료할 수 있는데 만약 현재까지 한 내용을 저장하지 않고 종료하려하면 경고가 뜬다. 그렇게 하고 싶다면 저 빨간 박스의 말처럼 'q!'를 입력해주자. 현재까지 수정사항을 저장하고 종료하려면 'wq' 커맨드를 입력하면 된다.

visual mode

4가지 모드 중 visual mode만 한번도 사용하지 않았다. normal mode에서 v키를 누르거나 마우스로 블럭을 지정하면 visual mode로 전환된다. V(대문자)를 눌러도 된다.

 이 모드에서는 마우스로 블록을 지정할 수 있다. 만약 V(대문자)를 이용해 진입했거나 ctrl키를 누른채 블럭을 지정하면  행 단위로만 블록 지정을 할 수 있다. 위에서 설명한 단축키를 이용해서 해당 블록을 복사하거나 잘라낼 수 있다. 이외의 기능도 알아보자

대소문자 변환

visual mode에서 '~'을 누르면 현재 커서의 문자가 대문자면 소문자로, 소문자면 대문자로 변경된다.

들여쓰기, 내어쓰기

들여쓰기 할 행에 커서를 위치하고 '>'를 두번 누르면(>>) 해당 행이 들여쓰기 된다. 또는 visual mode에서 블럭을 지정하고 '>'를 누르면 해당 블럭이 포함된 행들이 들여쓰기 된다. 내어쓰기는 반대로 '<'를 이용하자.

 블럭을 지정하고 '='를 두번 누르면 해당 블럭에 자동 들여쓰기가 적용된다. 아무 파일에나 적용되는 건 아니고 c언어같이, 특정 문법으로 된 파일에 해당 단축키를 사용하면 문법에 맞는 들여쓰기가 자동으로 적용된다.


이렇게 기본적인 vim 사용법을 알아봤는데 글로 설명하니 디테일한 부분까지 묘사하기가 힘들었다. 아마 직접 vim에서 사용해보면 이것이 무슨 말인지 알 것이라 생각한다. 지금까지의 내용은 vim의 극히 일부라고 한다... 익숙하지 않고 중요 기능들도 몰라서 그런가 아직까지는 VS code같은게 훨씬 좋은거 같다. 언젠가 필요성이 느껴지면 vim의 심화내용을 정리하지 않을까 싶다.


참고자료

SST youtube channel / https://www.youtube.com/channel/UCora73FsjH9ZuIjCvJ0J0iA

댓글