cleanUrl: /programming/why-xcode-supports-vim

Xcode13에서 제가 가장 반긴 신기능은 뭐니뭐니해도 Vim모드 지원입니다. 이 Vim모드란 무엇이고, 왜 사용하는지에 대해 정리해보겠습니다.

Vim이 뭐야?

먼저 Vim이 무엇인지 아예 모르는 분들을 위해 간단히 Vim이 무엇인지 설명드리겠습니다. Vim이란 VI improved의 준말로, “향상된 VI”를 뜻합니다. 그럼 VI는 무엇일까요? VI는 Visual Interface의 약자로, 옛날 GUI기반의 에디터가 없던 시절, CLI 환경에서 그나마 Visual하게 텍스트를 편집 할 수 있도록 만든 프로그램입니다. 한 마디로, “옛날 옛적 컴퓨터에서 쓰이던 텍스트 편집기”란 뜻이죠.

Vim을 갑자기 왜 쓰는거야?

옛날 옛적 CLI환경에서 쓰이던 편집기를 왜 이제와서 다시 Xcode에 집어넣게 된 것일까요? 그 이유를 알려면 VI의 이름을 다시 한 번 뜯어봐야 합니다. VI는 엄밀히 말하면 Interface 입니다. 즉 구체적인 편집기를 말한다기 보다는, 그 편집기가 지원해야 할 기능의 명세라고도 할 수 있습니다. 즉 어떤 편집기도 VI를 지원 할 수 있으며, 실제로 지금까지 Xcode를 제외한 대부분의 IDE들이 기본적으로, 또는 플러그인등을 통해 VI를 지원하고 있었습니다.

그 말인즉슨, 여러 종류의 IDE들을 사용하더라도, VI를 통해 각 IDE를 사용한다면, 각 IDE에 특화된 많은 단축어들을 따로따로 알지 못하더라도, VI에서 지원하는 수많은 조합의 강력한 단축어나 명령어들을 즉각적으로 사용할 수 있다는 것을 뜻합니다. 그러니까 여러분이 VI를 지원하는 SublimeText로 React개발을 하다가, 어느 날 갑자기 안드로이드 개발을 해보고 싶게 되었을 때, “Android Studio에서는 검색 및 치환을 어떻게 하지?” 라는 질문을 할 필요가 없다는 뜻입니다.

여태까지는 이 생태계에서 Xcode는 제외되어 있었습니다. 물론 커뮤니티에서 제작한 XVim 을 활용하는 방법이 없진 않았지만 설치하기가 쉽지 않았고, 또 언제든 Xcode의 구현에 따라 지원이 중단될 수 있다는 불안감을 느껴야만 했습니다. 이제 Xcode가 공식적으로 VI를 지원하게 되었으므로, VI기반으로 IDE를 사용하던 다른 많은 개발자분들이 더 편하게 iOS개발에 뛰어들 수 있음은 물론, 거꾸로 VI기반으로 iOS개발을 익히신 경우, 추후 다른 플랫폼 개발에 좀 더 쉽게 접근 할 수 있게 되는 길이 열리게 된 것입니다.

Vim은 어떻게 쓰는거야?

Xcode에서 Vim을 쓰기 위해선, Editor메뉴에서 Vim Mode를 찾아 클릭하시면 됩니다. 찾기 어렵다면 Help메뉴에서 Vim을 검색하면 쉽게 찾으실 수 있을겁니다.

https://i2.wp.com/sungdoo.dev/wp-content/uploads/2021/08/E18489E185B3E1848FE185B3E18485E185B5E186ABE18489E185A3E186BA202021-08-2220E1848BE185A9E18492E185AE208.41.03.png?resize=1024%2C723&ssl=1

Vim이 처음이시라면, 아마 처음에 당황하실 겁니다. 커서가 두꺼워지고, 무슨 키를 눌러도 아무것도 입력되지 않을테니까요. 기본적으로 이 상태를 VI에서는 “노말모드”라고 합니다. 이 상태에서는 주로 커서를 옮기거나, 문자열을 찾거나 기존 입력된 텍스트를 가공하는 일들을 하게 됩니다. 평범한 “입력(Insertion)모드”로 가기 위해서는, 노말모드 상태에서 “i” 키(insert의 첫글자)를 누르면 됩니다. 이 상태에서 다시 노말모드로 돌아가기 위해선 esc키를 누르면 됩니다.

현재 내가 어떤 모드에 있는지는, 커서의 굵기를 통해서도 알 수 있고, VI상태바의 표시를 통해서도 알 수 있습니다.

Vim이 왜 강력한가

여기까지 읽었을 때는, 도대체 Vim이 왜 좋다고 하는건지 이해하기 어려울 수 있습니다. 하지만 아마 https://www.openvim.com 등의 튜토리얼등을 진행하시면 금방 왜 Vim이 텍스트 편집의 생산성을 급격히 올려주는지 이해하실 수 있을 겁니다. 이 글에서는 여러분이 이 튜토리얼을 진행하실만한 동기부여가 될 수 있도록 제가 자주 쓰는 기능 몇 가지를 알려드리도록 하겠습니다.

  1. di{Vim의 명령어들은 “조합” 할 수 있다는 점이 큰 특징입니다. 이 명령어의 경우, delete를 뜻하는 d명령어와, “in”을 뜻하는 i, 그리고 in 명령어의 대상이 되는 “{” 기호의 조합으로 이루어져 있습니다. 의미를 풀자면 “delete everything i{ to }” 가 되겠습니다.

화면-기록-2021-08-22-오후-8.59.06.mov

이것을 응용하여 di" 와 같이 사용하여 따옴표 안에 있는 문자열들을 모두 지우는 명령어로 쓸 수도 있고, yi[ 와 같이 사용하여 대괄호로 묶여진 내용 안의 내용을 모두 복사하라는 명령어로 쓸 수도 있습니다.

2. yy / dd / p

y 명령어는 yank의 약자로, “복사”한다는 뜻입니다. d 명령어는 delete의 약자로, “삭제”한다는 뜻입니다만, 실질적으로는 “잘라내기”에 가깝습니다. 이렇게 복사, 또는 “잘라낸” 내용은 p(paste) 명령어로 붙여넣기 할 수 있습니다. 여기까지는 cmd+c/v 와 다를 것이 크게 없죠? VI는 여기서 한 발 더 나가 이런 명령어들이 연달아 쓰이면 해당 명령어를 “한 줄 단위”로 실행하게 됩니다. yy를 실행하면 한 줄 전체가 복사되고, dd를 실행하면 한 줄 전체가 잘라내지는 식이죠.