1.1. 명령모드 ¶
모든키가 하나하나 명령으로 동작하는 모드이며 이 모드에서는 주로 문서내에서의 이동이나 편집을 담당하게 된다. 키조합을 통해 상당히 많은 명령이 가능하며 이모든 명령을 다 외우는 사람은 없다고 봐도 무방하다. 하지만 주로 쓰는 명령은 극히 제한적이고 논리적으로 정리되어 있는 편이기 때문에 사용하는 데에는 큰 무리가 없다.
1.2. 편집모드 ¶
실제로 문서를 편집하는 모드이며 명령모드에서 i키를 눌러 진입할수 있고 ESC키를 눌러 빠져 나올수 있다. 이 모드는 글자의 입력에만 사용되므로 극히 일부 키만 제외하고는 window의 메모장 처럼 그져 입력만 할수 있다. 상단에 위치한 Function Key[2]들도 그냥 입력이 될뿐 동작하지 않는다.
1.3. ex모드 ¶
명령모드에서는 할수 없는 동작들을 수행한다. 주로 명령에 인자가 필요한 경우가 대부분이며 편집기를 닫거나 새로운 파일을 열거나 할때 사용된다. 명령모드에서 :를 눌러서 ex모드로 들어갈수 있으며 하단에 :과 더불어 명령의 내용을 확인할수 있다.
1.4. 비주얼 모드 ¶
잘라 붙이기나 복사할때의 영역을 지정할수 있는 모드로 명령모드와 유사하나 범위를 지정할수 있는 것이 큰 차이점이다. 주로 문서를 편집하기 위해 명령모드와 같이 많이 사용되며 자신이 선택한 영역이 어디에서부터 어디까지인지 알수 있다. 다만 당연하게도 마우스로 지정할수는 없고[3] 키보드로 지정할수 있다.
1.5. 찾기 모드 ¶
특정한 문구를 찾기 위한 모드이며 별도의 모드로 취급하지 않을때가 많다. ex모드처럼 하단에 명령이 보이나 :으로 시작하지 않고 /로 시작한다. 정규표현식을 사용하여 검색할수 있으며 정규표현식에 익숙하다면 누구보다 빠르게 문서를 검색할수 있다.
2. 단축키 ¶
vim에서는 단축키라기 보다는 실제 명령이라 할수 있다. 왜냐면 해당하는 작업을 하기 위한 방법이 해당 키를 누르는 것 밖에 없기 떄문이다. vim은 console기반이기 떄문에 당연히 마우스는 배제되며 마우스로 할수 있는 일을 쉽게 할수 있는 방법으로써의 key가 아니기 때문에 엄밀히 말하면 단축키는 아니다. 오히려 명령어라는 표현이 많이 사용되지만 GUI 편집기에 익숙한 사람들입장에서는 단축키로 보이므로 단축키라 하겠다.
3. 일러두기 ¶
vim에서는 ctrl + a를 <c-a> 또는 <ctrl-a>로 표기한다. 이런 표기 방식은 vim에서는 흔한것이며 다른 vim 사용자가 쓰는 것이기도 하다.
ctrl + x | <c-x> | <ctrl-x> |
shift + x | <s-x> | <shift-x> |
또한 연속적인 키입력은 그냥 나열하여 표현한다. 예를들어 gt라고 표기 되어 있다면 이는 g키를 누른후 t키를 누르는 것을 의미한다.
4.1. 이동 ¶
이동 명령어들은 아주 중요하다. 과거에 오리지널 vi는 방향키를 인식하지 못하며[4] 따라서 이동키를 이용하는 것이 유일하게 커셔를 옯길수 있는 수단이었다.
앞으로 한칸 이동 | h |
위로 한칸 이동 | j |
아래로 한칸 이동 | k |
뒤으로 한칸 이동 | l |
다음단어의 처음으로 | w |
다음단어의 처음으로 (특수문자 무시) | W |
다음단어의 마지막으로 | e |
다음단어의 마지막으로 (특수문자 무시) | E |
이전단어의 처음으로 | b |
다음단어의 처음으로 (특수문자 무시) | B |
위의 키들은 숫자 키와 더불어 사용될수 있으며 이를 이용해 빠르게 이동이 가능하다.
3j
는 위로 세칸을 이동하는 것이며 40w
는 40단어 뒤의 처음으로 이동하는 것이다. 처음에 J와 K가 많이 헷갈리게 되는데 중간에 슬래쉬를 넣어 HJ/KL로 외우면 좀더 쉽게 외우는 것이 가능하다.줄 끝으로 이동 | $ |
줄 처음으로 이동 | ^ |
일치하는 괄호로 이동 | % |
문장 시작 | ( |
문장 끝 | ) |
화면의 처음 | H |
화면의 마지막 | L |
문서의 처음 | gg |
문서의 마지막 | G |
여기서 문장이란 빈 줄로 구분된것을 말한다. 즉, 문장과 문장 사이에는 빈줄이 존재하고 약간 어렵게 말하면 줄바꿈 문자가 두개 연속된 곳을 문장이 구분된 곳이라고 인식한다.
이동키는 나중에 편집키들과 조합하여 범위를 지정하는데 사용할수 있다.
4.2. 편집 ¶
편집은 크게 자르고 붙이는 것을 말한다.
자르기 | d |
복사 | y |
뒤에 붙이기 | p |
앞에 붙이기 | P |
위의 키들은 기본적인 편집 키들이다. 자르거나 복사할때에는 범위가 필요한데 이때의 범위는 위의 이동키로 지정한다. 예를들어
y3j
는 아래로 3번째줄까지 복사하라는 의미이며 d$
는 현재줄의 마지막까지 잘라내라는 의미가 된다. 이때 주의 할점은 해당하는 커셔의 위치까지 적용이 된다는 것이다. 예를 들어 다음과 같은 텍스트가 있다고 하자var express = require('express') var routes = require('./routes') var http = require('http') var path = require('path');커셔의 위치가 express단어의 처음에 있다고 하면
d3j
명령은 전체 내용을 지우게 된다. 이는 커셔의 위치해 해당하는 범위까지 편집명령이 적용되기 때문인데 비 직관적인것 같다만 고쳐지지 않고 그대로 사용하고 있다. 아무래도 편집명령에서 이동하는 거리와 이동명령에서 이동하는 거리를 동일하게 하는 것인것 같긴 하다. 4.3. 창간이동 ¶
vi는 여러개의 창을 지원한다. 가장 많이 쓰이는 창의 형태는 좌우 분할 창이다. 최근에는 vim에서 탭기능을 추가하였는데 이 탭간의 이동도 일종의 창이동이라고 할수 있다. 창의 분할은 일반적으로 ex모드에서 이루어지기에 이후 ex모드에서 다루도록 하겠다.
<c-w> w[5] | 다음 분할창으로 이동 |
gt | 다음 탭으로 이동 |
gT | 이전 탭으로 이동 |
4.5. 편집 모드 ¶
위에서 편집모드로 가는 키는 i라고 설명해 두었지만 사실 편집 모드로 들어가는 방법에는 여러가지가 있다. 이렇게 다양한 키가 있는 이유는 위에서 말했듯 vi가 방향키가 없던 시절에 개발된 편집기라는 데서 기인한다. 과거에는 편집모드로 들어가면 상하좌우로 커셔를 이동시킬수가 없었으므로 편집을 시작 할곳에 커셔를 놓아두고 i키를 눌러야만 했다. 하지만 프로그램을 짜다보면 늘그렇듯 그 위치에서 편집하기 보다는 아래에 한줄을 덧붙이거나 위에 무언가 추가하거나 하는 일이 많고 켜셔의 위치에 입력하는 일보다는 커셔뒤에 무언가 추가하는 일이 잦다. 그래서 vi에서는 손쉽게 편집위치로 이동하여 편집모드로 들어갈수 있도록 다양한 편집 모드 키를 추가 해 두었다. 이중 자주쓰이는 것은 다음과 같다.
O | 커셔 윗줄에 추가 |
o | 커셔 아랫줄에 추가 |
i | 현재 켜서에 추가 |
a | 현재 커셔 바로 뒤부터 추가 |