본문 바로가기

Linux & Mac

Vi 사용법 1 (명령 모드)

반응형

 Vi의 사용법에 대한 글은 10여 년 전에 이미 올렸었습니다. 그 후 계속 다양한 환경에서 Vi를 사용하면서 꾸준히 사용하는 기능과 사용하지 않는 기능, 그리고 여러 가지 팁들도 생겨서 업데이트하는 글을 게재합니다. 이 글은 vi의 모든 기능을 담지 않습니다. 10년 넘게 vi를 이용하면서 항상 이용하고 있는 것들 위주의 노하우 형식으로만 설명 하겠습니다. 혹시 그 이상의 정보를 원하시면 다른 분들의 글이나 서적을 찾아보시기 바랍니다.

Vi의 장점 (주관적인 의견임)

가볍다 : 대용량 파일과 같이 다른 에디터가 열지 못하는 파일도 쉽게 확인 할수 있다.

빠르다 : 키보드만 이용해서 모든 편집이 가능 하며, 심지어 표준 키보드의 60% 규격의 키보드(Ex 해피해킹 등) 영역만을 이용한다.

확장성 : 다양한 플러그인을 이용한 기능 추가가 쉽고, 설정을 통한 개인화가 용이하다.

Vi의 모드

 Vi에는 3가지 모드가 있습니다. 아래 그림과 같이 명령모드, ex 모드, 입력 모드입니다.

 vi가 켜지면 명령 모드로 동작합니다. 이 부분부터 처음 접하는 분은 어리둥절해집니다. 분명 커서가 있지만, 원하는 텍스트를 넣어도 문서에 입력되지 않고, 알 수 없는 동작을 합니다. Vi에서 명령 모드는 키보드의 각 키에 매핑된 명령이 있어 키를 누르면 텍스트를 입력하는 대신 명령을 사용하기 때문입니다. 키 입력을 통해 문장을 입력하려면 'i', 'a', 'o', 's' 키를 눌러서 입력 모드가 되게 해야 하죠. 입력 모드에서 esc 키를 누르면 명령 모드로 돌아오고, 특수한 키 ('Q', ':', '?', '/')를 이용해서 ex 모드에 들어가면, esc 혹은 Enter 키를 이용해서 명령 모드로 변경할 수 있습니다. 각각의 모드에서 할 수 있는 작업이 명확하게 분리되어 있음으로, 각 모드 별로 글을 쓰겠습니다. 이번 글은 명령 모드이고, 다음 글은 ex 모드가 될 것입니다. 입력 모드는 일반 텍스트 에디터와 같으니 간단히 언급하겠습니다.

 

명령 모드

 아래 그림은 명령 모드에서 주요 커맨드 리스트입니다. 위는 시프트 동시 입력(대문자)이고, 아래는 단독 입력(소문자)인 경우입니다. 아래 표기된 기능 외에도 거의 모든 키에 기능이 매핑되어 있습니다. 아래 그림에서는 제가 평소 이용하는 키만 언급하였습니다. 그 외 키들의 기능을 알고 싶으시면 링크(가끔 필요한 기능을 찾아보는 링크입니다)를 참조하시기 바랍니다.

이동 키와 입력 모드로 변경되는 키는 각각 파란색과 노란색으로 표기하였습니다. 그럼 사용 빈도가 높은 순으로 설명하겠습니다.

 h, j, k, l, %

 vi의 가장 큰 특징이라고 할 수 있습니다. 물론 표준 키보드와 텐키리스 키보드에는 상하좌우의 화살표가 따로 있습니다. 하지만 해당 키를 타이핑하기 위해서는 오른손이 일반 타이핑 위치를 벗어나게 됩니다. 별 것 아닌 것 같지만, 익숙해지면 이해되실 거예요. 이 손이 일반 타이핑 위치에서 벗어나는 건 상당히 큰 단점입니다. 저는 'h', 'j', 'k', 'l'을 이용한 커서 이용에 익숙해진 때부터 아예 키보드를 60%의 배열만 있는 커스텀 키보드로 변경했습니다. 처음엔 화살표 키와 혼용되겠지만 vi를 오래 쓰실 계획이라면 신경 써서 'h', 'j', 'k', 'l'로 커서 이동을 해보세요.

 이것 외에도 '(', ')', '{', '}', '$', '^' 등의 이동 키가 있으니, 적절히 혼용해도 좋습니다. 저는 개인적으로 'h', 'j', 'k', 'l'과 '%' 이용을 추천합니다. 다른 이동 키의 경우, OS의 반복 입력 딜레이를 0으로 만들면, 입력이 느려서 답답한 느낌은 없습니다.

 '%'는 특수한 이동키입니다. 커서를 괄호 위에 두고 '%'키를 입력하면 짝이 되는 괄호로 커서가 이동합니다. 

 입력 모드 변경

 입력 모드 변경키는 대소문자 조합으로 총 8가지가 있습니다. 처음에는 'i'키만 이용해도 충분합니다. vi를 이용하다 보면 자연스럽게 다른  모드 변경 키도 사용하게 됩니다. 개인적인 비중으로는 대소문자 구분 없이 'i' > 'o' > 's' > 'a'의 순으로 많이 사용하고 있습니다. 

 삭제

 삭제 기능의 키는 'x'와 'd'입니다. 먼저 사용이 간편한 'x'키입니다. 'x'키는 커서 위치의 문자를 삭제합니다. 키보드의 del키와 같은  기능을 합니다. 'X'키는 커서 앞의 문자를 삭제합니다. 백스페이스와 동일한 기능을 합니다.

 'd'는 조금 더 복잡합니다. 일단 설명이 간단한 'D'부터... 줄에서 커서 이후의 모든 글자를 삭제합니다. 아래 스냅숏을 예제로 설명하면, 커서의 위치는 16열 a입니다. 이 상태에서 'D' 키를 누르면 보라색 음영 처리된 "arr(n+1, -1);"가 삭제됩니다. 

 이번에는 기능이 다재다능한 'd' 키의 설명입니다. 'd'키는 지정한 혹은 지정하는 영역을 삭제합니다. 지정한 영역은 'v'혹은 'g'를 이용하며, 해당 키에 대한 설명에서 추가하겠습니다. 지정하는 영역은 "d[n]d"혹은 "[n]dd"로 이용됩니다. 여기서 [n]은 숫자입니다. 아래 스냅숏을 참조하여 설명하겠습니다.

 이번엔 커서가 16열의 t에 있습니다. 이 상황에서 "d6d"혹은 "6dd"를 입력하면 노란색 네모로 표현한 영역이 삭제됩니다. "d1d", "1dd" 혹은 "dd"를 입력하는 경우 초록색 네모로 표현한 영역이 삭제 됩니다. 이 사용법은 제가 많이 사용하는 이용법 입니다.  다른 이용법으로는 'd' 입력후 커서를 이동 시키면 커서가 이동한 부분까지 삭제 됩니다. 예를 들어 "dw"을 입력하면 'w'키가 다음 단어(word)의 시작부로 커서를 이동 시키는 키 이니 커서 부터 다음 문자열 까지를 삭제 합니다. 위 예제 에서는 다음 단어로 >가 인식되어 t가 삭제됩니다. 동일한 이유로 "db"를 입력하면 in이 삭제 됩니다.

복사 붙여 넣기

 vi도 기본 기능은 편집기이니 당연히 복사, 붙여 넣기 기능이 필요합니다. 이 기능을 수행하는 게 'y'와 'p' 키입니다. 복사 기능을 수행하는 'y' 키는 삭제를 하는 'd' 키와 같이 이용합니다. "y[n]y"혹은 "[n]yy"를 이용해서 커서가 있는 부분에서부터 [n] 행을 복사하거나, "yy"를 이용해서 한 행을 복사하거나, 'Y'를 이용해서 커서부터 행의 끝까지 복사할 수 있습니다. 당연히 커서 이동 키를 이용한 복사도 가능합니다.

 'p' 키는 'y' 키를 이용해 복사하거나,  'd' 키를 이용해 삭제한 내용을 붙여 넣기 합니다. 'P' 키는 커서 이전에 붙여 넣고, 'p' 키는 커서 이후에 붙여 넣습니다. 만약 복사한 내역을 여러 번 붙여 넣고 싶으면 "[n]p" 혹은 "[n]P" 키를 이용합니다. 이 방식은 'p'혹은 'P'키를 n번 수행한 결과로 수행됩니다.

실행 취소

 'u'와 'U' 키는 실행 취소 키입니다. 정확한 개념을 소개 하면 레지스터에 등록된 작업을 취소(취소가 가능한 경우에만 해당)합니다. 명령 모드에서 삭제 혹은 붙여 넣기 한 내역을 취소하거나, 입력 모드에서 입력한 내역 전체를 삭제하는 등의 기능을 수행 합니다. 경험상 아주 편리하고, 많이 사용하는 키 입니다.  참고로 레지스터에 등록된 사항을 보시려면 ex모드를 이용하시면 됩니다. 명령어는 ":reg"입니다.

 위 실행 취소 키는 유용하지만 실수로 삭제하지 말아야 할 내용을 삭제하는 실수를 범하게 되기도 합니다. 그 경우 "ctrl + r"을 이용해서 실행 복구를 할 수 있습니다.

자동 들여 쓰기

 파일을 작성하다 보면 들여 쓰기를 잘못해서 가독성이 낮아지는 경우가 발생하게 됩니다. 특히 프로그램 언어의 코드는 들여 쓰기의 여부에 따라 가독성이 크게 변화하기 때문에, 들여 쓰기가 중요시됩니다. 따라서 많은 프로그램 언어 에디터는 자동 들여 쓰기를 지원합니다. vi에서는 '='키를 이용해서 들여 쓰기를 할 수 있습니다.

 '='키 또한 'y' 나 'd' 키와 같이 "=[n]=" 나 "==", "=[이동키]"를 이용할 수 있습니다.

특수 이동

 'g'와 'G' 키는 특수한 이동 동작을 합니다. 먼저 'g'키는 "gg"혹은 "gf"로 이용합니다. "gg"는 문서의 처음으로 커서를 이동시킵니다. "gf"는 커서가 있는 위치의 파일을 열어 줍니다. 소프트웨어 엔지니어 라면 "#include"구문의 헤더 파일을 여는 용도와 같이 이용하실 수 있습니다. 평소에 많이 쓰이진 않으나 기억해 두면 가끔 유용합니다.

 'G' 키는 "[n]G" 와 같은 조합으로 이용됩니다. 여기서 [n]은 행의 숫자입니다. "25G"를 입력하면 25번째 줄로 커서가 이동하고, "10G"를 입력하면 10번째 줄로 이동하는 방식입니다. 이 방법은 향후 ex모드를 다루는 글에서도 다룰 테지만 ":[n]"과 같은 형태로도 이용 가능합니다. 다른 방법으로 "[n]" 없이 'G'만 입력하는 방식으로 문서의 끝으로 이동합니다.

'g' 키의 응용

  위 설명과 같이 "gg"는 커서를 문서의 시작 부로 이동시킵니다. 그리고 'G'키는 커서를 문서의 끝으로 이동 시킵니다. 이를 이용하면 다양한 편집이 가능합니다. 예를 들어, "ggyG"는 문서 전체를 복사합니다. 명령 단위로 생각해 보면 "gg"를 이용해 문서의 시작 부로 커서가 이동합니다. 'y'키를 이용해 복사를 수행합니다. 'G'로 문서의 끝으로 커서가 이동합니다. 정리해 보면, 커서가 문서의 시작에 있다가, 복사 명령을 받아서 문서의 끝으로 이동 합니다. 결과적으로 문서 전체가 복사됩니다.

 이러한 기능은 다른 키로도 이용 가능합니다. 'd' 키를 이용하면 문서 전체를 삭제할 수 있습니다. '='를 이용하면 문서 전체의 들여 쓰기를 정리합니다. '>'나 '<' 키에도 활용할 수 있습니다. 개인적으로 "gg=G"는 소프트웨어의 디버그 시 많이 이용하고 있는 기능입니다. 기존 코드를 수정한 경우, 실수로, 괄호의 짝을 맞추지 않은 경우, 해당 명령을 이용하면, 어느 부분에서 실수가 있는지 찾기 쉽습니다.

비주얼

 visual은 특정 영역을 지정하는 상태입니다. 'v'키를 이용하며, 키를 누른 뒤 커서를 이동시키면 'v'를 누른 위치부터 이동한 커서의 위치 까지가 영역으로 지정합니다. 지정한 영역은 음영 처리로 반전되어 쉽게 구분할 수 있습니다. 'V'를 이용하는 경우에는 줄단위로 지정하는 visual line 상태가 됩니다. 상하 이동을 이용해 영역을 변경할 수 있습니다. 마지막 방법으로 "ctrl + v"를 이용하면 visual block 상태가 됩니다.  이 상태에서는 시작 위치와 현재 위치 사이의 직사각형 영역이 지정됩니다. 아래 스냅숏을 참조하시면 쉽게 이해하실 수 있을 것입니다.

 위의 세 가지 상황 모두 영역 지정을 시작한 위치와 끝낸 위치가 동일합니다.  왼쪽의 'v'의 경우 시작 위치부터 끝 위치 까지가 지정되고, 가운데 'V'의 경우 시작과 끝이 포함된 모든 줄이 지정됩니다. 마지막으로 "ctrl+v"의 경우 직사각형 형태로 지정됨을 확인할 수 있습니다.

 비주얼 영역이 지정되면, 다양한 명령을 수행할수 있습니다. 기본 적으로 'd', 'y' 키를 이용해서 삭제 혹은 복사를 수행 할 수 있습니다. 혹은 '<'와 '>' 키를 이용하면, 탭을 추가하거나 제거할 수 있습니다. 유용한 방식 중 하나로 'J'를 이용하면, 지정된 행을 한 행으로 합칠 수 있습니다. 'J' 키는 'd'나 'y'와 같은 방식으로도 활용 가능합니다.

 또 다른 유용한 기능으로 '~', 'u', 'U'가 있습니다. '~'키는 지정된 영역의 소문자는 대문자로 변경하고, 대문자는 소문자로 변경합니다. 'u'키는 지정된 영역의 모든 문자를 소문자로 변경하고, 'U'는 모든 문자를 대문자로 변경합니다. 개인적으로 'U'는 많이 사용하고 있습니다. 굳이 따르지 않아도 되지만, 코딩할 때 상수는 대문자로 표기하는 룰이 있죠. 이 경우 캡스락을 이용해 대문자 입력을 고정하고 입력하게 되죠. 저는 그냥 소문자로 입력한 뒤, visual로 지정해서 'U'키를 누릅니다. 나름 소소한 팁입니다.

 마지막 기능으로 ":"를 이용해서 ex모드의 명령을 수행할 수 있습니다.

 

 이상 명령 모드에 대한 설명을 마치려고 합니다. 다음 글은 ex 모드에 대해 쓰도록 하겠습니다.

 감사합니다.

 

2021.04.19 - [Linux & Mac] - Vi 사용법 2 (ex 모드 : 검색과 치환)

 

Vi 사용법 2 (ex 모드 : 검색과 치환)

먼저 기본 설명과 명령 모드에 대한 설명은 이전 글을 참조해 주시기 바랍니다. 2021.04.13 - [Linux & Mac] - Vi 사용법 1 (명령 모드) Vi 사용법 1 (명령 모드)  Vi의 사용법에 대한 글은 10여 년 전에 이미

sbinroom.tistory.com

 

반응형