03 Vim 기초 - Normal Mode 에서의 커서 이동

이 포스팅에서는 GUI 환경에서 마우스를 활용하여 커서를 이동시킬 수 있는 동작들을, Vim 에서는 어떻게 수행할 수 있는지 알아본다. 당장 익혀서 실전에 적용할 수는 없겠지만, 여기서 이런 것들이 가능했다는 사실들을 인지해두고, 나중에 코딩을 하다가 '그런 기능이 있었지'라며 돌아와서 찾아보기에 유용한 포스팅이 되길 바란다.

Vim 에서의 방향키 h, j, k, l

Vim 은 마우스가 대중화되기 이전에 개발된 텍스트에디터인 Vi 를 모체로 한다.  아마도 당시 키보드에는 방향키가 없었던 모양인지, 일반 qwerty 배열 키보드의 h, j, k, l 키에 각각 좌, 하, 상, 우 를 할당했다. (Vim 과 자주 비교되는 emacs 의 경우에는 i, j, k, l 의 방향키와 비슷한 배열로 상하좌우를 움직일 수 있다.)

 

요즘 시대에 실제 방향과는 조금 무관하게 보이는 h, j, k, l 로 커서를 움직인다는게 어색하긴 하지만, 연습을 하고 익숙해지면, 생각을 거치지 않고도 바로 커서를 움직일 수 있게 된다.

 

⚠ 현재 Vim 이 Normal 모드인지 확인한다. (Vim 이 실행된 상태 또는 IDE 에서 활성화된 상태라면 ESC 를 눌러 Normal 모드로 빠져나갈 수 있다.)

좌우 이동

  • h 키로 좌로 움직일 수 있다.
  • l 키로 우로 움직일 수 있다.

일단 vim 에서 기본 방향키가 h, j, k, l 임으로부터, h 는 맨 왼쪽에 있고, l 은 맨 오른쪽에 있다. 이로써 이 둘은 좌, 우 로의 이동임을 유추할 수 있다.

Vim 노멀 모드에서의 좌우 이동

상하 이동

  • j 키로 아래로 움직일 수 있다.
  • k 키로 위로 움직일 수 있다.

왜 j 가 아래이고, k 가 위인지는 모른다. 때론 있는 그대로 받아들여야 하는 경우가 있다.

Vim Normal 모드에서의 상하이동

Vim 에서의 라인 점프 (줄단위 이동)

문장(line)의 시작과 끝으로 이동하기

  • $(shift + 4) 키로 문장의 끝으로 이동할 수 있다.
  • ^(shift + 6) 키로 문장의 시작으로 이동할 수 있다.
  • 0 키로 라인의 첫번째 컬럼으로 이동할 수 있다. (cf. ^)

정규표현식에서 $ 는 문장의 끝을 의미하고, ^ 는 문장의 시작을 의미한다. 마찬가지로, vim 에서는 해당 키로 문장의 시작과 끝을 한번에 움직일 수 있다. 

h 키를 반복하여 누르거나, l 키를 반복하여 눌러 문장의 시작과 끝으로 이동할 수도 있다. 하지만 Vim 은 골프와 같다. 어떻게 하면 키 입력을 최소화하여 원하는 결과를 이룰 수 있을지 고민해야 한다.

Vim 에서 문장의 시작과 끝으로 이동하기

여기서 한가지 짚고 넘어가야 할 것은, 문장의 시작과, 라인의 첫 컬럼으로 이동할 수 있는 키가 분리되어있다는 것이다. 

^는 문장의 시작으로 이동하는데, 공백이 아닌 첫 번째 문자가 나타나는 위치로 이동한다는 의미이다.

반면, 0은 라인의 공백과는 상관 없이 맨 첫번째 컬럼(0번)으로 이동한다. 

굳이 이렇게까지 나눠놓은 이유가 있겠냐싶지만, 추후에 매크로라든지를 활용하여 특정 작업을 수행할 때, 두 명령이 분리되어있다는 것이 유용하게 다가옴을 느낄 수 있을 것이다.

Vim ^(shift + 6) 과 0 의 차이

문서의 특정 라인으로 이동하기

  • (라인번호 입력) + gg 키로 해당 라인넘버로 점프할 수 있다. (또는, gg 대신 G 를 입력해도 된다.)

Vim 을 가볍게 사용하는 예 중에 하나는, 서버에 쌓여있는 로그를 확인하는 것이다. 물론 tail 명령어라는 좋은 대안이 있기도 하지만, Vim 으로 수천~수만 라인에 달하는 로그를 확인해야 하는 경우가 있을 수 있다.

이 때, 특정 라인으로 점프할 수 있는 기능을 Vim 에서 제공한다.

 Vim 에서 특정 라인 넘버로 이동하기

문서가 14줄 밖에 안되지만, 100gg 를 입력하니 문서의 맨 끝으로 이동했다.

문서의 시작 라인, 끝 라인으로 이동하기

  • shift + g 키로 문서의 끝 라인으로 이동할 수 있다.
  • gg 키로 문서의 시작 라인으로 이동할 수 있다.

숫자 입력 없이 gg 를 입력하면 문서의 시작 라인으로 이동한다. G (= shift + g) 키로 문서의 마지막 라인으로 이동한다.

특히, 라인 수가 굉장히 많은 파일일 경우에 유용하다. 

Vim 에서 문서의 시작라인과 종료라인으로 이동하기

[비개발용] 마침표를 기준으로 한 문장의 시작과 끝으로 이동

  • ( 키는 마침표를 기준으로 이전 문장의 시작 위치로 이동한다.
  • ) 키는 마침표를 기준으로 다음 문장의 시작 위치로 이동한다. 

Vim 은 꼭 프로그래머를 위해서만 개발된 것은 아니다. 글을 쓰는 작가에게도 Vim 은 유용할 수 있다. 하지만, 이 기능은 프로그래머에게는 그다지 유용하지 않다. 프로그래머에게 마침표는 종료보다는 참조의 의미로 쓰이는 경우가 많기 때문이다. 

마침표를 기준으로 문장간 이동

Vim 에서의 페이지단위 이동

GUI 환경에서의 마우스 스크롤에 해당하는 기능이라고 볼 수 있다. 

반 페이지 단위 이동

  • Ctrl + u 키로 반 페이지 위로 이동할 수 있다.
  • Ctrl + d 키로 반 페이지 아래로 이동할 수 있다.

일반 풀배열 키보드에는 방향키 위쪽에 PageUp 키와 PageDown 키가 존재한다. 이는 페이지 단위를 이동하는 데 매우 유용하다. Vim 에서도 이와 같이 페이지 단위로 이동할 수 있는 단축키를 제공한다. 단축키를 나타내는 키보드는 각각 up 과 down 을 의미하므로 기억하기에도 쉽다.

Vim 에서의 반페이지 단위 이동

한 페이지 단위 이동

  • Ctrl + b 키로 한 페이지 위로 이동할 수 있다.
  • Ctrl + f 키로 한 페이지 아래로 이동할 수 있다.

반 페이지 단위 이동과 동일하게 작동한다. 다만, 더 많은 라인을 점프하는 것을 확인할 수 있다. 단축키를 나타내는 키보드 또한 직관적이다. b 는 backward 를, f 는 forward 를 의미한다.

Vim 에서의 한 페이지 이동

단어 이동

Vim 에서는 h, j, k, l 로 기본적인 커서 이동을 할 수 있고, 사실 이 네 개의 키만으로도 커서를 원하는 위치로 '언젠가는' 이동시킬 수 있다. 하지만, Vim 을 사용하는것이 무언가 시원스런 코드 입력이라면, 이 챕터를 주목할 필요가 있을 것이다. 프로그래밍이라는 행위는 기계에게 해야할 일을 명확히 지시하는 것이다. 마찬가지로, 우리가 현실 속에서 '오른쪽으로 조금만 더' 와 같은 애매한 표현은 컴퓨터에게 적절하지 않다. 다시, 나중에 배울 매크로와 결합된다면, 여기서 익혀둔 커서 이동은 큰 도움이 될 것이다.

다음 단어의 첫 글자로 이동

  • w 키로 맥락상(?) 다음 단어의 첫 글자로 이동한다.
  • W 키로 공백기준으로 다음 단어의 첫 글자로 이동한다. 

w (소문자)는 맥락상 특정 구분기호(" 나 . 같은)를 기준점으로 이동한다. 반면, W(대문자)는 명확히 공백을 기준으로 다음 단어의 시작으로 이동한다. word 의 앞글자를 의미한다.

 

하나 기억해둘 것은, 다음에 소개할 b, e 의 동작과는 다르게 무조건 다음 단어로 점프한다는 것이다. 

 

w (소문자) 키를 '맥락상'이라고 표현하고 만 이유는, 우리가 w 로 이동할 때 정확히 어떤 구두점을 기준으로 점프하는지 외우는 것은 너무 소모적이라고 판단했기 때문이다. (이를 외워서 정확하게 이동하면 더할나위 없이 좋기도 하겠지만 추후 특정 문자로 이동할 수 있는 기능(f 키)이 대안이 될 수 있다.) 보통 원하는 단어의 첫 글자의 위치에 커서가 위치할 때까지 w 키를 반복해서 누를 수 밖에 없다.

 

보통 l 키를 활용하여 라인의 오른쪽으로 이동하는데, 이게 시원치 않을 경우 w 키로, 이마저도 시원치 않을 경우 W 로 이동하자.

Vim 의 다음 단어의 첫 글자로 이동하기 w 와 W

다음 단어의 끝 글자로 이동

  • e 키로 맥락상(?) 커서가 위치한 단어 또는 다음 단어의 끝 글자로 이동한다.
  • E 키로 공백기준으로 커서가 위치한 단어 또는 다음 단어의 끝 글자로 이동한다.

w 키와 마찬가지로 움직이지만, 단 한가지의 차이점은 단어의 맨 뒤에 커서가 위치한다는 것이다. end of word 의 앞글자를 땄다고 생각하면 될 것 같다.

 

굳이 w 키가 있는데 왜 또 e 키에 해당하는 명령어를 만들었는지 의아할 수도 있을 것이지만, 이 또한, 나중에 Vim 의 진짜(?) 기능을 체험하게 될 텐데, 그 때 비로소 진가를 발휘한다. 

 

하나 기억해둘 것은, 현재 단어의 끝 글자로 먼저 이동한다는 것이다. 현재 단어의 끝 글자에 위치한 다음에야 비로소 다음 단어의 끝 글자로 이동한다. 

Vim 의 다음 단어의 끝 글자로 이동하기 e 와 E

이전 단어의 첫 글자로 이동

  • b 키로 맥락상(?) 커서가 위치한 단어 또는 이전 단어의 첫 글자로 이동한다.
  • B 키로 공백기준으로 커서가 위치한 단어 또는 이전 단어의 첫 글자로 이동한다.

back 을 의미한다. w, e 를 통해 전진했다면, b 를 통해 후진할 수 있다. 

 

하나 기억해둘 것은, e 의 동작원리와 마찬가지로, 현재 단어의 첫 글자로 먼저 이동한다는 것이다. 현재 단어의 첫 글자에 위치한 다음에야 비로소 이전 단어의 첫 글자로 이동한다. 즉, b 키와 e 키를 번갈아 누른다면 커서는 커서가 위치한 단어의 첫 글자와 끝 글자를 왔다갔다 할 것이다.

Vim 의 이전 단어의 시작 글자로 이동하기 b 와 B

이전 단어의 끝 글자로 이동

  • ge 키로 맥락상(?) 커서가 위치한 단어의 이전 단어의 끝 글자로 이동한다.
  • gE 키로 공백기준으로 커서가 위치한 단어의 이전 단어의 끝 글자로 이동한다.

g 는 독립적인 명령어가 아니고, g 이후에 추가로 키를 입력해야 비로소 의미를 갖는다. Vim 에서는 키보드의 각 입력에 모든 명령을 할당할 수 없었기에 확장된 명령어는 g 키와 조합하여 수행하게 설계되어있다. 이전에 살펴보았던 gg 도 동일한 맥락이라고 볼 수 있겠다.

 

e, E 가 다음 단어의 끝으로 이동하라는 의미였다면, ge, gE 는 그 반대의 의미를 갖는다. 

Vim 이전 단어의 끝 글자로 이동하기 ge, gE

Vim Cheat Sheet 에서 커서 이동 살펴보기

Vim Cheat Sheet (출처를 알 수 없어 표기하지 못했다. 혹시 알고 있다면 코멘트를 부탁한다. 오른쪽 화살표 옆 url 은 유효하지 않았다.)

Google 에서 Vim Cheat Sheet 를 검색하면 여러 vim cheet sheet 들을 볼 수 있는데, 위 cheet sheet 가 vim 의 커서 이동에 관해서 가장 잘 시각화 되어있다. 강조되어있다는 것은 제작자가 그만큼 중요하고 유용하다고 판단해서였을 것이다. 이걸 보는 당신은 아직 위 cheat sheet 에 나와있는 모든 내용을 파악할 필요가 없다. (그랬다간, vim 익히기를 포기하게 되는 지름길을 걷게 되는 수가 있다.)

 

우리가 이 cheet sheet 에서 지금 당장 뽑아낼 것은, 좌측 상단 회색음영으로 된 큰 상하좌우 화살표이다. 화살표의 방향은 실제로 그 방향으로 움직이는 것을 의미하고, (좌우 - 단어단위, 상하 - 줄단위) 중심에서 가까울수록 작은 이동, 멀어질 수록 많은 이동을 의미한다. 이렇게 시각화한 원작자의 아이디어에 경의를 표한다.

 

이번 포스팅에서 살펴보았던 이동키들을 위 아이디어를 따라 다시 정리해보면 다음과 같다. 

Vim Normal Mode Movement: Vim Normal Mode 에서 커서를 이동하는 다양한 방법

 


이번에는 Vim Normal 모드에서 커서를 이동시키는 다양한 방법을 알아보았다.

사실, 커서를 이동하는 방법은 이 외에도 몇가지가 더 있다. 가령, 특정 문자로 이동하다든가, 찾기 기능을 활용해서 이동하다든가 하는 기능들이 더 있다. 이는 별도의 포스팅에서 다룰 예정이다.

 

적어도, 여기서 소개한 노멀모드 커서 이동 명령들은 매우 자주 사용되기 때문에 반드시 익혀두어야 한다. 

 

다음 포스팅에서는 Normal 모드에서 Insert 모드로 집인하는 방법과 함께 문서에 원하는 문자열을 입력하는 방법을 다뤄보도록 하자.

반응형

Designed by JB FACTORY