기본적인 Vim 사용법

Sch·2022년 12월 5일

VIM은 VIsual editor iMproved로, VI(VIsual editor)를 업데이트한 것이다. VIM의 업데이트 다른 버전으로 NVIM(Neo VIM)이 있다.

VI는 1976년에 개발되었으며, 마우스를 사용하지 않고 키보드만을 사용하여 문서를 편집하는 것이 특징이다.

Vim은 CLI 환경에서 동작하는 파일 편집이기이기 때문에, SSH와 같이 GUI를 활용할 수 없는 특수한 상황에서 파일을 편집해야 할 때에 효과적으로 사용될 수 있다. 참고로 나는 SSH에서 작업을 할 때에 tmux라는 프로그램과 함께 사용하는데, tmux와 vim의 조합은 모든 CLI 환경을 상당히 괜찮은 개발 환경으로 만들어준다.

이 문서 (그리고 공식 vim 튜토리얼 문서)에서

  • <Esc>Escape
  • <C-…>Ctrl, Control 키와 함께 누른 것
  • <lt><

을 의미한다.

저장과 종료

MacOS, UNIX 기반 운영체제에는 대부분 vim과 vi가 이미 깔려있다. 따라서 터미널에서 바로 vim을 사용할 수 있다.

보통 vim을 사용할 때에는 편집할 파일이 있는 디렉토리로 이동(cd)한 다음, vim <filename>과 같은 형식의 명령어를 사용해서 편집을 시작한다.

Vim에는 작업 모드라고 하는 것이 있어서, 파일을 탐색할지 파일의 일부분을 선택할지, 아니면 키보드로 누르는 키를 파일에 입력할지 등을 작업 모드에 따라서 수행한다. 기본적으로 vim을 실행했을 때 사용하는 모드는 NORMAL 모드로, NORMAL 모드에서는 파일을 탐색하거나 명령어를 입력하는 등의 작업이 가능하다.

Vim의 명령어는 콜론:으로 시작한다.

파일을 저장하려면 :w [filename] 명령어를 사용한다. 이때 filename 부분은 입력할 수도, 입력하지 않을 수도 있는데, 입력하지 않으면 현재 열려있는 파일에다가 내용을 저장하고, 파일 이름을 입력하면 그 위치에 있는 파일에 내용을 저장한다.

Vim을 종료하려면 :q 명령어를 사용한다. 이때, 파일에 변경사항이 있고 해당 변경사항이 저장되지 않았다면 :q를 사용할 수 없다. 이러한 경우에는 :w를 통해 파일에 변경 사항을 저장하고 다시 :q를 시도하거나, :q!를 통해 파일을 저장하지 않고 종료할 수 있다.

:w와 :q를 함께 하여, 저장하고 종료를 할 수도 있다. :wq 명령어를 입력하면 된다.

INSERT 모드

파일에 내용을 작성하기 위해서는 작업 모드를 INSERT 모드로 변경해야 한다. 여기에는 여러가지 방법이 있는데, 가장 많이 쓰이는 방법이 바로 i 키를 누르는 것이다.

i 키를 누르면 현재 커서가 있는 곳에서 커서가 가리키는 문자 앞에 문자열을 입력할 수 있게 된다.

INSERT 모드에서 NORMAL 모드로 돌아가기 위해서는 Escape 키를 누른다. 참고로, 어떤 모드에서든지 Escape 키를 누르면 NORMAL 모드로 돌아갈 수 있기 때문에, 현재 어떤 작업을 하다가 해당 작업을 취소하고 싶다면 Escape 키를 누르면 된다.

a키를 누르면 현재 커서가 있는 곳에서 커서가 가리키는 문자 뒤에 문자열을 입력할 수 있게 된다.

o 키를 누르면 현재 커서가 있는 행 다음 행에 문자열을 입력할 수 있다.

Vim에서 소문자로 작업을 수행하는 것과 대문자로 작업을 수행하는 것에도 차이가 있다. 대문자로 작업을 수행하면 작업이 반대로 수행되거나, 의미가 강조되어 실행된다.

예를 들어, I를 사용하면 현재 커서가 있는 행에서 공백을 제외한 행의 가장 처음 부분으로 커서를 이동한 후에 INSERT 모드에 진입하며 (^i와 동일), A를 사용하면 반대로 행 맨 마지막으로 이동하여 INSERT 모드에 진입한다 ($a와 동일).

O 키를 누르면 현재 커서가 있는 행의 이전 행에 문자열을 입력할 수 있다.

이동

문서에서 커서를 이동하는 방법도 여러가지가 있다.

가장 간단한 방법은 hjkl 키를 이용하는 것이다. hl키는 각각 왼쪽, 오른쪽으로 커서를 이동하고, jk키는 각각 아래, 위로 커서를 이동한다.

여기까지 공부한다면 사실상 모든 문서 편집기에서 할 수 있는 작업을 vim에서 할 수 있다. 이 다음부터는 작업 효율을 높이기 위한 방법들이다.

0키를 누르면 행의 가장 처음으로 커서를 이동할 수 있고, ^키를 누르면 행의 가장 처음 공백이 아닌 문자로 이동할 수 있고, $키를 누르면 행의 가장 마지막으로 이동할 수 있다. Vim에서는 word라는 문자열 단위와 WORD라고 하는 문자열 단위가 있는데, word는 구두점, 띄어쓰기, 문장 부호 등으로 나누어진 문자열을 말하고, WORD는 띄어쓰기로 나누어진 문자열을 말한다.

예를 들어서, 다음 문자열에서 word로 표시된 곳은 word의 시작부분들을 말하고, WORD로 표시된 곳은 WORD의 시작부분을 말한다.

      Hello, world! "This" is a/an (example) sentence.
word: ^    ^ ^    ^ ^^   ^ ^  ^^^  ^^      ^ ^       ^
WORD: ^      ^      ^      ^  ^    ^         ^

커서가 있는 곳에서 다음 word의 시작부분으로 이동하고 싶다면 w를 누른다. 반대로, 이전 word의 시작부분으로 이동하고 싶다면 b를 누른다. word의 마지막 부분으로 이동하는 것도 가능한데, 이때는 e를 누른다.

wbe를 대문자로 수행하면 word 단위로 실행되던 명령들을 WORD 단위로 수행할 수 있다.

이동하는 작업을 수행하기 전에 수를 입력하면, 그 수에 해당하는 만큼 이동하는 작업을 수행한다. 예를 들어, 4j라고 하면 4행 후로 커서를 이동한다.

f 키를 입력하고 그 뒤에 문자를 입력하면, 그 행에서 커서 뒤에 해당 문자가 등장하는 곳까지 커서를 이동한다. 반대로, F 키를 입력하면 커서 앞으로 문자를 이동한다.

t 키를 입력하면 f와 비슷하게 동작하나, 문자 바로 전까지 커서를 이동한다. T는 반대로, 앞으로 이동하되 문자 바로 뒤까지 커서를 이동한다.

gg를 입력하면 문서의 가장 처음으로 이동하고, G를 입력하면 문서의 가장 마지막으로 이동한다. 이때 ggG의 앞에 수를 입력하면 그 수에 해당하는 행으로 이동할 수 있다.

10%와 같이 퍼센트 수치를 입력하면 문서 전체 길이의 해당 수치에 해당하는 부분으로 커서를 이동한다. 이때, 소수점은 입력할 수 없다.

삭제와 대치

d 키를 누르면 NORMAL 모드에서도 문자열을 지울 수 있다. d 키를 누른 후에는 바로 문자가 지워지지 않고, 어디까지 이동할지 입력해주어야 하는데, 이때 이동하는 곳까지를 포함하여 문자열을 지운다.

예를 들어서 dj라고 입력하면 이번 행과 이 다음 행을 지우고, d$라고 입력하면 커서가 있는 곳에서 행이 끝나는 곳까지를 지운다.

현재 행을 지우기 위해서는 dd라고 입력하고, D라고 입력하면 d$와 같은 작업을 수행한다.

c도 d와 비슷한 작업을 수행하는데, c의 경우에는 문자열을 지운 후에 INSERT 모드가 시작된다.

x 키를 누르면 하나의 문자만을 지울 수 있고 (dl과 같음), r 키를 누르면 하나의 문자를 변경할 수 있다. X를 입력하면 커서 앞에 있는 문자 하나를 삭제하고, R을 입력하면 Insert키를 누른 것과 같이 여러 문자를 변경할 수 있다.

s를 입력하면 xi를 누른 것과 같이 현재 문자를 지우고 그 자리에서 INSERT 모드에 접근한다. S를 입력하면 0C 또는 ddO를 입력한 것처럼, 현재 열의 모든 내용을 지우고 INSERT 모드에 접근한다.

u를 입력하면 방금 진행한 작업을 취소할 수 있고, <C-r>을 입력하면 작업 취소를 취소할 수 있다.

VISUAL 모드

VISUAL 모드에서는 문서의 특정 부분을 선택할 수 있다. 보통 VISUAL 모드는 그 자체로 사용되지 않고 작업 키와 더불어 사용되는데, 문서의 특정 부분을 선택하는 것이 가능하기 때문에 복사를 하거나 잘라낼 때에 사용하는 경우가 많다.

NORMAL 모드에서 v 키를 누르면 VISUAL 모드에 진입한다. 이 상태에서 커서를 다른 곳으로 이동하면 v 키를 누른 곳에서부터 커서가 있는 곳까지가 강조되어 화면에 표시된다. 이 상태에서 v키를 한 번 더 누르면 VISUAL 모드에서 NORMAL 모드로 돌아갈 수 있다.

d, c와 같은 명령들은 이동 명령과 함께 사용된다. 하지만 VISUAL 모드에서 이러한 명령을 시작한다면 이동 과정을 건너뛰고 VISUAL 모드에서 선택되어있는 문자열을 대상으로 작업을 수행할 수 있다.

V는 선택을 행별로 할 수 있게 한다. d2k 명령과 Vkkd 명령은 동일한 결과를 가진다.

복사와 붙여넣기

Vim에서도 복사와 붙여넣기 기능을 사용할 수 있다. y를 누르면 커서가 있는 곳이 복사를 시작할 곳(혹은 끝나는 곳)이 되며, 이 상태에서 이동 명령을 수행하면 복사가 수행된다. 이때, nvim의 경우 복사가 종료되는 곳으로 커서가 이동된다.

Y를 누르면 추가적인 동작이 실행되지 않고, 현재 커서가 있는 행의 모든 내용을 복사한다. 이때, 행 마지막에 있는 줄바꿈 문자는 복사하지 않는다. 하지만 yy를 누르면 커서가 있는 행의 모든 내용을 복사하는데, 이때 행 마지막에 있는 줄바꿈 문자까지 복사한다.

p를 누르면 현재 커서가 있는 곳 뒤에 복사한 내용을 붙여넣기할 수 있다. 이때, 한 줄을 다 복사한 경우 커서가 있는 행 다음 행부터 복사한 내용을 붙여넣기한다.

P를 누르면 커서가 있는 곳 앞에 복사한 내용을 붙여넣기한다. 이는 p와 비슷하게 작용한다.

Vim에서도 잘라내기 기능을 사용할 수 있는데, 잘라내기라는 이름으로 존재하지는 않는다. Vim에서는 텍스트를 삭제하면 그것이 클립보드에 저장되어 바로 붙여넣을 수 있게 되기 때문이다. 즉, 이전에 알아본 dx와 같은 동작들을 수행하면 p, P를 사용하여 붙여넣기할 수 있다는 것이다.

Vim에서는 한 번에 두 가지 클립보드를 사용할 수 있다. 예를 들어, yw라는 명령어는 사실 *라는 클립보드(레지스터)에 복사하는 것이다. 이때, 사용하는 클립보드는 "<clipboard>y와 같은 형태로 지정하는데, 따라서 yw라는 명령어는 "*y와 같은 의미이고, 이는 “* 레지스터에 다음 단어의 시작까지의 내용을 복사하겠다”라는 의미가 된다. 클립보드에는 +도 사용할 수 있는데, 이는 실제로 운영체제에서 사용하는 클립보드 영역에 복사하겠다는 의미이다. 따라서 "+y는 실제 클립보드에 내용을 복사한다.

이를 통해서 문서 전체의 내용을 운영체제 클립보드에 복사할 수도 있는데, 이는 gg"+yG로 수행한다. 이는 gg 부분과 "+yG 부분으로 나누어지는데, 전자는 문서의 가장 처음 부분으로 이동하는 것이고, 후자는 커서가 있는 곳부터 문서의 마지막까지를 클립보드에 복사하는 것이다.

p를 사용하여 붙여넣기를 할 때에도 레지스터를 선택할 수 있다. y하는 것과 마찬가지로, "+p와 같은 형태로 수행한다.

화면 이동

<C-e><C-y>를 사용하여 커서를 이동하지 않고 탐색하는 문서의 부분을 아래, 위로 움직일 수 있다.

<C-d><C-u>를 사용하면 탐색하는 문서의 부분을 반 페이지씩 아래, 위로 움직일 수 있다.

매크로

q를 사용하면 특정 작업을 기록해두었다가 나중에 똑같이 다시 사용할 수 있다. q 바로 뒤에는 한 글자로 작업을 기록할 레지스터의 이름이 오는데, 보통은 레지스터의 이름으로도 q 또는 a를 사용하는데 이것은 필수적인 것은 아니다.

qaqq 등을 사용하여 작업을 기록하기 시작했다면, 그 상태에서 vim에서 사용하는 모든 작업이 레지스터에 기록되게 된다. 이후에 NORMAL 모드에서 q를 누르면 녹화를 종료한다.

이후에, 녹화한 매크로를 사용하고 싶다면 @q 혹은 @a와 같이 @와 레지스터의 이름을 함께 사용하여 매크로를 재생한다. @도 vim 작업이기 때문에 앞에 숫자를 써넣어 여러번 실행할 수도 있다.

실제로는 다음과 같이 활용할 수 있다. 예를 들어, 다음 문서가 있다고 해보자.

hello
world
mhaha
evandi

이러한 내용을 가진 문서에서, 현재 커서는 hello의 가장 첫 부분에 위치해있다. 여기서 qqye0iself.<Esc>A = <Esc>pj0q3@q를 입력하면 내용을 다음과 같이 수정할 수 있다.

self.hello = hello
self.world = world
self.mhaha = mhaha
self.evandi = evandi

이 명령은 qq, ye, 0, iself.<Esc>, A = <Esc>, p, j0, q, 3@q로 나누어지는데, 각각은 다음과 같은 동작을 수행한다.

  • qq - q 레지스터에 동작 기록을 시작한다.
  • ye - 현재 커서가 있는 곳에서 단어가 끝나는 곳까지를 (* 레지스터에) 복사한다.
  • 0 - 현재 행의 처음 부분으로 커서를 이동시킨다.
    • 이것은 nvim의 경우에는 필요하지만, vim의 경우에는 필요하지 않다.
  • iself.<Esc> - 현재 커서가 있는 위치에 self.라고 적는다.
  • A = <Esc> - 현재 커서가 있는 행의 마지막에 = 문자열을 추가한다.
  • p - 현재 커서가 있는 곳 바로 뒤에 (*) 레지스터에 있는 내용을 붙여넣는다.
  • j0 - 커서를 다음 줄 처음 부분으로 이동시킨다.
  • q - 레지스터에 동작 기록을 종료한다.
  • 3@q - q 레지스터에 있는 동작을 3번 (더) 반복한다.

창 분할

Vim에서, 하나의 화면에 여러 개의 파일을 동시에 켜 놓고 이동하며 작업하는 것도 가능하다. <C-w>를 사용하여 하는 동작들이 창 분할을 가능하게 한다.

<C-w>v를 사용하면 현재 창이 좌/우로, 즉 세로로 분할된다. 또한 <C-w>s를 사용하면 현재 창이 상/하로, 즉 가로로 분할된다.

<C-w>와 함께 h, j, k, l을 사용하여 분할된 탐색 사이를 이동할 수 있다.

:q 명령어를 사용하거나 <C-w>q 작업을 사용하여 현재 커서가 있는 분할창을 닫을 수 있다.

창의 크기를 변경하는 것도 가능하다. <C-w><lt>를 입력하면 현재 커서가 있는 분할창의 가로 폭을 한 문자 작게 만들고, <C-w>>를 입력하면 반대로 커서가 있는 분할창의 가로 폭을 한 문자 크게 만든다. <C-w>-를 입력하면 현재 커서가 있는 분할창의 세로 높이를 한 문자 작게 만들고, <C-w>+를 입력하면 반대로 커서가 있는 분할창의 세로 높이를 한 문자 크게 만든다.

<C-w>=를 입력하면 열려있는 모든 창의 크기를 기본값으로 설정한다.

<C-w>H, J, K, L을 활용하면 현재 커서가 있는 분할창의 위치를 해당 방향으로 변경할 수 있다.

Vim을 종료할 때에 사용하는 :q 명령어는 분할창을 종료할 때 사용되기 때문에, 화면에 분할 창이 여럿 열려있다면 :q를 여러번 수행해야 한다. 이때에는 :qa를 사용하여 열려있는 모든 분할창을 한번에 종료할 수 있다. :wq의 경우에도, :wqa를 사용하면 열려있는 모든 분할창을 한번에 저장하고 종료할 수 있다.

ZZ를 입력하면 :wqa 명령어를 쓴 것과 같은 효과이다.

분할창에서 특정한 파일을 수정하려고 하는 경우에는 :e [filename] 명령어를 사용한다.

Vim에서 창 분할 말고도 탭을 사용할 수 있다. :tabnew [filename] 명령어를 사용해서 새로운 탭을 열 수 있다.

탭은 탭에 열려있는 모든 분할창이 종료되었을 때 같이 종료된다.

:wqaZZ는 모든 탭에 대해서 작업을 수행하기 때문에, 열려있는 탭이 여러가지라면 열려있는 모든 탭에 대한 분할창에 대해서 :wq를 실행한다.

탐색과 대치

Vim에서도 다른 문서 편집기와 같이 검색 기능을 사용할 수 있다. 단 vim에서는 vimregex(vim regular experssion)라는 것을 사용하여 문자열을 검색한다. vimregex는 기본적으로 regex와 동일하다고 생각하면 되고, regex에 대해서 모르는 경우에는 입력하는 문자열을 그대로 검색한다고 생각해도 어느 정도는 맞다.

NORMAL 모드에서 /를 입력하면 vimregex를 입력할 수 있는 상태가 된다. 이 상태에서 검색할 문자열을 입력하면 전체 문서에서 해당 문자열 부분이 모두 강조된다.

문자열이 강조된 상태에서 강조된 문자열 사이를 이동할 때에는 n, N을 사용한다. 전자는 뒤에 있는 문자열을, 후자는 보다 앞에 있는 문자열로 이동하는 데에 사용된다.

.vimrc와 vim 명령어

Vim에서는 편집에 사용하는 여러가지 인수를 설정할 수 있다. 예를 들어서, :set nu 명령어를 사용하면 코드 왼쪽에 행 번호가 표시되고, :set so=5를 사용하면 화면 위/아래 5줄 이전/이후까지를 언제나 표시하도록 설정한다. 이러한 명령어는 vim을 재시작하면 모두 초기화되는데, 따라서 vim을 실행할 때마다 이러한 명령어가 실행될 수 있도록 명령어 목록을 모아놓는 파일이 있다. 보통은 ~ 디렉토리에 .vimrc라는 파일로 작성된다.

profile
https://me.shtelo.org/

0개의 댓글