어떤사람들은 편하다는데 이게 왜 편해?
마우스도 안되는 편집기가 왜 편해?
Vim은 마우스 기능을 기본적으로 지원하지 않지만 몇가지 명렁어를 사용함으로서 이를 대체하거나 더 나은 기능을 사용할 수 있습니다. 오히려 마우스를 사용하지 않기 때문에 손이 키보드 위에서 벗어나지 않아 적응할수록 더 편리해집니다!
명령어가 너무 많아요!
Vim의 명령어에는 특정 규칙이 있고 이를 조합해서 사용합니다!
너무 많은 명령어를 일일히 다 외울 필요는 없습니다. 여기에서 자신이 필요한 기능만 조금씩 익혀봅시다!
IDE보다 기능도 없고 불편해요!
Vim은 에디터 프로그램이기 때문에 IDE에 비해 상대적으로 많은 기능들이 부족합니다.
하지만 터미널 환경에서 사용할 수 있고, 직관적이고 규칙있는 명령어체계, 강력한 반복작업, 다양한 플러그인이 이를 보충해줍니다. 속는 셈 치고 한번 사용해보세요!
이번 글에서는...
1.
편집모드와 명령모드란?
2.
기본적인 이동키
3.
명령어의 조합 체계와 사용법
4.
기타 유용한 명령어들
해당글에서는 Vim의 모든 기능을 소개하는 것이 아닌, 기본적으로 많이 사용되는 방식과 더불어 Vim의 간단한 명령어 체계만 설명드릴 예정입니다.
1. 편집모드 & 명령모드
"에디터 프로그램을 키고 사용을 하려는데 어느순간부터 입력이 되다가 이제는 아무 키도 안먹힌다. 뭐 이런 프로그램이 다 있지? "
Vim에는 편집모드, 명령모드 2가지 상태가 존재한다.
Vim은 일반적인 에디터 프로그램과는 조금 다릅니다.
우리가 알고있는 기본적인 에디터는 바로 편집을 할 수 있고 입력모드 상태에서 ctrl + XX 같은 키의 조합을 통해서 글 복사, 삭제, 붙여넣기, 자르기, 저장 등의 특수 기능들을 수행합니다.
하지만 Vim은 글을 타이핑 할 수 있는 편집모드와 특수 기능을 사용할 수 있는 명렁모드가 따로 존재합니다. 이렇기 때문에 키의 조합으로 특수 기능을 하는 것이 아닌, 모드를 전환하여 명령어를 입력함으로서 복사, 붙여넣기 등의 특수기능들을 사용하게 됩니다. 이렇게 기능이 나누어져 있기 때문에 Vim은 편집모드와 명령모드로 반복적으로 전환하는 형태로 작업이 이루어지며 이것에 익숙해져야 합니다.
편집모드
말 그대로 파일을 편집할 수 있는 모드입니다.
일반적으로 우리가 글을 쓰거나 지울 수 있는 상태가 됩니다.
단순히 삽입(INS) 뿐만 아니라 수정(OVR)모드로 전환할 수도 있으며 다른 추가 기능도 존재합니다.
•
삽입모드
◦
i
현재 커서 위치에서 "삽입" 편집모드로 진입합니다.
•
a
현재 커서 위치 다음 칸에 "삽입"편집모드로 진입합니다.
•
o
현재 커서 위치의 행의 바로 아래에 새로운 행을 만들고, 커서를 새로운 행에 이동한 후 "삽입"편집모드로 진입합니다.
•
O
현재 커서 위치의 행의 바로 위에 새로운 행을 만들고, 커서를 새로운 행에 이동한 후 "삽입"편집모드로 진입합니다.
•
수정모드
◦
R
현재 커서 위치에서 "수정"편집모드로 진입합니다.
명령모드
Vim은 기본적으로 실행 시 명령모드로 진입하게 됩니다.
만약 편집모드에서 명령모드로 전환하려면 ESC를 누르면 됩니다.
다른 모드가 더 있긴 해요
Vim에서는 위의 2개의 모드 외에 비주얼모드, 명령라인모드 라는 2개의 추가 모드가 존재합니다.
하지만 해당 내용까지 다루기에는 너무 많기 때문에 위의 2가지 모드만 살펴봅시다.
기존 gui에서 사용했던 ctrl 조합 단축키는 다른 명령으로 사용됩니다.
대표적인 문제로 일반적으로 저장 단축키인 ctrl + s 는 vim에서는 freezing 현상을 유발하는데 이는 해당 단축키가 Bash에서 스크롤 락으로 동작하기 때문입니다. 이는 ctrl + q를 눌러서 해제할 수 있습니다.
저장 및 종료하기
우리는 일반적으로 ctrl + s 를 활용하여 저장을 합니다
하지만 Vim에서는 아래와 같은 방식으로 저장 및 종료를 제공합니다.
•
:w - 저장
•
:q - 종료
우리가 일반적으로 학원이나 대학에서 처음 Vim을 배운다면 :wq! 명령어를 통해서 저장합니다. 사실 여기서 :w :q 는 각각 독립되어 있는 명령어입니다. 대신 저렇게 여러번 번거롭게 두번 쓰는 대신 한번에 :wq 를 입력하여 저장 종료를 한번에 하는 것 입니다.
그렇다면 ! 는 무엇 일까요?
! 는 :w 나 :q 다음에 오면 이를 강제한다는 의미를 가집니다.
여러 상황이 있을 수 있으나 몇가지 예로 들자면
1.
저장하지 않고 :q 를 쓰는 경우
Vim은 상당히 똑똑합니다.
만약 여러분들이 파일을 수정하고 저장하지 않은 상태에서 종료하려고 한다면 Vim은 경고문과 함께 종료되지 않습니다.
이때 :q!를 활용하여 강제 종료할 수 있습니다.
2.
파일을 readonly 로 열은 상태에서 :w 하려는 경우
Vim 실행 시 -R 옵션을 통해 readonly 로 파일을 열 수 있습니다. 이 경우에도 수정이 가능하나 저장은 불가능합니다. 이 때 :w!명령어로 이를 해결 할 수 있습니다.
단 최대한 ! 사용은 권장하지 않습니다.
상황을 보면 대부분 Vim이 휴먼에러를 잡아주는 기능을 무시하는 것이기 때문입니다.
저 같은 경우는 이를 무시했다가 2시간 작업 했던 내용이 날라가는 대참사를 경험해보았습니다.
저장과 확인을... 생활화 합시다......
2. 기본적인 이동키
해피해킹의 가장 큰 특징은 독특한 배열이다. 애플의 M0110에서 시작된 이 배열은 방향키가 없고 ... - 나무위키 "해피 해킹 키보드" 문서 -
방향키를 대체하는 키
많은 사람들이 Vim에서 커서를 이동 할 때 방향키를 사용합니다.
실제로도 간단한 편집 시에는 방향키를 사용하는 것이 편합니다. 하지만 방향키를 사용하려면 오른손을 움직여 방향키를 조작해야 합니다.
Vim에서는 방향키 외에 다른 방식을 지원하고 있습니다!
Vim의 기반이 되는 Vi가 개발될 때 당시 키보드에는 방향키가 존재하지 않았습니다.
이러한 이유로 커서를 이동시킬 때 H J K L 이렇게 4개의 키로 선정하여 사용하였으며 Vim에서도 이것이 그대로 적용되어있습니다. 단 방향키와는 다르게 오직 명령모드에서만 사용이 가능합니다.
스 - 마트한 이동키
여러분은 특정 줄이나 문장에 이동할 때 어떤 방식을 사용하시나요?
마우스를 사용하시는 분들도 계실 것이고 적당히 방향키와 특수키를 섞어서 이동하시는 분들도 계실겁니다. 하지만 Vim에서는 추가 설정을 하지 않는 이상 마우스로 커서를 이동시킬 수 없고, 이러한 방법은 Vim의 기능을 활용하는 것도 아닙니다.
Vim에서는 이러한 이동에 관련하여 몇가지 강력한 명령어가 존재합니다! 상당히 많은 명령어만 있지만 아래의 몇개만 소개합니다.
단어별 이동의 경우 아래의 방식을 사용합니다.
단어의 구분은 '_' 외의 특수문자, white_space 로 구분합니다.
•
w - 단어 첫글자 이동
•
b - 거꾸로 단어의 첫글자 이동
•
e - 단어의 마지막 글자로 이동
위의 3개의 단어를 대문자로 입력하면 white_space 단위로 단어를 찾아 이동합니다.
•
W
•
B
•
E
커서가 위치하는 줄의 처음이나 끝으로도 이동할 수 있습니다.
•
$ - 라인 끝으로 이동
•
^ - 라인 시작으로 이동
여러줄을 이동하거나 살펴보고 싶은 경우가 있습니다. Vim 아래의 기능을 제공하고 있습니다.
•
:(num) - num번째 라인으로 이동
•
{ - 이전 단락으로 이동함 (이전 비어있는 줄로 이동)
•
} - 다음 단락으로 이동함 (다음 비어있는 줄로 이동)
이 외에도 여러 키가 존재하지만 이 정도만 사용해도 왠만하면 크게 문제되지 않습니다. 이 후 어느정도 익숙해지면 조금씩 찾아보면서 사용하는 것을 추천합니다.
3. 명령어의 조합 체계와 사용법
여러분이_Vim을_싫어하는_이유.jpg
대부분의 사람들이 Vim에 처음 입문하면서 가장 어렵게 생각하는 것을 뽑는다면 너무 많은 명령어라고 할 것입니다. 실제로 여러 블로그에 소개된 글만 봐도 상당히 많은 명령어들이 나열되어 있습니다.
사실 그러나 실제로 Vim에서 제공하는 명령어는 다른 편집기들에 비해 그렇게 많은 편은 아닙니다. 이 것이 많아 보이는 이유는 Vim에서는 명령어를 조합해서 사용하기 때문입니다.
그렇다고 이 명령어 조합이 마구잡이로 되어 있는 것은 아닙니다. 명확한 문법이 존재하며, 그 문법이 어려운 것도 아닙니다! 지금부터 그 문법이 어떻게 되어있는지, 어떻게 사용되는지 소개해 드리겠습니다.
명령어의 조합은 동사 + 명사
명령어는 기본적으로 우리가 쓰는 자연어와 비슷하게 동사 + 명사 로 동작합니다. 대신 풀네임을 쓰지 않고 이를 약자로 사용하여 조합하게 됩니다.
예로 들어봅시다.
dw 명령어는 해당 커서에 위치하고 있는 단어를 삭제하는 동작을 합니다. 여기서 d 는 delete 를 의미하는 동사 이며, w 는 단어를 의미합니다. 즉 dw 는 "delete word" (단어 삭제)라는 뜻이 되며 실제로 그렇게 동작합니다. 이렇게 vim 명령어는 의미와 규칙이 있으며, 이를 이해하면 다른 명령어 또한 자연스럽게 익히거나 유추할 수 있습니다.
아래에는 자주 쓰이는 동사와 명사, 그리고 자주 쓰는 조합의 동작 방식을 보여 드릴 것입니다.
동사
•
d - delete
•
c - change
•
y - yark(copy)
•
< > - indent
동사는 몇가지 되지 않습니다.
c(change)는 다른 동사와 다른 작업을 추가로 하는데, change 말 그대로 교체하는 동작을 하기 때문에 명사를 삭제 후 입력 모드로 진입합니다.
< > 는 인덴트로 들여쓰기를 하거나 이를 지워줍니다.
명사
•
w- word
•
(num)j - down (num) lines
•
$ - end line
•
i(target) - inner target
◦
iw - inner word
◦
it - inner tag
◦
i" - inner quotes
◦
as - a sentence
명사도 그렇게 많지 않습니다. w 는 단어를 의미합니다. 여기서 단어란 white_space 또는 _를 제외한 특수문자로 나누어진 문장을 의미합니다. j 는 아래로 (num)줄 만큼을 지칭하며, i 는 (target) 으로 둘려쌓여 있는 부분을 이야기합니다. 해당 부분은 바로 아래에서 조합을 통해 자세히 설명 드리겠습니다.
조합해보자!
1.
c + <norm>
c 는 앞서 말씀드렸듯이 change 명령을 수행하는 동사로, 해당 조합은 현재 커서가 있는 위치에 해당되는 명사를 변경한다는 명령어 조합이 됩니다.
예시로 저는 특정 함수의 명칭을 변경한다고 가정합시다. 함수명은 끝이 '(' 이나 space 로 띄어져 있을 것 입니다. 즉 함수명은 word로 선택할 수 있을 것입니다. 커서의 위치를 변경 하려는 함수명 앞에 이동시키고 cw라는 명령어를 입력해보겠습니다.
•
cw
위와 같이 w 의 target이 되는 함수명이 삭제 되고 입력모드로 전환하는 것을 볼 수 있습니다. w 대신 $를 넣게 되면 현재 커서 위치부터 현재 라인 끝까지 삭제하는 것을 볼 수 있습니다. 또한 b 는 뒤의 단어로 이동한다는 특징이 있는데 b 를 명사로 넣게 되면 현재 커서 위치에서 뒤의 단어를 삭제하고 입력모드로 전환됩니다.
•
c$
•
cb
그렇다면 줄을 의미하는 j 는 어떨까요?
j 명사는 앞에 숫자가 붙게 되는데 이는 아래로 몇줄을 선택할 것인지를 의미합니다. 대신 주의할 점은 선택되는 줄의 계산이 현재 커서 위치 + (num)개 로 계산이 된다는 것이다. 만약 2j 의 경우 현재 커서 위치의 줄을 포함해 아래 2줄, 총 3줄을 선택한다는 것을 의미합니다.
•
c2j
여기서 눈치가 좋으신 분이라면 j 가 앞서 말한 방향키의 하단을 맵핑한다는 것을 알고 계실 겁니다. 그렇습니다. 즉 (num)+ hjkl를 사용 할 수 있다는 뜻이며 이는 j k 는 하단, 상단줄 선택, h l 은 좌우 선택 임을 알 수 있습니다.
•
c2k
•
c3h
•
c3l
이제 마지막으로 i 를 봅시다.
i 의 경우 inner 명사의 약자로서 뒤에 주어지는 값으로 둘러 쌓인 것을 가리키게 됩니다. 예로 i" 의 경우 "로 둘러 쌓인 값을 가리키며 ci"는 현재 커서 위치에서 " 로 둘러 쌓인 값을 삭제후 편집모드로 들어갑니다.
•
ci"
i 다음에 값으로 t 를 주게 됩니다 tag 내부의 값( ex: <t>...</t>)을 변경하며, s는 문장 전체를, w를 주면 커서 위치의 단어를 변경합니다.
•
cit
•
cis
•
ciw
여기서 ciw는 cw 와 차이가 없지 않느냐? 라고 물어보실 수 도 있습니다. 이 기능은 한가지 큰 차이점을 보이는데, 바로 커서의 위치가 단어의 시작 위치가 아닌 중간 위치에 있을 경우입니다.
•
cw
•
ciw
보이는 것처럼 cw는 커서 위치부터 단어의 끝까지 즉, 단어의 일부만을 교체하는 것을 볼 수 있으나 ciw는 커서에 위치에 상관없이 단어 전체를 교체하는 것을 볼 수 있습니다. ciw를 해석하면 change inner word 로 즉 단어 사이에 있는 문장을 교체 하라는 의미가 되므로 cw 와는 다른 방식으로 작동하게 됩니다.
동사값을 연속으로 줄 수도 있다!
동사 + 명사 대신 동일 동사 두번을 연속으로 줄 수도 있다.
이 경우 동사를 적용할 타겟이 없는데 이 경우 타겟은 현재 커서 위치의 줄 전체가 됩니다.
•
cc
나머지 동사들도 동일하다
앞서 말한 명사의 범위는 동사에 관계없이 동작합니다.
즉 c 대신 d 나 y < >를 입력하여 동일한 선택범위에 해당 동사의 동작을 할 수 있다는 의미입니다.
단 < > 는 들여쓰기 기능이기 때문에 오직 줄 단위로만 경우에만 적용됩니다.
타겟내용을 붙여 넣을 수 있다.
앞서 말한 3개의 명령어는 명사 즉, 특정범위내의 값을 변경하거나 삭제하거나 복사할 수 있으며 이후 이 타겟이 된 값을 붙여 넣을 수 있습니다.
이는 p 라는 명령어를 사용하여 붙여넣을 수 있으며 주로 y d < > 명령어와 함께 사용됩니다.
즉, 흔히 우리가 알고 있는 ctrl + x ctrl + c 가 d y 이며, ctrl + v 가 p 인 셈입니다.
Vim는 반복기능이 존재한다.
여러분들이 만약 변수 명칭을 바꾸었고 이를 전체 적용해야 한다면 어떻게 하시겠습니까? 어떤분은 일일이 함수를 바꾸어 주실 것이고, 조금 에디터나 IDE를 사용한 분이시라면 찾기 기능을 열어 이를 해결할 것 입니다.
Vim은 여기서 반복기능 이라는 것을 제공합니다!
이는 이전의 실행한 명령어를 반복해주는 기능입니다. 해당 기능을 이용하려면 단순히 . 를 눌러주면 됩니다.
그렇다면 이런 특정 문장을 찾고 탐색하는 것은 어떻게 할까요?
이는 마지막 항목인 기타 유용한 명령어들 에서 설명해 드리겠습니다.
4. 기타 유용한 명령어들
이번에는 좀 독특하게 사용 되는 명령어 몇개를 소개해 드리겠습니다
•
탐색
◦
/(string) - string 검색
해당 명령어는 특정 문장을 찾는 검색명령어입니다.
/ 다음에 오는 string 문장을 찾아 일치하는 문장의 맨 앞으로 커서를 이동합니다. 이후 n 을 누르면 다음 일치 문장, N 를 누르면 이전 일치 문장으로 이동합니다.
:set hlsearch 명령어로 일치하는 문장에 노란색 하이라이트를 줄 수 있으며, 확인이 끝났다면 /asdf 같이 왠만하면 일치하지 않는 값을 검색으로 한번 더 줘서 이러한 하이라이트를 끌 수 있습니다.
/ 는 . 와 상당히 유용하게 쓸 수 있는데, 이는 위에서 설명한 검색 후 변경 에서 사용할 수 있습니다.
/ 로 검색을 한 후 c 를 통해서 값을 변경한 후
n 로 다음 값으로 이동 한 후 . 을 입력하여 기존의 c 작업을 그대로 반영합니다.
◦
t, f + (charactor) - 단어 검색
해당 명령어는 한 줄에서 특정 문자를 찾아 해당 위치로 이동하는 명령어입니다. w b e 의 경우 white_space, 특수문자 단위로 이동하기 때문에 문장의 내부는 방향키를 사용해야 합니다. 이를 보완해 주는 녀석이 바로 t f 입니다.
차이점은 t 는 커서가 검색 charactor 바로 앞으로 이동하고 f 는 해당 charactor의 위치로 이동합니다.
해당 명령어는 명사 로 활용할 수 있습니다.
•
Undo Redo
◦
u - Undo
이전 작업을 취소합니다.
◦
ctrl + r - Redo
이전에 취소했던 작업을 다시 합니다.
단 해당 기능은 파일을 다시 열 때는 동작하지 않습니다.
•
일시적 cmd 이동 (bash)
◦
ctrl + z
해당 명령어는 잠시 작업을 중지시키는 bash 명령어입니다.
Vim 에서 작업중일 때 이 명령어를 입력하면 Vim 이 잠시 멈추고 cmd 화면으로 돌아옵니다.
◦
fg
cmd 에서 작업을 마쳤다면 fg 를 입력하여 다시 Vim 작업으로 돌아올 수 있습니다.
마치며...
Vim은 이제 20년이 지난 상당히 오래되고 다른 편집기와 비교하여 진입장벽이 상당히 높은 편집기입니다.
하지만 오직 키보드로만 동작하는 기능과, 이를 통해 지원되는 강력한 명령어들을 익혀보고 몇번 사용해 보면 왜 Vim에 한번 빠지면 왜 계속 사용하는지 알게 됩니다. 그 편한 ide 에서도 Vim플러그인이 왠만하면 올라와 있는 것을 보면 자연스래 고개가 끄덕여질 것 입니다.
한달 아니 일주일 이라도 좋습니다.
잠깐만 사용해 보세요. 마음에 들지 않으면 사용하지 않아도 됩니다.
살짝 발만 담가보시고 왜 Vim이 왜 아직도 사랑받는지 경험해보세요!
긴 내용 읽어주셔서 감사합니다.
ps) 저의 경우 해당 내용 대부분을 아래 출처의 유튜브를 통해서 학습했습니다.
영어라는 점을 빼고는 상당히 설명도 깔끔하고 내용도 좋으니 좀 더 자세히 알고 싶으시다면 아래 출처 링크를 확인해주세요!