This reposity has been abandoned. Please see https://ccss17.github.io/ProgrammerBase/readme/
이 레포지토리는 더 이상 관리되지 않습니다. https://ccss17.github.io/ProgrammerBase/readme/ 에 방문해주세요.
GBC 첫번째 과정 Programmer Base 의 3일차 내용입니다.
텍스트 편집이란 커서 이동과 텍스트 수정입니다.
기존의 일반 텍스트 에디터로는 단순히 ←, →, ↑, ↓ 와 마우스 스크롤로 커서 이동을 했었고, 단순한 텍스트 입력과 Backspace 나 Delete 로 텍스트 수정을 했었습니다. 이 몇 안되는 단축키로써 모든 상황에서의 커서 이동과 텍스트 수정을 할 수 있었지만, 몇 안되는 단축키를 모든 상황에 적용하려다 보니까 조합이 복잡해지고 키보드 입력을 많이 해야만 했습니다.
이 방식의 장점은 외워야 하는 단축키가 ←, →, ↑, ↓, Backspace, Delete 등으로 매우 적다는 것입니다. 하지만 단점은 단축키가 적으니까 다양한 상황에서의 텍스트 편집(커서 이동, 텍스트 수정) 에 적용되는 조합이 매우 복잡해진다는 것입니다.
하지만 vim 은 단축키가 매우 많아서 다양한 상황에 적용되는 단축키의 조합이 단순해집니다.
| 일반 텍스트 에디터 | vim |
|
|---|---|---|
| 단축키 개수 | 적음 | 많음 |
| 입력 회수 | 많음 | 적음 |
그래서 vim 을 사용하면 코딩할 때 키보드를 치는 횟수가 압도적으로 줄어듭니다. 다음 그래프와 같이 단축키 개수가 많으면 익혀야 할 단축키가 많은 대신 입력 회수가 줄어들고, 단축키 개수가 적으면 입력 회수가 많아집니다!
하지만 단축키는 한번 습득이 되기만하면 그 다음부터는 전혀 문제가 안됩니다. 이것은 단조로운 단어를 쓰면 문장의 길이가 길어지고 다양한 단어를 쓰면 문장이 짧아지는 것과 같은 이치입니다.
게다가
vim에 익숙해지면 텍스트 편집을 할 때 마우스를 사용해야 하는 횟수가0에 수렴합니다. 키보드와 마우스의 거리는 생각보다 멀기 때문에 이로써 발생하는 시간절약 효과도 상당합니다.
개인적으로 개발자로 살아간다면
vim텍스트 에디터 사용법을 익혀서 불필요한 타자 횟수를 최대한 절약함으로써 시간낭비를 줄이고, 손목건강도 챙기는 것이 합리적이라고 생각합니다. 불필요한 시간이 절약된다면 남는 시간이 많아집니다.
개인적으로 한동대 학생들 중에서
vim을 사용하는 학생들이 많아지길 바라고 있네요.
참고/출처 : https://github.com/vim/vim/blob/master/runtime/tutor/tutor.ko.utf-8
이제부터 vim 을 사용하면 타수가 얼마나 줄어드는지 보여드림으로써 vim 을 사용하면 좋다는 것을 설득해드리겠습니다. 설득 안되면 어쩔 수 없지만..
보여드리는 방식은 기존 일반 에디터의 적은 단축키가 얼마나 많은 타수를 야기하는지, 그리고 그것이 vim 에서 어떻게 효율적으로 대체될 수 있는지 비교하는 것으로 하겠습니다.
또한 모든 키보드에 Home, End, Insert, PageDown, PageUp 가 있지 않기 때문에 일관성을 위하여 이 키들은 상정하지 않겠습니다.
그리고 문자와 문자 사이의 커서 이동 횟수가 1번 이기 때문에
| 이동 거리 | 퉁 치는 횟수 |
|---|---|
| (문자가 모여있는) 단어를 이동하는 횟수 | n 번 |
| (단어가 모여있는) 문장을 이동하는 횟수 | n2 번 |
| (문장이 모여있는) 전체파일을 이동하는 횟수 | n3 번 |
이라고 하겠습니다.
그러면 먼저 우분투 도커 컨테이너에 접속하고 다음 명령어를 입력하세요.
$ git clone https://github.com/jaseg/lolcat
$ cd lolcat
$ makelolcat 은 cat 명령어의 출력에 무지개 색깔을 입힙니다. 다음 명령어를 실행해보세요.
$ cat /etc/passwd # 텍스트 파일이 밋밋한 색깔로 출력된다.
$ ./lolcat /etc/passwd 실행결과는 다음 그림과 비슷할 겁니다.
이제 lolcat 의 소스코드 lolcat.c 를 vim 으로 열어봅시다.
$ vim lolcat.c그러면 vim 텍스트 에디터로 파일이 열리는데 일단 100gg 를 눌러보세요. 그러면 파일의 100 번째 행으로 이동하게 되고 성공적으로 이동하셨다면
...
int main(int argc, char** argv)
{
char* default_argv[] = { "-" };
int cc = -1, i, l = 0;
wint_t c;
int colors = isatty(STDOUT_FILENO);
int force_locale = 1;
int random = 0;
double freq_h = 0.23, freq_v = 0.1;
struct timeval tv;
gettimeofday(&tv, NULL);
double offx = (tv.tv_sec % 300) / 300.0;
for (i = 1; i < argc; i++) {
...위와 같은 코드가 보일 것입니다. 이제 특별한 언급이 없는 한 이 100 번째 줄에서 실습을 진행하겠습니다. 커서가 100 행에서 이탈되었다면 다시 100gg 를 누르면 100 번째 행으로 이동할 수 있습니다.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 왼쪽 이동 | ← | h |
| 오른쪽 이동 | → | l |
| 위쪽 이동 | ↑ | k |
| 아래쪽 이동 | ↓ | j |
-
실습
위 단축키로 커서를 이동해보세요.
15k를 눌러15줄 위에 있는 행으로 이동하세요.다시
15j를 눌러 되돌아올 수 있습니다.이렇게
<N>k를 누르면<N>번 위로 갑니다. 다른 커서 이동 키도 마찬가지!
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 이전에 실행한 편집 기능 반복하기 | . |
. 를 누르면 이전에 실행한 편집 기능이 반복됩니다.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 입력하기 | i |
|
| 다음 글자에 입력하기 | → | a |
| 다음 행에 입력하기 | → × n2 + Enter | o |
| 이전 행에 입력하기 | ↑ + → × n2 + Enter | O |
| 문장 마지막에 입력하기 | → × n2 | A |
| 문장 처음에 입력하기 | ← × n2 | I |
일반 텍스트 에디터가 입력 모드 만 있는 반면 vim 은 입력 모드 와 명령 모드 가 있습니다. vim 을 처음 켰을 때는 항상 명령 모드 이고 위 표의 입력 단축키 i, a, o, O, A, I 를 입력하면 입력 모드 가 됩니다.
에디터의 하단에
-- INSERT --라는 상태표시가 보이면 지금이 입력 모드 인 것입니다.
입력 모드 에서는 모든 키보드 입력이 단축키가 아닌 입력으로 취급되기 때문에 명령 모드 로 되돌아가려면 Esc 를 누르면 됩니다.
-
실습
i를 눌러서 입력 모드로 들어간 다음int test_int = 200;
이라는 코드를 입력하고 Esc 를 눌러 명령 모드 로 되돌아오세요.
입력모드로 들어갈 수 있는 단축키
i,a,o,O,A,I들을 실행하고 결과가 어떤지 보세요. -
실습
위와 같이
94행으로 이동하고I로 입력모드에 들어간 후 주석처리//를 입력해보세요.그리고 밑으로 이동해서 기능반복키
.를 누르며 입력을 반복해보세요.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 저장 | Ctrl + s | :w |
| 종료 | Alt + F4 | :q |
| 저장 후 종료 | Ctrl + s 🠲 Alt + F4 | :wq 또는 ZZ |
| 강제 종료 | :q! |
|
다른 이름(<NAME>)으로 저장 |
:w <NAME> |
vim 에서 저장과 종료 단축키입니다. 강제 종료는 저장하지 않은 내용을 사라지게 합니다.
-
실습
단축키들을 실행해서 에디터를 종료해보고 다시
vim lolcat.c로 켜서100gg를 눌러100번째 행으로 되돌아오세요.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 지우기 | Backspace 또는 Delete | x |
| 단어 지우기 | Backspace × n | dw |
| 문장 지우기 | Backspace × n2 | dd |
| 커서로부터 문장 끝까지 지우기 | Delete × n2 | D |
-
실습
커서를
102번째 행인struct timeval tv;
로 옮기세요. 이제
x를 눌러서 문자들을 지워보세요.이때
2x와3x를 누르면 각각2글자,3글자가 지워진다는 것을 확인하세요.<N>x를 누르면<N>개의 문자가 한번에 지워집니다. -
실습
단어를 한번에 지우기 위해서
dw를 눌러도 됩니다. 이것도struct나timeval같은 변수 위로 커서를 두고 실행해보세요.4dw를 누르면4개의 단어가3회의 입력만에 한번에 지워집니다.일반 텍스트 에디터에서
4개의 단어를 지우려면3회보다 훨씬 많은 키보드 입력이 필요합니다.4dw를 누르고.을 누르면4개의 단어가 지워지는 기능이 반복됩니다.3회만 누르면 그 다음부터는.만 누르면 되니까1회만 누르면 됩니다. -
실습
dd와D도 실행보세요.5dd를 누르면5개의 문장이3회의 입력만에 한번에 지워집니다.일반 텍스트 에디터에서
5개의 문장을 지우려면3회보다 훨씬 많은 키보드 입력이 필요합니다! -
실습
다음과 같이
10dd누르고.를 누르면10개 문장이 지워지는 기능이 반복됩니다.4회 입력 이후에1회 입력만 하면 되는 것이죠.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 한 글자 지우고 편집하기 | Backspace | r |
| 단어 지우고 편집하기 | Backspace × n | cw |
| 커서로부터 문장 끝까지 지우고 편집하기 | Delete × n2 | C |
문장에서 <OLD> 를 <NEW> 로 치환하기 |
:s/<OLD>/<NEW> |
|
전체 파일에서 <OLD> 를 <NEW> 로 치환하기 |
:s/<OLD>/<NEW>/g |
|
전체 파일에서 하나씩 확인하면서 <OLD> 를 <NEW> 로 치환하기 |
:s/<OLD>/<NEW>/gc |
-
실습
커서를
98번째 행인int force_locale = 1;
의
1로 옮겨서r을 누르고0을 눌러보세요. 그러면1이0으로 바뀝니다. -
실습
커서를 다른 코드로 옮겨서
cw와C를 실행해보세요. 그러면 단어가 지워지고 입력 모드 로 곧장 들어갑니다. 명령 모드 로 되돌아오기 위하여 Esc 를 눌러야 합니다. -
실습
:s/int/long long/g을 실행해보세요. 파일 전체의int가long long으로 바뀝니다.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 원하는 문자로 이동 | → × n2 | f<C> |
| 오른쪽 단어로 이동 | Ctrl + → | e |
| 왼쪽 단어로 이동 | Ctrl + ← | b |
| 문장의 처음으로 이동 | Ctrl + ← × n | 0 |
| 문장의 마지막으로 이동 | Ctrl + → × n | $ |
| 화면의 처음으로 이동 | ↑ × n3 | H |
| 화면의 가운데로 이동 | M |
|
| 화면의 마지막으로 이동 | ↓ × n3 | L |
커서 이동이 h, j, k, l 밖에 없다면 커서를 이동해야 하는 다양한 상황에서 이것들을 똑같이 다양하게 조합해야하기 때문에 일반 텍스트 에디터의 ←, →, ↑, ↓ 를 많이 입력해야 하는 것과 다를 것이 없을 겁니다.
하지만 위 표에서처럼 다양한 커서 이동이 하나의 단축키로 가능합니다.
-
실습
104행으로 이동하면double offx = (tv.tv_sec % 300) / 300.0;
라는 코드가 있는데
300이라는 숫자를 조작하고 싶다면f3를 누르면3이라는 문자로 커서가 바로 이동됩니다.마찬가지로
f%를 누르면%라는 문자로 커서가 바로 이동됩니다. -
실습
다음과 같이 커서 이동 단축키를 눌러보면서 실습해보세요.
일반 방향키를 엄청 많이 눌러야 갈 수 있는 곳을
vim에서는 단축키 하나만 누르면 갈 수 있습니다.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 취소 | Ctrl + z | u |
| 취소한 것을 취소 | Ctrl + R | |
| 문장을 원래대로 복원 | U |
-
실습
50dd를 눌러서 문장50개를4회의 입력만에 삭제해보세요.일반 텍스트 에디어테서 문장
50개를 삭제하기 위해서 얼마나 많은 시간이 걸리는지 상상이 안되네요.그리고
u를 눌러서 삭제했던 것을 복구해보세요.그리고 다시 Ctrl+R 을 눌러서 삭제해보세요.
u와 Ctrl+R 를 번갈아서 계속 눌러보세요.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 드래그 | Shift + → × n | v |
-
실습
gg를 누르면 첫행으로 이동합니다. 바로 밑에 있는3번째 행으로 커서를 이동하면* DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE이라는 라이센스가 보입니다. 이 소스코드를 갖고 하고싶은 게 뭐든간에 다 하라는 의미군요.
e또는b를 몇번 눌러서FUCK의F로 커서를 이동하세요.v를 누르고l을 몇번 누르면FUCK이 드래그됩니다. 잘 드래그 되고 있다면vim의 하단부에-- VISUAL --이라는 상태줄이 뜹니다.그러면
r을 누르고x를 누르세요. 그러면 다음과 같이FUCK이xxxx로 바뀝니다.이렇게 드래그를 잘 활용하면 여러 문자와 문장에 대하여 기능을 한번에 실행할 수 있습니다.
-
실습
다시
FUCK이 있는 곳으로 커서를 옮겨서v를 누르고 이번에는e를 한번만 누르세요. 그러면FUCK이 단지2회의 입력만에 드래그됩니다.v를 누르고e를 계속 누르거나j를 눌러서 밑에 문장까지 드래그하고x를 눌러서 삭제해보세요.드래그를 하기 위해서 일반 텍스트 에디터에서는 Shift + → × n 를 얼마나 많이 눌러야 하는지 모르겠네요.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 단어 복사하기 | Shift + → × n 🠲 Ctrl + c 🠲 Ctrl + v | yw 🠲 p |
| 문장 복사하기 | Shift + → × n2 🠲 Ctrl + c 🠲 Ctrl + v | yy 🠲 p |
| 드래그해서 복사하기 | Shift + → × n2 🠲 Ctrl + c 🠲 Ctrl + v | v 🠲 y 🠲 p |
-
실습
33gg를 눌러서33행으로 가면... static char helpstr[] = "\n" "Usage: lolcat [-h horizontal_speed] [-v vertical_speed] [--] [FILES...]\n" "\n" ...
가 보이는데
yy를 누르고5p를 누르세요. 그러면 복사된 문장이5번 붙혀넣어집니다. -
실습
55번째 행으로 이동하고 맨 마지막 ", 33" 을v로 드래그하고y를 눌러보세요. 그 다음33오른쪽으로 커서를 옮겨서p를 몇번 눌러보고10p를 누르세요.그러면 다음과 같이 복사된 것이 단번에
10번 붙혀넣어집니다.이 일을 일반 텍스트 에디터로 하려면
vim보다 훨씬 많은 키보드 입력을 해야 합니다.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 한 글자 잘라내기 | Shift + → 🠲 Ctrl + x 🠲 Ctrl + v | x 🠲 p |
| 단어 잘라내기 | Shift + → × n 🠲 Ctrl + x 🠲 Ctrl + v | dw 🠲 p |
| 문장 잘라내기 | Shift + → × n2 🠲 Ctrl + x 🠲 Ctrl + v | dd 🠲 p |
| 특정 영역 잘라내기 | Shift + → × n2 🠲 Ctrl + x 🠲 Ctrl + v | v 🠲 x 🠲 p |
-
실습
다음과 같이
75행으로 이동하고zt로 화면을 올리고나서6dd를 로 함수 코드 전체를 잘라내고10j로 커서 이동을 한 후p를 눌러 붙혀넣으세요.zt가 뭔지는 계속되는 내용에서 알아봅니다.이 작업을 키보드 입력
10번으로 끝냈습니다.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 파일의 맨 마지막으로 이동 | ↓ × n3 | G |
| 파일의 맨 처음으로 이동 | ↑ × n3 | gg |
<N> 번째 행으로 이동 |
↑ × n3 또는 ↓ × n3 | <N>gg |
-
실습
G와gg로 커서를 이동해보세요. 그리고100gg로100번째 행으로 이동해보세요.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 아랫방향으로 찾기 | Ctrl + f | / |
| 윗방향으로 찾기 | ? |
|
| 커서가 위치한 단어 아랫방향으로 찾기 | * |
|
| 커서가 위치한 단어 윗방향으로 찾기 | # |
|
| 찾고나서 같은방향으로 단어 찾기 | Enter | N |
| 찾고나서 반대방향으로 단어 찾기 | Shift + Enter | n |
| 괄호의 짝 찾기 | % |
-
실습
다음과 같이
/static으로static키워드를 찾고n을 누르며 다음 것을 찾아보세요. -
실습
매우 긴 문장에서
f로 원하는 문자 커서로 이동하기.(GIF)
그리고 이것은 보통의 코드에서도 매우 자주 유용하게 사용될 수 있음.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 화면을 한 행만큼 아래로 이동 | ↓ × n2 | Ctrl + e |
| 화면을 한 행만큼 위로 이동 | ↑ × n2 | Ctrl + y |
| 화면을 반 페이지만큼 아래로 이동 | ↓ × n2 | Ctrl + d |
| 화면을 반 페이지만큼 위로 이동 | ↑ × n2 | Ctrl + u |
| 화면을 한 페이지만큼 아래로 이동 | ↓ × n2 | Ctrl + f |
| 화면을 한 페이지만큼 위로 이동 | ↑ × n2 | Ctrl + b |
-
실습
위 단축키로 화면을 편하게 이동해보세요.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 커서를 기준으로 화면을 최대한 아래로 이동 | zt |
|
| 커서를 기준으로 화면을 최대한 위로 이동 | zb |
|
| 커서를 기준으로 화면을 정중앙으로 이동 | zz |
-
실습
다음과 같이
zt와L을 반복해서 눌러서 커서를 아래로 이동하다가 원하는 코드를 찾으면zz로 화면을 포커싱 해보세요. -
실습
반대로
zb와H을 반복해서 눌러서 커서를 위로 이동하다가 원하는 코드를 찾으면zz로 화면을 포커싱 해보세요.물론 화면을 위 아래로 이동하기 위하여 Ctrl+d 또는 Ctrl+u 가 더 편할 수도 있습니다.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
파일 위치에서 <CMD> 명령 실행 |
:! + <CMD> |
|
| 파일 위치에서 쉘 실행 | :shell |
-
실습
vim에디터에서:!pwd를 입력해보세요. -
실습
:shell을 입력해서vim의 서브 프로세스로써 쉘을 실행시켜보세요.vim으로 되돌아오기 위해exit명령어로 쉘을 종료하면 됩니다.vim밑에서 쉘을 실행했다는 것을 잊어버리고 그 쉘에서 계속 작업을 하면 안되요! 현재 쉘이vim의 서브 프로세스인지 확인하는 방법은ps명령어를 입력하는 것입니다.현재 쉘이
vim의 서브 프로세스도 아니라면ps명령 결과는 다음과 같습니다.$ ps PID TTY TIME CMD 1 pts/0 00:00:00 bash 960 pts/0 00:00:00 ps먄약 현재 쉘이
vim의 서브 프로세스라면ps명령어 결과가 다음과 같이 출력됩니다.$ ps PID TTY TIME CMD 1 pts/0 00:00:00 bash 961 pts/0 00:00:00 vim 962 pts/0 00:00:00 sh 963 pts/0 00:00:00 ps
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 대문자로 변경 | v 🠲 U |
|
| 소문자로 변경 | v 🠲 u |
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 블록 드래그 | Shift + v |
|
| 드래그 상태에서 다중 입력 | Shift + i |
블록 드래그는 드래그와 달리 네모 모양으로 드래그를 할 수 있습니다. 이때 다중입력도 가능합니다.
-
실습
코딩을 하다보니
#define문을 여러번 사용했는데 실수로#을 붙히는 걸 까먹었네요. 하지만 괜찮습니다.다음과 같이
0으로 문장 앞으로 이동하고 블록 드래그 Shfit+v를 한 다음10j로 커서를 내립니다. 그리고 Shfit+i로 다중입력을 하고#을 입력한 후 Esc 를 눌러보세요.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 문장 붙히기 | → × n2 + Delete | J |
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 수평으로 화면분할 | :sp <FILE> |
|
| 수직으로 화면분할 | :vsp <FILE> |
|
| 다음 화면으로 이동 | Ctrl+ w + w | |
| 왼쪽 화면으로 이동 | Ctrl+ w + h | |
| 오른쪽 화면으로 이동 | Ctrl+ w + l | |
| 아래쪽 화면으로 이동 | Ctrl+ w + j | |
| 위쪽 화면으로 이동 | Ctrl+ w + k |
코딩을 하다보면 다른 파일을 봐야할 때도 있습니다. 그럴 때 이 화면 분할 기능을 이용할 수 있습니다.
-
vim으로lolcat.c를 연상태에서:vsp README.md로 파일을 열어보세요. 그리고:sp censor.c로 또 파일을 열어보세요.그리고 다음과 같이 화면을 이리저리 이동해보세요. 화면을 끄려면
:q를 입력하면 되고 모든 화면을 종료하려면:qa를 입력하면 됩니다.
| 기능 | 일반 텍스트 에디터 | vim |
|---|---|---|
| 코드 포맷팅 | =G |
vim 은 수많은 명령어를 제공하고 그 명령어로 사용자가 함수도 제작할 수 있기 때문에 vim 에는 사용자들이 만든 수많은 플러그인들이 존재합니다. 다음의 링크에서 가장 인기있는 커스터마이징 vim 을 찾아볼 수 있습니다.
여기에서는 간단하게 제가 vim 을 커스터마이징 한 내용을 살펴보겠습니다. 물론 여러분도 여러분에게 더 편한 커스텀 vim 을 만들 수 있습니다.
먼저 vim 명령어를 매번 치는 것은 너무 비효율적입니다. 무려 3 번이나 키보드를 쳐야하기 때문이죠. 그래서 ~/.zsh_aliases 에
alias v=vim를 추가하여 v 만 눌러도 vim 가 켜지도록 합니다.
-
실습
다음과 같이 도커 컨테이너에서
vim를 켜보세요.$ v
vim-plug 는 카카오에서 개발하시는 junegunn 님께서 만드신 vim 플러그인을 관리할 수 있는 플러그인입니다. 여러 좋은 기능이 있지만 제가 가장 좋아하는 기능은 플러그인들을 설치할 때 병렬로 설치한다는 것입니다. 이로써 플러그인 설치 시간이 매우 짧아집니다. 다른 플러그인 관리 플러그인들은 플러그인을 설치할 때 직렬로 설치해서 설치 시간이 약간 오래걸립니다.
저의 dotfiles 를 설치할 때 다음과 같은 화면을 보셨을텐데요.
마지막 부분에서 나타나는 vim 화면이 vim 의 플러그인들을 vim-plug 가 병렬로 매우 빠르게 설치하는 장면입니다. 너무 빠르죠?
12개의 플러그인을 설치했는데 다른 "플러그인 관리" 플러그인으로12개를 설치하면 인터넷이 안좋은 곳에서는 2분에서 3분까지 걸렸던 걸로 기억합니다.
여기에서는 이렇게 설치된 플러그인들 중에서 핵심적인 플러그인들을 살펴보겠습니다.
하지만 그전에 vim 을 훨씬 더 빠르고 편하게 사용할 수 있도록 제가 개인적으로 설정한 단축키들을 알아보겠습니다. 나중에 여러분이 개인적으로 더 편한 단축키가 있다면 그것으로 바꿀 수 있습니다.
vim 은 에디터를 시작하기 전에 반드시 ~/.vimrc 파일을 읽고 그곳에 정의된 설정들을 적용하고나서 시작됩니다. 그래서 개인 설정을 하고 싶을 때 이곳에 vim 의 설정 방법을 Google 에 검색하여 알아본 후 설정을 하면 됩니다.
현재 도커 컨테이너에 설치된 저의 ~/.vimrc 의 주요 설정을 추려보면 다음과 같습니다.
colors onedark
map <silent> <C-s> :w<CR>
map <silent> <C-q> :q<CR>
nmap <silent> <C-p> :NERDTreeToggle<CR>
nmap <silent> <Up> :resize -5<CR>
nmap <silent> <Down> :resize +5<CR>
nmap <silent> <Left> :vertical resize -5<CR>
nmap <silent> <Right> :vertical resize +5<CR>
nmap <silent> <C-k> :wincmd k<CR>
nmap <silent> <C-j> :wincmd j<CR>
nmap <silent> <C-h> :wincmd h<CR>
nmap <silent> <C-l> :wincmd l<CR>
nmap <silent> <Space> :nohlsearch<Bar>:echo<CR>몇 가지 vim 을 매우 빠르고 편하게 사용할 수 있도록 단축키를 설정했습니다. 위에서 볼 수 있듯 map 과 nmap 이 단축키를 설정하는 vim 의 명령어인데 <silent> 는 명령 실행을 상태바에 출력하지 말라는 뜻이니 신경쓸 것 없습니다. 실질적으로 단축키가 설정된 중요한 부분은 <silent> 오른쪽 부분입니다.
직관적으로 알 수 있듯이
<C-s>는 Ctrl+s 를 뜻하고<Up>은 ↑ 를 뜻합니다.
현재 설정된 vim 의 컬러테마는 다음과 같은 onedark 입니다.
하지만 이곳에서
vim의 여러가지 테마를 살펴볼 수 있고 Google 에 검색해서 더 많은vim테마도 찾을 수 있습니다. 그리고 여러분이 가장 마음이 드는 테마를 설치할 수도 있습니다.
| 기능 | 기존 단축키 | 새로운 단축키 |
|---|---|---|
| 저장 | :w |
Ctrl+s |
| 종료 | :q |
Ctrl+q |
가장 먼저 더 빨라진 명령어는 저장과 종료 명령인 :w 와 :q 입니다. 이것은 약간 치기 어렵고 윈도우의 저장 명령어 Ctrl+s 를 그대로 사용하고 싶기도 합니다.
-
실습
다음과 같이
v test.txt로 텍스트 파일을 열고 아무 문장이나 쓴 다음에 Ctrl+s 로 저장하고 Ctrl+q 로 종료해보세요.너무 빠르고 편하게 저장되고 종료됩니다.
리눅스 터미널에서 Ctrl+s 와 Ctrl+q 를 사용하기 위해서는 반드시
stty -ixon명령어를 실행해두어야 합니다. 하지만~/.zshrc파일에서 이미 자동으로 실행되고 있으니 걱정하지 마세요. 왜stty -ixon을 실행해야만 Ctrl+s 와 Ctrl+q 를 사용할 수 있는지는 상세히 설명하지 않겠습니다. 궁금하신 분들은 Google 에 검색해보세요.
NERDTree 는 vim 에서 디렉토리와 파일을 너무나도 편하게 다룰 수 있게 해주는 플러그인입니다. NERDTree 는 수많은 좋은 기능들을 갖고 있지만 핵심적인 기능과 단축키는 다음과 같습니다.
| 기능 | 단축키 |
|---|---|
| NERDTree 실행 | :NERDTreeToggle |
| 파일 열기 | Enter |
| 파일을 수직으로 분할하여 열기 | s |
| 파일을 수평으로 분할하여 열기 | i |
여기에서는 이 플러그인과 화면 이동을 더 빠르게 할 수 있는 단축키를 함께 알아보겠습니다.
| 기능 | 기존 단축키 | 새로운 단축키 |
|---|---|---|
| NERDTree 실행 | :NERDTreeToggle |
Ctrl+p |
| 위쪽 화면으로 이동 | Ctrl+w+k | Ctrl+k |
| 아래쪽 화면으로 이동 | Ctrl+w+j | Ctrl+j |
| 왼쪽 화면으로 이동 | Ctrl+w+h | Ctrl+h |
| 오른쪽 화면으로 이동 | Ctrl+w+l | Ctrl+l |
말로 설명하는 것보다 눈으로 보고 직접 실습하면서 익혀보도록 하겠습니다.
-
실습
먼저 다음 명령어를 통해 어떤
python프로젝트를 클론하고vim으로 열어봅시다.$ g cl https://github.com/ccss17/nonogram $ cd nonogram $ v그리고 다음과 같이 Ctrl+p 로 NERDTree 를 열어서
j로 커서를 내려서nonogram.py에 커서를 두고 Enter 를 칩니다.그리고 다시 Ctrl+h 로 NERDTree 로 이동하여
patterns.py에 커서를 두고s를 눌러 에디터를 수직으로 분할하여 엽니다. 이제 Ctrl+p 로 NERDTree 를 닫습니다.그리고 Ctrl 를 누른채 h 와 l 를 눌러서 왼쪽/오른쪽 에디터로 편하게 이동해보세요. 그리고 Ctrl 을 누를 채로 q 를
2번 눌러서vim을 종료하세요.
| 기능 | 기존 단축키 | 새로운 단축키 |
|---|---|---|
| 위쪽으로 화면 조절 | :resize -5 |
↑ |
| 아래쪽으로 화면 조절 | :resize +5 |
↓ |
| 오른쪽으로 화면 조절 | :vertical resize -5 |
→ |
| 왼쪽으로 화면 조절 | :vertical resize +5 |
← |
vim 에서 여러 에디터를 열어두었을 때 크기조정을 할 수 있었습니다. 하지만 그 명령어가 너무 복잡하고 외우기 힘들기 때문에 제가 소개해드리지 않았습니다. 하지만 화면크기조정을 매우 직관적으로 할 수 있도록 위와 같이 단축키를 설정해놓았습니다.
-
실습
다음과 같이
nonogram레포지토리에서vim을 켜고 NERDTree 로 파일 하나를 열고 또 하나의 파일을 수직으로 열고 또 하나의 파일을 수평으로 엽니다.그리고 방향키 ←, →, ↑, ↓ 를 눌러서 에디터의 사이즈를 조절해보세요. 그리고 Ctrl+h, Ctrl+j, Ctrl+k, Ctrl+l 로 화면을 이동해서 그곳에서도 화면 크기를 조절해보세요.
그리고 마지막으로 Ctrl 를 누른채로 q 를
3번 눌러서vim을 종료해보세요.
| 기능 | 기존 단축키 | 새로운 단축키 |
|---|---|---|
| 주석 | \cc |
|
| 주석 해체 | \cu |
NERDCommentor 는 주석을 쉽게 할 수 있도록 도와주는 플러그인입니다. 이 플러그인을 사용하고 나면 수작업으로 주석을 입력하고 있는 사람들에게 이 플러그인을 알려주고 싶을 마음이 들 정도로 편리함을 느낄 수 있습니다.
-
실습
다음과 같이
main.py을vim으로 열고/def test(로test함수를 찾으세요. 그런 다음zt를 눌러test함수 코드가 한 눈에 들어올 수 있도록 화면을 올리고,9\cc를 눌러 코드9줄을 한번에 주석처리하고 Ctrl+s 를 눌러 저장하세요.그러고 나서
9\cu를 눌러서 다시 주석을 해제하고 Ctrl+s 를 눌러 저장한 다음 Ctrl+q 로 에디터를 종료하세요.
vim-multiple-cursors 는 vim 에서 커서를 여러개로 늘려서 똑같은 문자들을 한번에 편집할 수 있게 해주는 플러그인입니다.
| 기능 | 기존 단축키 | 새로운 단축키 |
|---|---|---|
| 멀티 커서 늘리기 | Ctrl+n |
말로 설명하는 것보다 직접 보고 따라하면서 배워보겠습니다.
-
실습
이번에는
lolcat레포지토리로 이동하여vim으로lolcat.c를 여세요.$ z lol $ v lolcat.c
그리고 다음과 같이
/main(으로 메인함수로 이동하고zt를 눌러 화면을 올리고95행의cc라는 변수가 정의되어 있는 곳에 커서를 둡니다.개발을 하다 보니
cc라는 변수 이름이 마음에 들지 않아서 바꾸고 싶습니다. 하지만 이 변수가main함수에서 몇번이나 반복되었는지 알 수 없습니다.그래서
cc변수 위에 커서를 두고 Ctrl 을 누른채로 n 을 연타하여 상태표시줄에 No more matches 라고 뜰 때까지 혹은 더 단순하게 다음 단어로 커서가 이동되지 않을 때까지 변수cc들을 포커싱합니다.그러고 나서 지우고 편집하기 기능인
c를 눌러서my_var를 입력하고 Esc 를 연타하여 눌러 입력 모드를 빠져나옵니다. 여러개의 커서들이 다시 없어져야 하기 때문에 Esc 를 연타해야 합니다.그리고 Ctrl+s 를 눌러서 저장하고 Ctrl+q 를 눌러서 에디터를 종료하세요.
-
실습
다음과 같이
include에 커서를 두고 Ctrl 를 누른채n을 연타하여 모든include를 포커싱한 다음 삭제하기 기능인x를 누르면 모두 다 삭제됩니다.그러고나서 Esc 를 연타하여 멀티 커서를 다 없애고 Ctrl+s, Ctrl+q 로 저장 후 종료합니다.





















