Post

Vim Motion 영업 (1)

Vim Motion 영업 (1)

마우스 없이 컴퓨터를 다룬다는 것은 있을 수 없는 일이다. 하지만 가정용 PC에 마우스를 지원한 것은 1983년1이라는 것을 아는가? 그럼 그 이전 사람들은 대체 어떻게 프로그래밍을 했을까? 그 시대의 대표적인 텍스트 편집기인 vi(와 그 후속작들)의 여러 매커니즘을 알아보고 어떻게 VSCode 등 다양한 현대 텍스트 에디터에 적용할 수 있는지 알아보자! (아래는 vim의 매크로를 이용해서 반복작업을 하는 예시이다.)

macro-preview

vi

vi(visual의 첫 두 글자; /vi’ai/로 읽는다)는 1976년 배포된 텍스트 편집기이다.2 아무래도 오래된 편집기이다 보니 요즘에는 잘 쓰지 않고, 대부분 vi의 후속작인 vim(vi improved)나 그 후속작인 neovim을 사용한다. 하지만 그들이 공통으로 가지고 있는 것이 있다면, 바로 많은 사람들이 사랑하는 Vim motion이다.

Vim motion

Vim motion의 장점과 단점

우선 Vim motion이 무엇인지 설명을 늘어놓기 전에, 필자가 개인적으로 생각하는, 왜 Vim motion이 좋은지부터 설명하고자 한다. (그리고 또 잠재적인 문제점도 설명한다.)

  1. 속도 상승
    • Vim motion을 이용하면 현대의 마우스가 담당하는 대부분의 일을 키보드만으로 처리할 수 있어 텍스트 편집 속도가 오른다.
  2. 손목/어깨 건강 ★
    • 사실 애초에 자세를 바르게 하면 되겠지만, 오른손이 키보드와 마우스 사이를 자주 왕복하게 되면 어깨가 아프곤 한다. 특히, 노트북으로 코딩을 하게 되면 터치패드로 코드 중간을 섬세하게 찍기 여간 불편한게 아닌데, 정밀하게 하고자 자연스럽게 어깨에 힘을 주게 되고 이것이 또 피로로 이어진다. Vim motion을 사용하고 난 후부터는 애초에 마우스나 터치패드로 손을 옮기지 않으니 이런 불편함도 일거에 사라지게 되었다. 평소에도 이와 같은 불편함을 느낀다면 Vim motion을 익혀 보자.
  3. 쓸데없는 반복 작업 없애기
    • 반복되고 강조되는 작업은 나를 불안하게 해요. Vim motion을 이용하면 반복해서 해야 하는 작업을 매크로dot repeat 등으로 빠르게 처리할 수 있다. 코딩에서 발생하는 피로 중 상당한 부분이 반복에서 유래한다고 생각하는 사람이라면 한번 Vim motion을 배워 보면 어떨까?
  4. 단순한 구조
    • 이후에 설명하겠지만, Vim motion의 구조와 원리는 정말 간단하다. 코딩을 할 수 있는 사람이라면 Vim motion 또한 쉽게 배울 수 있다!
  5. 대부분의 환경에서 동일한 단축키
    • VSCode나 IntelliJ, Visual Studio 등 많은 IDE/텍스트 에디터는 Vim 익스텐션을 지원한다. IDE마다 단축키가 달라 고생할 수 있지만, Vim을 한 번 익혀 놓으면 대부분의 상황에서 익스텐션 설치 한 번으로 익숙한 환경을 만들 수 있다. 그리고 리모트 머신에 접속하는 경우 이런 IDE를 사용할 수 없는 경우가 대부분인데, Vim은 항상 설치되어 있다. 언제 어디서든 동일한 퍼포먼스를 낼 수 있는 것이다!

하지만 장점만 있는 것은 없는 법, 단점도 있다.

  1. 가파른 학습 곡선
    • 아까 Vim motion이 단순하다고 했지만, 실제로 유용하게 쓰려면 많은 연습이 필요하다. 단순하지만 많은 Vim motion들을 적재적소에 사용하기 위해서는 많은 생각이 필요하고, 습관으로 만들기 위해서 오히려 생산성이 떨어지는 일정 기간을 겪어야 할 것이다. 한글은 단순하지만 한국어는 어렵듯이, Vim motion을 배우는 것은 쉽지만 ‘잘’ 사용하기란 쉽지 않다.

Vim motion 구조 알아보기

Vim에서 단축키를 적을 때 대소문자를 구별하는 것이 관례인데, 예를 들어 a는 단순하게 키보드의 A키를 나타내는 것이고, A는 (대문자 A를 입력하듯) “Shift+A”를 나타낸다. 또한, Ctrl 키와 조합되는 경우에는 <C-a>로 쓴다.

Vim motion들은 모두 키보드로 이루어진다. 하지만 키의 개수는 한정되어 있고, 이 친구들 대부분은 알파벳을 입력하기 위해 존재한다. 이 상황에서 어떻게 많은 motion들을 만들 수 있을까요? vi는 여러 개의 모드를 만들어서 이를 해결했다. 이 중 두 개만 이 포스트에서 소개하겠다.

  • Normal Mode: 기본 모드이다. 대부분의 Vim motion이 이 모드에서 이루어진다. 이 모드에서는 글자를 입력할 수 없다. 다른 모드에서 <Esc> 키를 눌러서 Normal Mode로 진입할 수 있다.
  • Insert Mode: 입력 모드이다. 여기에서는 키보드를 평소처럼 글자를 입력하는 용도로 사용할 수 있다. Normal Mode에서 i키 등을 눌러서 진입할 수 있다.

Vim motion을 쓸 때에는 마우스의 움직임을 최소화한다고 생각해야 한다. 그러기 위해서는 우선 커서를 어떻게 움직이는지 알아야 할 것이다.

기본 커서 움직임

커서는 Normal Mode에서 h, j, k, l 키를 눌러 움직일 수 있다. 물론 키보드의 방향키도 작동하지만, 물론 적응하기 힘들지만, 한 번 적응하고 나면 손가락 바로 밑의 키를 눌러서 커서를 움직일 수 있다는 사실이 굉장히 기꺼워질 것이다.

움직임왼쪽아래쪽위쪽오른쪽
hjkl

커서 움직임 앞에 숫자를 붙여서 \(n\)번 같은 방향으로 움직일 수 있다. 예를 들어 5k를 입력하면 위로 5번 움직일 수 있는 것이다.

basic_movements

다른 기본 움직임 몇 개도 소개하도록 하겠다. 특히 \(n\)번째 줄로 이동할 때 쓰는 \(n\)G와 이전/다음 공백 줄로 이동하는 {}는 필자가 개인적으로 애용하는 단축키이다.

움직임연상(mnemonic)
맨 아래로G 
맨 위로gg 
\(n\)번째 줄로★\(n\)G 
다음 단어의 처음으로wword
현재 단어의 끝으로eend
전 단어의 처음으로bback
현재 줄의 처음으로0\(0\)th
현재 줄의 끝으로$Regex line-end
현재 줄의 첫 non-blank로_ 또는 ^Regex line-start
이전/다음 공백 줄로★{/} 
이전 위치로<C-o> 

basic_movements2

여기서 끝이 아니다. Vim motion에서 가장 중요한 것은 수평 방향 키보드 이동인데, 위 단축키로는 원하는 곳에 커서를 놓기 불편한 점이 있다. 이를 완벽하게 해결하는 것이 ft 단축키이다.

이동 방법현재 줄의 다음 X로현재 줄의 이전 X로현재 줄의 다음 X 직전으로현재 줄의 이전 X 직후로이전 f/t 반복이전 f/t 반복 (거꾸로)
fXFXtXTX;,
연상findfindtilltill  

find_till

텍스트 수정하기

Insert Mode로 텍스트 수정하기

텍스트는 Insert Mode에 진입하거나 Vim Motion을 이용해서 수정할 수 있다. Insert Mode에 진입하면 메모장처럼 텍스트를 편집할 수 있고, 진입 방법은 주로 네 가지가 있다. Normal Mode에서 아래 키를 누르면 Insert Mode로 진입할 수 있고, 각각 효과가 다르며, Insert Mode에 진입한 경우 왼쪽 아래에 (IDE마다 다를 수 있음) 표시된다.

진입 방법커서에서현재 줄 처음에서커서 다음에서현재 줄 끝에서개행하고 다음 줄에서윗 줄에서 개행해서
iIaAoO
연상insertinsertappendappendopenopen

insert_mode

Vim Motion으로 텍스트 수정하기

만약 여기까지 읽었다면, 축하한다! 이곳이 바로 이 아티클의 하이라이트라고 할 수 있는 부분이다. Vim Motion은 Normal Mode에서 사용할 수 있으며, 동사 + 목적어의 구조를 하고 있다. 이게 대체 무슨 말일까? 우선 무엇이 동사가 될 수 있는지 알아보자.

동사삭제대체복사
dcy
연상deletechangeyank

삭제는 말 그대로 텍스트를 삭제하는 것을 말하며, 대체는 삭제하고 동시에 Insert Mode로 전환하여 텍스트가 삭제된 자리에 커서를 위치한다. 복사는 텍스트를 건드리지 않는다. 셋 모두 클립보드에 삭제/대체/복사된 텍스트를 넣는데, 이는 나중에 p(커서 뒤에 붙여넣기)나 P(커서 앞에 붙여넣기)로 붙여넣을 수 있다. 또한, 같은 커맨드를 두 번 입력함으로써 현재 줄을 모두 삭제/대체/복사할 수 있다. 이 ‘복사’에 대해서는 다음 포스트에서 다뤄 보도록 하겠다.

그렇다면 목적어는 무엇이 될 수 있을까? 위에서 설명한 커서 이동 커맨드를 목적어로써 사용할 수 있다. 어떤 동사 뒤에 커서 이동 커맨드를 입력하면, 현재 커서가 위치한 문자/줄부터 이동 후 커서가 위치할 문자/줄까지가 동사의 범위가 된다. 예시를 통해 살펴보도록 하자. 왼쪽 끝은 inclusive, 오른쪽 끝은 exclusive함에 주의하자. 또한, Dd$ 대신, Cc$ 대신, Yy$ 대신 쓸 수 있다.

커맨드행동
cw현재 커서부터 다음 단어 직전까지를 대체한다.
d4j현재 줄과 다음의 4개 줄을 지운다. 5dd와 동작이 같다.
ct)현재 커서부터 다음 닫는 괄호 직전까지의 텍스트를 대체한다.
dF,현재 커서 직전부터 현재 줄의 이전 ‘,’까지를 지운다.

verb_object_example1

Vim Motion과 Text Object로 텍스트 수정하기

위 커맨드를 실제로 써 봤으면 알 수 있겠지만, 커맨드 목적어의 양쪽 끝을 정밀하게 정해 주어야 하기 때문에 여간 불편한 게 아니다. 그런데, 다시 생각해 보면, 우리들이 수정하고자 하는 것은 대체로 하나의 단어, 괄호 안 전체, 문단 전체 등 특정한 개체이다. 따라서 이런 개체를 목적어로 선택할 수 있다면 아주 편리할 것이다. 이들을 text object라고 하고, 아래에 자주 쓰는 text object의 목록이 있다.

개체단어문단소괄호중괄호대괄호소/중/대괄호큰따옴표작은따옴표
wp(, ){, }[, ]b"'
연상wordparagraph   bracket  

하지만 이 text object를 바로 사용할 수 없고, 앞에 i(inner) 혹은 a(관형사 a)를 앞에 붙여야 한다. i는 목적어에 구획 문자를 포함하지 않고, a는 목적어에 구획 문자를 포함한다. 특별하게 wp의 경우 a는 text object 뒤에 따라오는 공백 문자를 제거한다. 이런 text object는 커서가 바로 위에 있지 않아도 바로 다음의 text object를 탐색하여 명령을 실행하여 아주 편리하다.

verb_object_example2

VSCode에 설치하기

사람들이 애용하는 텍스트 에디터인 VSCode에는 당연하게도 Vim extension이 존재한다. Vim extension과 Neovim extension이 있는데, Neovim이 Vim의 후속작이기 때문에 후자를 추천한다. 통상적인 설치 방법대로 extension을 설치하고 재시작하면 위에 적혀 있는 기능들을 이용할 수 있는데, 결국 마우스를 덜 쓰기 위해서는 VSCode가 재공하는 단축키도 잘 알아야 할 것이다.

맺음말

이 외에도 Vim에는 많은 기능이 있고, 알면 알수록 생산성이 높아진다는 느낌을 받을 수 있다. (진짜 높아지는지는 잘 모르겠다. 하지만 단 하나 어깨가 덜 아파진다.) 이를 테면, 소괄호 안의 내용을 모두 수정하고 싶을 때 마우스로 조심히 괄호 내부를 선택해야 하는 고통스러운 과정을 없애고 대신 cib를 치면 되니 수정할 내용에 집중할 수 있게 된다.

사실 필자도 (neo)vim에 대해 아는 것보다 모르는 것이 더 많다고 자부할 수 있다. 그만큼 Neovim이 사용자에게 주는 자유도가 크다는 의미이다. 하지만 Neovim에 빠져 플러그인도 설치하고 개인 설정도 만지작거리다 보니 텍스트 에디터를 나에게 맞춰가는 느낌이 들어 계속 Neovim이 좋아지는 선(?)순환을 이룰 수 있었다! 이 글을 읽는 당신도 Neovim에 도전해 보자!

This post is licensed under CC BY 4.0 by the author.