Vim

2021년 8월 25일 수정

vi 에디터는 아주 오래전 UNIX 용 편집기로 탄생한 텍스트 에디터다. 그리고 Vim(Vi Improved)은 vi 에디터의 발전된 버전으로 일단은 vi 와 Vim은 같지 않다 라고 보는 게 정석이다.

Emacs 혹은 Doom Emacs, Spacemacs 등등에서 사용되는 evil 확장도 거의 동일한 키맵을 사용하니 이 문서를 참조할 수 있다.

Vim에 관한 몇 가지 팁

커서키

일반적인 커서 이동키를 사용할 수도 있겠지만, vi나 Vim은 h, j, k, l 의 특수한 커서 이동키를 주로 사용한다. 이 키는 아래와 같은 커서 이동키 배치로 생각할 수 있다.

  k
h   l
  j

한번 익숙해지면 헤어나오기 힘든 악명 높은(?) 키다. 심지어 여기저기에서 차용하고 있는 커서 대안 이동키 이기도 하다. 특히 j 키와 k 키는 페이스북이나 트위터 등 다양한 서비스에서 비슷한 용도로 사용되는 등 굉장히 유명한 커서 이동 키 배치 중 하나다.

종료 방법

뜬금없지만 vi 혹은 Vim 과 관련된 글에서 빠지지 않는 주제가 바로 이 종료 방법이다. 실수로 vi를 열었을 때 종료하지 못 해서 우왕좌왕하는 사태가 발생했다는 이야기는 유명하다.

vi 혹은 Vim의 종료 방법은 보통 아래처럼 설명한다.

:q

이를 풀어서 해설하자면:

  • ESC 키를 누른 후
  • : 를 누르고
  • q 를 누르고
  • 엔터를 누르면

종료가 된다.

참고로 ESC 키가 없는 특정 맥북 등에서는 ESC 대신 ^[ 키 혹은 Ctrl+[ 키를 눌러도 된다.

실수로 운 좋게(?) 편집을 했다면 강제 종료의 의미로 느낌표를 붙이면 저장 없이 그대로 종료가 된다.

:q!

즉 풀어서 설명하자면:

  • ESC 를 누르고
  • : q ! 를 차례대로 누른 후
  • 엔터를 누르면

강제종료가 된다.

Undo/Redo

  • u Undo (소문자 u 주의)
  • U Undo current line (현재 라인의 Undo, 대문자 U 주의)
  • ^R Redo (Ctrl+R)

점프(Jump)

  • f [character] 현재 라인에서 해당 문자로 점프
  • F [character] 현재 라인에서 해당 문자로 역방향 점프

인코딩

맥 등 윈도가 아닌 OS에서 만약 텍스트 파일을 열었는데 한글이 깨져 보인다면 아래 커맨드를 시험해보자.

:e ++enc=euc-kr

만약 이걸로 안 된다면 .vimrc 파일에서 fencs 설정이 어떤지 확인해 보자.

set fencs=ucs-bom,utf-8,euc-kr,cp949

이런 내용이 있다면 아마도 되어야 정상이다. 없다면 추가하자. 참고로 euc-krcp949 는 사실상 같은 거라 맞는 쪽으로 하나만 써도 된다.

파일을 다시 utf-8 으로 저장하고 싶다면 비슷하게 아래 커맨드를 사용할 수 있다.

:w ++enc=euc-kr

클립보드

터미널에서 vim으로 특정 텍스트를 복사하거나 혹은 붙여넣기를 할 때 시스템 클립보드(혹은 Pasteboard)에 복사가 안 되는 경우나 혹은 엉뚱한 내용이 붙이기 되는 경우가 있다. 이럴 때는 아래 설정 한 줄을 넣어보자.

set clipboard=unnamed

이후 macOS에서는 복사 및 붙이기가 잘 된다. neovim 등에서는 안 되는 경우도 있으니 주의하자.

기타

di{
Delete in { ... }. 중괄호 블럭의 내용을 몽땅 지우라는 의미.
yi{
Yank in { ... }. 중괄호 블럭의 내용을 카피하라는 의미.
yy10p
현재 줄을 10회 복제.

Shortcuts

Jump

f [character]
Jump to character
F [character]
Jump backward to character
;
Continue to jump
,
Continue backward to jump

Scroll

C-f
Move cursor page down
C-b
Move cursor page up
C-u
Move viewport up half page
C-d
Move viewport down half page
C-y
Move viewport down one line
C-e
Move viewport up one line