Emacs의 evil-surround 확장 소개 및 기본 사용법

Emacs // 2024년 07월 24일 작성

evil-surround는 surround.vim 기능을 거의 그대로 Emacs의 Evil 용으로 옮겨놓은 듯한 확장이다. 이름처럼 뭔가를 둘러싸거나(surrounding) 둘러싸인 문자를 건드리는 등의 기능을 제공한다.

설치 방법은 각자의 상황에 따라 다르니 일단 생략한다. 개인적으로는 Doom Emacs 설정 팩을 쓰고 있고 여기에는 기본 설정으로 들어있기 때문에 그대로 쓰고 있다. 당연하게도 관련 확장을 설치한 Vim에서도 동일한 방식으로 사용할 수 있을 것이다.

이제 기본 사용법을 정리해 보자.

선택영역 둘러싸기

비주얼 모드에서 S를 누른 후 특정 문자를 입력하면 해당 문자가 좌우에 쌍(pair)으로 입력된다. 예를 들어 아래 예에서 BOLD 부분을 비주얼 모드로 선택했다고 치자.

This is BOLD style in Org Mode.

이렇게 영역으로 선택된 상태에서 S=을 입력하면 아래와 같이 바뀐다.

This is =BOLD= style in Org Mode.

보다시피 입력된 문자가 선택영역 좌우에 입력되는 것을 알 수 있다. 이게 바로 이 Surround의 가장 토대가 되는 기능이라고 볼 수 있다.

선택영역 둘러싸기 (2)

둘러싸기 기능에서 한가지 더 특수한 기능이 있는데 바로 짝이 있는 문자로 둘러싸기 기능이 있다. 예를 들자면 괄호 입력 등이 있다. 다만 특징이 한가지 있다면 짝 중에 닫는 문자와 여는 문자 어떤 걸 입력하느냐에 따라 동작이 약간 다르다는 점이 있다.

예를 들어 아래와 같은 경우를 보자.

print "Hello World"

여기서 "Hello World" 부분을 비주얼 모드로 선택해 주고 S)를 입려해주면 아래와 같이 변한다.

print ("Hello World")

조금 다르게 다시 원래 상태에서 똑같이 선택해 주고 S(를 입력하면 이번에는 이렇게 바뀐다.

print ( "Hello World" )

보다시피 짝 문자를 넣어주지만 공백을 한 칸 넣어주는 특이한 방식으로 동작한다.

개인적으로는 닫는 문자를 입력하는 방식을 선호한다. 어쨌든 이런 식으로 중괄호나 대괄호 같이 짝이 있는 문자로 둘러싸기를 좀 더 쉽게 할 수 있다.

더 크게 둘러싸기(?)

부제를 정하는 데 좀 난감했는데, 예를 들자면 C언어 혹은 파생 언어에서 특정 코드를 블럭으로 만들 때 유용하게 쓸 수 있는 기능이 있다. 아래의 예제를 살펴보자.

int value = 0;

위 한 줄을 비주얼 모드로 선택해 주고 이번에는 gS}를 입력해 보자. 아래와 같이 바뀐다.

{
int value = 0;

}

이런 식으로 짝 문자로 둘러싸되 개행문자를 넣어서 둘러싸준다.

사실 scratch 버퍼에서 테스트 했기 때문에 모양이 좀 이상한 것 같은데, 적절한 언어 메이저 모드로 동작 중이었다면 들여쓰기가 자연스럽게 적용되었을 것이다.

둘러싸는 문자 바꾸기

노멀 모드에서 원하는 라인에 커서를 놓고 cs 키 이후 바꾸려는 문자와 바꿀 문자를 연달아 입력하면 둘러싸는 문자가 원하는 문자로 바뀐다. 예를 들어 아래의 경우를 보자.

print("Hello World");

이 줄의 아무 곳에서 커서를 놓고 cs"'를 입력하면 아래와 같이 바뀐다.

print('Hello World');

" 문자가 '로 바뀌였다.

페어 문자 삭제하기

둘러싸기가 있다면 삭제하기도 있기 마련이다. 이 기능도 딱히 선택영역 없이 커서가 위치하는 라인에서 ds를 누른 후 삭제하기 원하는 문자를 입력하면 된다. 예를 들어 아래의 같은 문자열의 라인에 커서를 놔뒀다고 가정하자.

value = object.get("DEFAULT_NAME")

이 상황에서 ds"를 눌러주면 아래와 같이 바뀐다.

value = object.get(DEFAULT_NAME)

자주 쓸 기능은 아닌 것 같지만 글을 쓸 때 종종 쓸 일이 있을 것 같기는 하다.

마무리 및 관련된 링크

공식 저장소에서 소개하는 기능 몇가지는 무슨 이유인지 제대로 동작하지 않는 게 있어서 확인하지는 못했다. 개인적으로 자주 사용하는 기능은 아니지만 확인하지 못 한 건 좀 아쉽다.

어쨌거나 기본적인 사용법만 정리해 봤지만 이 정도만 해도 제법 사용처가 무궁무진하다. 물론 여기다 커스터마이징까지 가능하니 필요하다면 공식 사이트를 둘러보며 사용법을 알아보는 것도 나쁘지는 않을 것 같다. 다만 개인적으로는 딱히 커스터마이징이 필요 없을 정도로 기본 설정이 잘 되어 있다고 생각하며 그래서 별다른 설정 없이 아주 잘 쓰고 있는 확장이다.