16 Vim 심화 - Surround

Vim 생태계에는 surround 라는 플러그인이 존재한다. 이는 vim 에서 괄호를 컨트롤할 수 있는 강력한 기능을 제공한다.

https://github.com/tpope/vim-surround

 

GitHub - tpope/vim-surround: surround.vim: Delete/change/add parentheses/quotes/XML-tags/much more with ease

surround.vim: Delete/change/add parentheses/quotes/XML-tags/much more with ease - GitHub - tpope/vim-surround: surround.vim: Delete/change/add parentheses/quotes/XML-tags/much more with ease

github.com

위 링크를 통해서 사실상 surround 플러그인 설치법, 사용법을 모두 익힐 수 있다.

 

Vim Plugin Surround

surround 는 vim 의 유명한 플러그인 중의 하나이다. VSCode Extension 인 Vim 에서는 surround 를 기본 플러그인으로 제공하고 있을정도로 유명한 플러그인이다. 

surround 적용하기

웬만한 IDE 의 Vim Extension 은 surround 를 기본 플러그인으로 탑재하고 있다. 다만, 활성되지 않은 상태로 존재하는데, surround 를 활성화시키는 방법은 다음과 같다. (상술했듯이, VSCode 에서는 이 명령 없이도 기본적으로 surround 가 활성화되어있다.)

:set surround

다만, 이렇게 surround 를 활성시키는 경우 IDE 또는 Vim 을 실행시킬 때마다 해당 명령을 입력해주어야 한다는 것인데,  vimrc(vim 설정 파일) 파일에 surround 플러그인이 항상 활성화되도록 지정할 수도 있다. 운영체제, IDE 별로 설정법이 다르므로 이에 대한 자세한 설명은 다음 글을 참조하도록 하자. https://github.com/johngrib/simple_vim_guide/blob/master/md/vimrc.md

 

GitHub - johngrib/simple_vim_guide: simple vim guide

simple vim guide. Contribute to johngrib/simple_vim_guide development by creating an account on GitHub.

github.com

surround 로 할 수 있는 일

먼저 surround 의 의미대로 '감싸는'대상은 surround 플러그인의 제어 대상이다.

 

surround 의 제어 대상

  • 괄호 (, {, [, ], }, )
  • 따옴표 ', ", `
  • 태그 <any>

 

먼저, surround 플러그인으로 어떤 동작을 수행할 수 있는지 알아보는게 순서일 것 같다. surround 를 활용해서 다음과 같은 일들을 수행할 수 있다. 

 

surround 로 할 수 있는 일 (surround 는 surround 의 제어 대상(위)을 의미한다.)

  • `ys{모션}{씌울 surround}` - surround 씌우기
    💡 이 동작은 visual 모드로부터 `S` 명령어로도 진입이 가능하다.
  • `ds{지울 surround}` - surround 지우기
  • `cs{모션}` - surround 변경

Vim Surround with GIF

surround 의 github 페이지에 모든 내용이 축약되어있으므로, 여기서 surround 의 기능을 상세히 소개하기보다, gif 스크린샷으로 어떤 일들을 할 수 있는지 간략히 살펴보도록 하자.

ys - surround 씌우기

`ys{모션}{surround}` 명령어로 대상을 지정한 surround 로 감쌀 수 있다. 닫히는 괄호를 사용하면, 괄호 안쪽에 공백이 포함되지 않는다.

ys3w)

vim surround - surround with closing bracket: ys3w

열리는 괄호를 활용하면 괄호와 감싸는 대상 사이에 공백이 포함된다.

ys3w(

vim surround - surround with opening bracket: ys3w(

필자는 자주 사용하는 기능은 아니지만, 태그를 씌울 수도 있다. 속성을 함께 기입하더라도 문제 없다.

💡 아무래도 이 기능은 VSCode Extension Vim(v1.21.10) 에서는 정상적으로 작동하지 않는 것 같아 보입니다. intelliJ 의 Vim Extension 에서 동작하는 모습으로 대체합니다. 태그 surround 에 관하여는 제 컴퓨터 환경에서 VSCode, IntelliJ, (Original) Vim 모두에서 의도치 않은 동작들을 서로 다른 모습으로 보여주었습니다.
ys$<div class="line">

태그로 surround 하는 예제이다. 이 동작은 dot command 로 반복이 가능하다. (하지만 태그에 관련한 동작은 아직 완벽하지 않다.)

ds - surround 지우기

vim 은 자체적으로 감싸는 대상을 모두 지우기가 가능했다. `da{감싸는 대상}` 또는 `di{감싸는 대상}` 으로 그 동작이 가능했다. 만약 괄호만 지우고 싶거나, 따옴표만 지우고 싶다면? 정확히 괄호 즉, 감싸는 대상만을 지우는 기능은 surround 에서 제공한다.

 

열리는 괄호는 '공백 포함'을 의미하므로, 커서가 위치한 곳에 포함된 괄호를 안쪽 공백을 포함하여 삭제할 수 있다.

ds(

vim surround - de-surround with opening bracket: ds(

마찬가지로 닫히는 괄호를 활용하면 양쪽 공백을 포함하지 않고 괄호만 지우기도 가능하다.

ds)

vim surround - de-surround with closing bracket: ds)

cs - surround 바꾸기

surround 를 변경하기도 가능하다. 특히 따옴표 ', ", ` 사이에 변환하는 경우 유용하다.

 

다음 코드는 홑따옴표 `'`로 감싸진 영역을 쌍따옴표 `"`로 변경하는 명령이다. `cs{FROM surround}{TO surround}` 형태로 사용할 수 있다.

cs'"

vim surround - change surround: cs'"

 surround 명령도 micro macro(dot command)를 활용하여 반복할 수 있다.

 

cs 명령어로 surround 괄호로 변경시 공백을 포함하고 싶다면 열린 괄호를 사용해주면 된다. 닫힌 괄호는 공백이 포함되지 않는다. 

cs")
cs"(

kjvim surround - change surround with opening/closing bracket: cs") or cs"(


이상으로 surround 기능을 알아보았다. 특히 프로그래머에게 유용한데, 프로그래머는 괄호나 따옴표를 다룰 일이 많기 때문이다. 이 포스팅에서는 다양한 상황들을 다루지 못했지만, 생각보다 자주 해당 기능을 찾게 될 것이다. 괄호나 따옴표를(사실 태그는 자주 사용하지 않음) 씌우고, 삭제하고, 다른 surround 로 대체할 수 있다는 사실을 기억하도록 하자.

 

다음 시간에는 Vim 의 기능이면서, 생각보다 자주 쓰이지만, '기본편'에서 다루지 못했던 기능들을 살펴보도록 한다.

반응형

Designed by JB FACTORY