vim 입문 말고 이해해 보기 (한 글자 명령 위주로)

제가 vim 쓰면서 이해한 매커니즘을 정리해보려고 합니다. 단축키는 잘 알겠는데 복잡한 동작은 못하겠어서 자꾸 비주얼 모드로 선택하는 분들은 유용할 거예요.

일단 저는 비주얼 모드(v)는 근본 없다고 생각합니다. 이게 꼭 필요할 때도 있는데, 이게 어지간한 기능을 다 대체할 수 있어서 효율로 가는 길을 막아요. vim이 효율적인 건 효율적이지 않게 못하기 때문이라고 생각하거든요. 그래서 이후 설명에도 비주얼 모드는 최대한 배제하겠습니다.

단축키

입문할 때는 방향키 있고 기능 있고 이렇게 이해를 하시고 외우면 편하긴 한데 사실 그렇지 않습니다. vim의 모든 동작은 단축키고, 이 단축키는 기능에 따라서 연결1이 됩니다.

우선 모든 것이 단축키라는 것부터 설명드리겠습니다. 이동을 담당하는 HJKL도 사실 단축키입니다. 이게 단축키인지 아닌지가 왜 중요하냐면 조합에 쓰이기 때문입니다.

구성은 이렇게 됩니다. 종류에 따라 생략이 가능합니다.

(생략할 수 있습니다.)

vim은 정보를 어딘가에 저장할 수 있습니다. 이거 없어도 복사가 되는데요, 이건 임시 레지스터에 저장되는 거예요. vim의 모든 삭제 동작에는 복사가 포함됩니다. 그냥 삭제는 없고 전부 잘라내기예요. 그래서 뭔가 복사하고 옮기는 과정 중간에 뭔가를 삭제하게 되면 복사해 놓은게 날라갑니다.

그래서 레지스터가 필요합니다. "(쌍따옴표)로 시작하고 그 뒤에 어디에 저장할지 고릅니다. 이 '어디'는 알파벳 전부 될 수 있어요. 대소문자 구분은 안 되는 거 같습니다. 번외로 + 레지스터가 있는데요 이건 클립보드입니다. 외부로 복사하거나 외부에서 복사한 걸 가지고 올 때 써요.

"+

클립보드를 지정하려면 저런 형태가 될 거예요.

(생략할 수 있습니다.)

몇 번 반복할지 정합니다.

근데 복사 결과는 합쳐집니다. 예를 들어 2yy는 두 줄을 복사합니다. 반복이라고 덮어씌워지지는 않습니다.

입력 계열을 반복하면 반성문 쓸 때 펜 여러 개로 썼던 경험처럼 같은 입력이 동시에 여러 개 됩니다.

동작입니다. 글자는 딱 하나입니다. 쉬프트나 컨트롤이 첨가될 수는 있겠으나 여러 글자는 아닙니다.

어라? 근데 명령어 목록에서는 dd, dw 이런 거 알려 주던데요? 그 뒷 부분은 바로 뒤에 나올 범위에 속합니다.

그러니까 첫 글자가 같은데 뒷 글자로 아주 다른 동작이 되는 상황은 없습니다. 제가 아는 선에서는요. 그러니 이제부터 명령어 찾아보실 때는 첫 글자만 본체라고 보시면 되겠습니다.

여기가 핵심입니다. 범위는 이동 명령으로 정해집니다. 처음에 HJKL도 명령이라고 했던 거 기억나시나요? 여기서 쓰입니다.

대표적인 이동 명령은 HJKL, w, b, f 같은 것이 있습니다. 지금 확인해 보니까 컨트롤 쓰는 이동은 안 되네요.

중요한데요, 이거 반복도 할 수 있습니다.

이건 예시를 좀 여러 개 드리겠습니다. 범위만 보여드리면 헷갈릴 수 있어서 앞 명령까지 보여드릴게요.

마지막이 괴랄한데요, 한 줄 안에서 역방향으로 이동하는 경우에는 커서 전부터 시작인 것 같더라고요. 그래서 좀 헷갈립니다.

같은 명령 따닥 하면 그 한 줄을 지정할 수 있습니다. JK로 한 줄만 선택할 수 없는 게 이유인지 순서가 반대인지는 모르겠네요. 그래서 위의 5k가 6줄을 선택합니다. 커서가 5번 올라가니까요.

최대한 복잡하게 다 합쳐서 해 볼까요?

"a3d3fb

"레지스터 a에 현재 커서로부터 뒤에 있는 3번째 b까지 삭제하는 명령을 3번 반복한다"가 되겠네요. 근데 사실 이럴 필요 없어요. 그냥 "ad6fb하세요.

명령 모드

:(콜론)을 쓰면 명령 모드로 들어가서 더욱 구체적인 명령을 입력할 수 있게 됩니다. 정말 다양한 명령들이 있지만 오늘 그건 다루지 않을 거예요. 단축키를 명령줄에서 활용하는 법을 다룹니다.

네. 단축키는 명령줄에서 그대로 쓸 수 있습니다. 이동 관련 빼고요. w가 저장인 것만 봐도 그렇습니다.

같은 키로 입력하는 거면 명령 모드로 입력해야 할 이유가 있을까요? 네. 명령 모드에서는 줄번호를 활용할 수 있습니다.

구성은 이렇게 됩니다.

범위

명령에 따라 쓰지 않을 수도 있습니다.

[시작 줄번호],[끝 줄번호]

이런 형태가 됩니다.

또 실제 번호 대신 여러 기호를 쓸 수 있어요.

이런 게 있습니다. 거기다가 숫자를 더하거나 뺄 수도 있어요. 예를 들어 .+3는 커서가 있는 줄의 3번째 아래 줄을 뜻합니다. 이건 //에도 할 수 있어요. 다만 이거 혼자서 범위를 지정하지는 못해서 꼭 시작과 끝을 적어 줘야 합니다.

명령

보통 한 글자입니다. 단축키랑 같아요. 단축키에 없는 명령들도 있는데, 그건 찾아보시기 바랍니다.

입력

명령에 필요한 인자가 있다면 입력합니다. 예를 들어 문자열을 바꾸는 s 명령의 경우, 이 자리에 찾을 문자열과 바꿀 문자열을 넣습니다.

레지스터

복사의 경우 저장할 레지스터를 입력할 수 있습니다. 대신 "(따옴표)는 입력하지 않습니다. 대신 띄어쓰기가 한 칸 있습니다.

다 합쳐서

:12,/target/-3y +

이러면 "12번 줄부터 target이란 문자열이 포함된 줄의 3줄 위의 줄까지 클립보드 레지스터에 복사한다"가 될 거예요.

마무리

이 정도만 알고 계셔도 비주얼 모드는 거의 사용하지 않으실 거예요. 저도 습관적으로 튀어나오는 경우는 있지만 어쩔 수 없이 쓰는 경우는 거의 없어요. 더 심화로 가면 막 복잡한 명령 만들고 매크로 만들고 하는데, 그 정도까지는 제가 아직 몰라서 여기서 마치겠습니다.

🏠📑