티스토리 뷰

개발/tools

vim 입문자 핵심 단축키 공략

Jaeyeon Baek 2021. 7. 16. 09:09

키보드 자판 위에 vim 단축키를 나타내는 이미지가 돌아다니지만 입문자 입장에서 보기 어렵지 않을까 싶은 생각에 입문자용 핵심 단축키 정리를 마음먹었다. 아래 이미지를 보시라. 한글 버전판도 있지만, 입문자에게 이게 다 무슨 소리인가 싶지 않겠냐는 거다. 우주선 조종 기판 같다. 

http://www.viemu.com/vi-vim-cheat-sheet.gif

 

나는 개발 커리어를 리눅스 커널로 시작해서 약 7년간 vim으로만 개발을 해왔으면 이후에도 IntelliJ에 vim 플러그인을 이용하는 등 광적으로 vim을 사랑하는 유저이다. 지금이야 순정이 좋지!라는 마음으로 웬만하면 IDE는 그냥 플러그인 없이 순정으로 이용하는 편이지만. 아무튼 각설하고 vim을 처음 입문하는 사람에게 실제로 도움이 될만한 단축키를 설명하도록 한다. 본문에 있는 단축키는 모두 완벽하게 손으로 익혀주는게 좋다. 그만큼 자주/많이 사용되는 것들이기 때문이다. 이 글에서는 동일한 결과를 얻는 단축키에 대해서는 가급적 딱 한 가지에 대해서만 설명한다. 여러 개 욱여넣어봐야 잘 사용하지 않게 된다. 더욱이 글의 취지는 "나 이렇게 많이 알아요"가 아니라 vim 사용에 필요한 최소한의 단축키를 널리 알리자는데 있다. 자, 그럼 vim 모드 개념부터 잡으면서 시작하도록 하자!


 

# vim 모드 개념

아래 설명하는 내용을 이해하기 위해서는 vim에서 제공하는 모드에 대해 알고 있어야 한다. 기본적으로 네 가지 모드를 이해하고 시작하도록 하자. 이외에 대해서 더 깊이 있게 공부하고 싶다면 공식문서를 참고하면 좋다. 

  • Normal mode command
    • 단축키가 입력 가능한 상태이다. 여기서 설명하는 대부분의 단축키가 Normal mode에서 동작한다. 특별한 언급이 없다면 Normal mode의 커맨드라고 이해하면 된다.
    • ESC를 누르면 이 모드가 된다.
    • 이 모드에서 command-line command 사용이 가능한데 파일을 저장하는 등의 커맨드를 생각하면 된다. 파일을 중간중간 저장하는 습관은 vim에서도 굉장히 중요하기 때문에 많은 사람들은 습관적으로 ESC를 연타로 누르고 :w 를 반복적으로 누르기도 한다. 
    • 내 경우에도 :w 는 서너 번씩 하는 편. 그냥 코딩하면서 생각이 필요할 때마다 습관적으로 눌러준다. 습관이 잘 안 들까 봐 걱정이라고? 걱정하지 마시라. 작업하던 큰 파일 한번 날려먹으면 금방 손가락이 먼저 반응하게 된다.
    • 아래 이미지처럼 빨간 박스 안에 아무것도 표시가 안되어 있다면 Normal mode이다.
  • Command-line command
    • 따옴표(:)를 입력하면 Command-line으로 진입한다.
    • 파일을 저장하거나 외부 명령어(셸) 사용, 기타 플러그인 기능을 불러올 때 사용된다.
    • 여기서는 파일을 저장하거나 빠져나갈 때 쓰는 모드 정도로 이해하면 좋다. 아래는 파일을 저장하는 예제이다. ( :w 를 입력하고 엔터까지 입력했다 )
  • Insert mode command
    • 입력하는 모드이다.
    • i 키를 입력하면 진입된다
    • 아래 이미지처럼 빨간 박스 안에 INSERT라고 표시되면 Insert mode이다. 신나게 타이핑을 해주자.
  • Visual mode command
    • 블록을 지정해서 해당 블록에 대해 단축키를 적용할 때 사용한다. 예를 들면 함수 전체를 비주얼 모드로 감싸서 복사 단축키를 입력한다던지, 버티컬 블록을 지정해서 동시에 여러 라인을 편집한다던지 말이다.
    • 입문 단계에서는 쓸 일이 없다.
    • 아래 이미지처럼 빨간 박스 안에 VISUAL LINE이라고 표시되면 Visual mode이다

 

# 커서 이동

방향키로 커서를 이동하는 건 이제 그만! vim은 위(k), 아래(j), 왼쪽(h), 오른쪽(l) 으로 커서를 이동하자.

대부분 사람들은 타이핑을 하기 위해 키보드 위에 손을 얹을 때 왼쪽 검지를 F(ㄹ), 오른쪽 검지를 J(ㅓ)에 둔다. 본인 또한 처음 컴퓨터를 접하고 타자연습을 할 때 화면에 그려진 손가락 모양을 보고 그렇게 익혔던 걸로 기억한다. 그 습관 때문에 현재도 한영 모두 키보드에 손가락을 얹으면 기본적으로 검지가 F, J에 위치하는데 재밌는 건 vim에서 키보드를 이동할 때만큼은 오른손 검지를 H(ㅗ)에 위치시키는 게 편하다. 그리고 검지로 왼쪽(h), 중지로 아래(j), 약지를 이용해서 위(k), 오른쪽(I) 이동을 제어한다. 그냥 검지부터 소지(새끼)까지 모두 사용하면 더 편할지 모르겠는데 아무튼 습관이 그렇게 들었다.

 

# 페이지 스크롤

방향키를 밑으로 쭈욱 내리면 자동으로 화면이 스크롤 될테지만 모니터를 피벗으로 전체 화면을 꽉 채운 터미널을 사용하고 있다고 생각해 보시라. 그리고 커서가 맨 위에 있다면 어느 세월에 방향키를 밑으로 내려서 화면 스크롤을 할 텐가. 스마트하게 익히도록 하자.

화면을 아래로 스크롤(Ctrl+e), 화면을 위로 스크롤(Ctrl+y). 아래 예제에서 보이듯이 스크롤에 커서가 걸리게 되면 커서도 같이 밀린다. 스크롤을 아래로 내릴 때 커서가 같이 밀려가다가 스크롤을 위로 올리면 커서는 그자리에 남아있다.

 

# 한 페이지 단위로 이동

스크롤만으로는 한계가 있다. 페이지 단위로 이동을 해보자. 한 페이지 밑으로 이동(Ctrl + f), 한 페이지 위로 이동(Ctrl + b), 페이지 스크롤과 마찬가지로 커서는 화면에 밀리면 밀린 위치에 그대로 남아있게 된다.

 

# 파일의 시작으로 이동, 파일의 끝으로 이동

파일의 시작 위치로 이동(gg), 파일의 마지막 위치로 이동(Shift + g), gg의 경우 include, import 문을 작성하러 맨위로 이동할 때 유용하다. 그리고 보통 파일의 마지막에 main 함수가 위치하기 때문에 그쪽으로 이동할 때 Shift + g 를 사용하는 편이다. ( main이라는 문자열을 검색해서 빠르게 이동해도 되지만 단축키는 타이핑해야 하는 수고가 없다 )

 

# 다음줄로 이동 후 Insert mode 로 전환

다음 줄로 이동 후 insert mode로 전환(o), 현재 위치에서 insert mode로 전환은 i 를 누르면 되지만 i 보다는 o가 훨씬 더 사용빈도가 높다. 개인적인 습관인가. 한편, 윗줄로 이동 후 insert mode 전환은 Shift + o를 입력하면 되지만 그다지 쓸 일은 없다.

 

# 한줄 복사하기, 붙여넣기

한 줄 복사하기(yy), 붙여넣기(p), yy는 현재 라인을 복사하고, p는 현재 커서의 아래 라인으로 붙여넣기를 하면서 커서를 함께 이동시킨다. 복사된 내용은 새로운 복사가 발생하기 전까지 버퍼에 계속 남아있어서 p를 연속으로 입력하면 이전 복사 내용이 계속 붙여넣기 된다. 규칙적인 내용의 텍스트를 입력할 때 사용해주면 좋다.

 

# 여러 줄 복사, 붙여넣기

여러 줄 복사(y숫자y), 붙여넣기(p), 아래 예제에서는 y3y를 순서대로 입력해서 3줄 복사를 했다. 그리고 커서를 이동해서 p로 붙여넣기하는 화면이다.

 

# 한 줄 삭제

한줄 삭제(dd), 아래 예제는 dd를 여러 번 입력했을 때의 결과이다. 그냥 d를 쭈욱 누르고 있어도 된다.

 

# 여러 줄 삭제

여러줄 삭제(d숫자d), 예를 들어 3줄을 삭제하려면 d3d를 순서대로 입력해주면 된다. 스마트하긴 하지만 역시 d를 연타로(혹은 계속) 누르고 있는 게 더 편하다.

 

# 텍스트를 한 글자씩 삭제

텍스트를 한 글자씩 삭제(x), x키를 누르고 있어 보자. 한 글자씩 삭제가 되는 게 확인된다. 아주 간결한 만큼 많이 사용되니까 잘 기억해두면 좋다. 좀 더 심화로 들어가면 dw 입력을 통해 단어 단위로 삭제도 할 수 있다. 각자 실습해보도록 하자.

 

# undo, redo

undo(u), redo(Ctrl + r), 마지막에 실행한 명령을 취소하거나 되돌릴 때 사용한다. 여기 예제에서는 insert mode로 바꿔서 텍스트를 입력하고 normal mode로 돌아와서 undo, redo를 차례로 입력했다. 보이듯이 insert mode에서 작성된 두 개 라인이 한 번에 undo 되는 것을 확인할 수 있다. undo, redo는 꽤 큰 히스토리 버퍼를 갖고 있기 때문에 u를 누르고 있으면(혹은 연타) 이전 상태로 계속 돌아간다. 마찬가지로 이렇게 연속으로 undo를 시켰다면 redo도 같은 연속으로 시킬 수 있다. Ctrl + r을 누르고 있어 보시라. config 파일을 수정하려고 들어가서 잔뜩 수정하고 있었는데.. "아 이게 아닌 것 같다"라는 생각이 드는 시점에 u를 누르고 있으면 파바밧! 마치 시간이 되돌아가는 것 같은 마법처럼 화면이 바뀔 거다. 주의해야 할 점은 당연한 이야기지만 파일을 빠져나가는 순간 버퍼는 날아간다. 파일이 열려있는 순간에만 유지된다는 점을 명심하자.

 

# 화면 분할

한 개 파일의 크기가 길어서 화면을 분할해야 하는 경우가 있다. 이때 유용하게 기능을 사용하도록 하자. 가로 분할(Ctrl + w, s), 세로 분할(Ctrl + w, v), 키를 입력하는 요령은 대문자 W 입력을 위해 Shift+w를 누르듯이 Ctrl + w를 한번 눌러주고 손을 뗀다. 그리고 s를 눌러주면 된다. 마찬가지로 세로 분할을 이용할 수 있다. 분할된 창을 빠져나올 때는 command-line 모드에서 :q 를 입력하면 된다. ( 혹은 Ctrl + w, q도 가능한데 본인 편한 걸로 익히시면 된다. 개인적으로는 너무 많은 것을 기억하고 싶지 않아서 :q를 선호하는 편이다 )

 

# 분할된 창으로 커서 이동

분할된 창으로 커서 이동(Ctrl + w, w), 단축키가 입력될 때마다 분할되어 있는 창을 순회하며 이동할 수 있다. 순회라는 말에 주목하면 되는데 창이 여러 조각으로 분할되어 있다면 순서대로 이동된다는 의미다. 한편, 동서남북 네 조각으로 나눠져 있는 창을 상상해보시라. 오른쪽 창으로 이동하고 싶을 수도 있고, 위, 아래, 왼쪽으로 이동하고 싶을수도 있다. 이때는 Ctrl + w, (위에서 배운 방향키)를 입력하면 되는데 예를 들어 왼쪽 창으로 이동하고 싶다면 Ctrl + w, h를 입력하면 된다. 물론 Ctrl + w, w 를 통해 순회하다 보면 원하는 목적지에 도달할 수도 있겠지만, 이때는 스마트하게 이동하려는 창의 위치를 지정할 수도 있다. 창을 여러 조각으로 분할하고 Ctrl + w를 그냥 계속 누르고 있어 보면 대충 감이 오실 거라고 생각된다. 샤샤샥!

 

# 단어 검색

 normal mode에서 슬래시(slash)를 입력하고 찾고자 하는 단어/문장을 입력해보자. 마지막으로 엔터까지 입력해주면 된다. (하아.. 순정 vim을 쓰고 있는데 옵션 하나가 켜져있었나 보다.. gif를 다시 만들기는 싫어서.. 혹시 화면처럼 실시간으로 찾아지는 걸 보고 싶으신 분은 normal mode에서 :set hlsearch를 입력해주시라. 죄송..)

 

# 검색된 단어 사이에서 이동

 검색된 단어 사이 이동(n), n 을 눌러서 단어를 이동해보자. 바로 다음 검색 결과로 이동된다. 이전 단어 검색은 Shift + n을 입력하면 된다. 

 

# 비주얼 블록 지정 복사, 붙여넣기

비주얼 블록 지정은 normal mode에서 Shift + v, 그럼 화면 하단에 VISUAL LINE으로 표시가 되고 커서의 현재 라인이 블록으로 잡힐 것이다. 이 상태에서 커서를 이동해보면 이동되는 쪽으로 블록이 확장되는 것을 확인할 수 있다. 그러고 나서 복사하려는 지점까지 이동했으면 y를 입력해주자. visual mode가 풀리면서 하단에 6 lines yarked 라고 표시가 될 텐데 이제 원하는 위치에서 붙여넣기(p)해주시면 된다. ( p가 아니라 d도 눌러보자. 그럼 블록 지정된 영역이 삭제될 것이다. 개인적으로 여러 라인 삭제는 d를 그냥 누르고 있는 걸 선호하기 때문에 딱히 쓸 일이 없긴 하다 )

 

# 세로 비주얼 블록 지정

세로 비주얼 블록 지정(Ctrl + v) 입력 후 h, j, k, l을 통해 방향 이동을 하면 된다. 이렇게 블록 지정하는 일이 뭐가 있을까? 여러 줄에 걸친 들여 쓰기를 블록 지정후 삭제할 때 유용하다. 또는 블록 지정은 조금 더 심화된 명령을 연결해서 사용할 때 필요하다. 나중에 필요한 경우가 생기면 그때 다시 익히도록 하자.

 

# 기타 전문가 단축키

여기서는 언급하지 않는다. 전문가는 순정 vim을 넘어서 플러그인을 함께 사용하는 단계이다. ctags, cscope로 꽃을 피울 수도 있고, vimrc 설정을 통해 커스텀하게 vim을 세팅할 수도 있다. 그리고 필요한 플러그인은 vim plugin 키워드로 검색하면 여러 사람들이 만들어 놓은 걸 어렵지 않게 찾을 수 있을 것이다. 아마도 여기 레벨이 궁금하신 분은 이미 vim을 친숙하게 사용하고 있을 가능성이 높기 때문에 조금 더 예쁘게, 혹은 헤비 한 기능을 쓸 수 있는 플러그인을 직접 검색해 보시면 되겠다.

 


 

몇 개만 뚝딱 언급하고 끝내야지"라고 생각하고 글을 쓰기 시작했는데 모든 예제마다 단축키 입력 시 어떤 결과가 나오는지 보여주기 위해 gif 이미지를 넣다 보니 작업이 오래 걸렸다. 근데 이게 없이 텍스트로만 설명하면 실제 어떤 결과를 이야기하는지 난해한 부분이 있기 때문에 오래간만에 노가다 좀 했다.

혹시 누군가에게는 이 글이 "겨우 이것만 다룬다고? vim이 얼마나 강력한 단축키가 많은데!"라고 느낄지도 모르겠다. 하지만 그런 단축키는 기본을 떼고 나서 익히는 게 좋다. 본문에서 다룬 것만 머리에 욱여넣기에도 vim을 처음 다루는 사람 입장에서는 높은 허들 일지 모르기 때문이다. 자자, 다들 올챙이 쩍 생각하자고요. 심지어 저는 여러 줄 삭제, 화면 분할, 비주얼 블록 지정도 본문에서 빼야 하나 고민 많이 했답니다. 아무튼, 이 글이 부디 누군가에게는 도움이 되셨기를 바란다.

댓글
댓글쓰기 폼