VIM은 정말 최고야!
2022년 4월 16일VIM(VI iMproved)은 텍스트 편집기인 VI를 쓰기 쉽게 만든 프로그램입니다. VI만 가지고 코드를 쓰기엔 이것저것 불편한 점이 있어 기능을 추가한 버전이 VIM입니다(이후 VI와 VIM을 동일시 하겠습니다). VIM의 초기 진입 장벽과 vscode와 같은 강력한 텍스트 편집기로 쓰는 일이 드물지만 CLI 환경에서 VIM은 한 줄기 빛과 같은 존재입니다. 필자는 VIM을 제대로 다루지 못하지만 좋아하는 프로그램 중 하나입니다. VIM이 어떤 물건인지 간단하게 설명하는 시간을 갖도록 하겠습니다.
VIM은 어렵습니다. GUI 환경에 익숙한 저희는 CLI 텍스트 편집기 사용이 고역입니다. 처음 VIM을 사용한다면 어떻게 텍스트를 입력하는지 어떻게 VIM을 종료시켜야 할지 감이 도통 오지 않을 겁니다. VIM의 모드를 알아가면 이를 쉽게 이해할 수 있습니다. VIM은 4가지 모드가 존재합니다.
- 일반 모드(Normal Mode)
- 처음 문서를 열었을 때 나타나는 모드
- 단축키로 커서 이동, 복사, 붙여넣기, 삭제를 할 수 있지만 입력은 할 수 없다
- 입력 모드(Insert Mode)
i
,a
,o
,s
키로 진입하며, 일반적인 텍스트 편집기 처럼 입력을 할 수 있는 모드
- 비주얼 모드(Visual Mode)
v
,V
키로 진입하며, 블록 단위로 명령을 수행할 범위를 지정하는 모드- 마우스 드래그 하여 범위를 지정하는 행위와 같다
- 명령 모드(Command Mode or ex Mode)
:
,/
키로 진입하며 저장, 종료, 다른 파일 불러오기와 같은 기능을 수행한다
여기서 가장 헷갈리고 어색한 부분이 일반 모드입니다. 보통의 텍스트 편집기는 바로 텍스트를 복사, 삽입, 수정, 삭제가 가능하지만, VIM은 단축키를 가지고 이를 수행합니다. 예를 들어, 한 줄 전체를 지우고 싶다면 평소 같으면 한 줄을 마우스 드래그하여 지웠지만 VIM은 일반 모드 상태에서 dd
라는 명령으로 지웁니다. 너무나 어색한 방법이지만 나름 CLI 환경에 최적화 되고 오로지 키보드만 가지고 모든 일을 할 수 있는 방법입니다.
이제 기본적인 단축키들을 알아봅시다. 필자도 모든 단축키를 아는것이 아니라 제가 주로 사용하는 VIM 생존형(사실 제가 알고만 있는..) 단축키만 모아봤습니다.
- VIM 단축키
h 왼쪽 이동 j 아래 이동 k 위 이동 l 오른쪽 이동 dd 한 줄 잘라내기 i 왼쪽 커서 위치에 문자 삽입 a 오른쪽 커서 위치에 문자 삽입 ^ 줄 맨 처음으로 이동 $ 줄 맨 뒤로 이동 x 현재 글자 지우기 e 오른쪽 한 단어 끝 부분으로 이동 b 왼쪽 한 단어 앞 부분으로 이동 yy 한 줄 복사 p 붙여넣기 gg 맨 위로 이동 G 맨 아래로 이동 u 되돌리기 v 비주얼 모드 들어가기 CTRL + r 되돌리기 취소 CTRL + u 한 페이지 위로 이동 CTRL + d 한 페이지 아래 이동 CTRL + n 다음 자동 완성 후보 CTRL + p 이전 자동 완성 후보 :q 문서 종료 :q! 문서 저장하지 않고 종료 :w 문서 저장 :wq 문서 저장 후 종료 :wq! 강제 저장 후 종료 :[숫자] [숫자] 라인으로 이동 /[문자] [문자] 검색 SHIFT + >> 혹은 << 들여쓰기 이동 (괄호에 대고) $ 괄호 끝 혹은 처음으로 이동
아니 무슨 에디터를 쓰는데 이런 단축키를 전부 알아야한다고요? 사실 VIM을 쓰기 위해서 문자를 입력하고(i
, a
) 저장하고 나가는(:wq
) 단축키만 알면 됩니다. 하지만 VIM의 진가는 바로 키보드 위에서 모든 작업이 가능하게 해주는 단축키 덕분입니다. 매일 코드를 수정하는 개발자들은 조금이라도 손 피로를 줄이는 것이 좋습니다. 코드를 수정하는데 키보드와 마우스를 번갈아 가면서 작업하는 것보다 오로지 키보드 위에서만 작업을 한다면 손목 피로 부담이 덜합니다. 예를 들어, 마우스 스크롤 할 필요없이 CTRL + u
, CTRL + d
으로 이동하고 마우스로 영역 선택할 필요없이 v
로 비주얼 모드로 들어가서 커서 영역을 선택할 수 있습니다. 하지만 무엇보다도 필자가 가장 편하게 생각하는 기능은 커서 이동입니다. 보통 키보드 커서 이동 방향키는 오른쪽 밑에 위치합니다. 하지만 VIM의 커서 이동 단축키는 h
, j
, k
, l
으로 딱 오른손 위치에 있어 오른손 손목을 그대로 유지한 채 커서를 이동할 수 있습니다. 이 작은 차이가 생각보다 커서 이 단축키로 VIM을 애용하고 있습니다.

어때요? VIM을 쓰고 싶은 마음이 들었나요? 당장 VIM을 쓰고 싶은데 어디서부터 시작해야할지 모르는 분들을 위해 vimtutor를 추천드립니다. vimtutor는 VIM tutorial로 CLI 환경에서 단계적으로 VIM에 익숙해지도록 도와주는 설명서입니다. 리눅스 터미널 환경에 vim을 설치하면 vimtutor
명령어를 쓸 수 있습니다.
어느정도 단축키도 습득했다면 이제 VIM을 조금 더 꾸며봅시다. .bashrc
파일로 쉘 환경을 구성하듯이 .vimrc
파일을 통해 VIM 환경을 설정할 수 있습니다. 다음은 제가 기본적으로 적용하는 .vimrc
입니다. 보통 .vimrc
파일의 위치는 ~
혹은 /root
입니다.
BASHsyntax on # 문법 하이라이팅 적용 set nu # 왼쪽에 줄 번호 표시 set ts=2 # tab size 2로 설정 set sw=2 # 자동 들여쓰기 size 2로 설정 set smartindent # 문법에 맞게 자동으로 들여쓰기 적용 set autoindent # 들여쓰기를 다음 줄에도 적용 set encoding=utf-8 # 인코딩 적용 set fileencodings=utf-8 # 파일 인코딩 적용
여기까지 설정했다면 VIM을 사용하는데 큰 무리가 없습니다. 하지만 VIM을 보다 IDE스럽게 만들 수 있습니다. YouCompleteMe(YCM) 플러그인으로 Vscode처럼 예쁘게 자동 완성 목록이 나오게 만들거나 ctags, cscope로 정의된 함수 이동하는 기능을 추가할 수 있습니다. 하나의 예시로 .js 파일에 정의된 함수로 이동하는 예시를 알아보겠습니다.
node와 같이 js 파일들로 이루어진 프로젝트가 있고, 정의된 함수를 찾고 싶을 때 일일이 파일을 뒤져가면서 직접 찾지않고 ctags를 이용하면 쉽게 찾을 수 있습니다. ctags는 tags라는 파일을 만들어 이 파일에 변수, 함수, 클래스들이 선언된 위치를 기록하고 이를 토대로 사용자한테 위치를 알려주는 방식입니다. 저희는 기존의 ctags를 업그레이드한 Universal ctags를 이용할 겁니다.
BASH# Ubuntu sudo apt install universal-ctags # Mac brew install --HEAD universal-ctags/universal-ctags/universal-ctags # Check ctags --version # Generate 'tags' file cd [MY DIRECTORY] ctags -R
태그를 생성하고 싶은 디렉터리로 가서 ctags -R 명령어으로 tags 파일을 생성합니다. 그 후 vi로 확인하고 싶은 변수 위치에 CTRL + ]
를 입력하면 선언된 변수 위치로 가게됩니다. 다시 이전으로 돌아가고 싶으면 CTRL + t
를 입력하면 됩니다. 더 많은 ctags에 대한 사용법을 알고 싶으면 다음의 글을 추천합니다.
즐겁게 VIM을 설치하고 설정을 했지만 GUI 환경에서 인기있는 코드 에디터는 Vscode, Intellij 제품, Sublime Text와 같은 프로그램입니다. CLI에서나 VIM이 강력하지 GUI 환경에서는 오히려 불편하기 짝이 없는 물건입니다. 하지만 걱정하지 마세요. GUI 환경에서 VIM의 단축키를 같이 활용할 수 있는 extension이 있습니다. Vscode의 Vim extension, Intellij의 IdeaVim, Sublime Text의 Vintage를 통해 GUI환경에서 VIM 단축키를 쓸 수 있습니다 👏👏. 심지어 맥 환경 자체에서 제한적이긴 하지만 VIM 단축키를 쓸 수 있는(!) 프로그램도 있습니다.
필자도 VIM의 단축키, 플러그인을 잘 알지 못 합니다. 하지만 이번 글을 통해 적절히 VIM의 단축키와 Vscode와 같은 GUI 코드 에디터의 조합으로 조금이나마 개발을 하는데 도움이 되었으면 좋겠습니다. 리눅스 환경에서는 기본적으로 VI가 설치되어있으니 한 번쯤은 단축키로 놀아보는 시간은 어떨까요? :)