이 글은 2022년 4월 3일 트위터에 쓴 글을 백업한 것입니다.

/ 에서 검색 패턴을 생략하면 어떻게 될까?

vim에서 뭘 검색할 때 /를 쓰는 게 기본이긴 한데 이렇게 검색한 검색어가 검색을 마친다고 사라지는 게 아니라 / register에 들어간다는 걸 활용하는 기능이 있다. 바로 replace.

perl이나 sed에서와 같이 vim 에서도 s/pattern/replace/ 이런 걸 쓴다. 그런데 pattern을 생략하면 어떻게 될까?

s/pattern/replace/
s//replace/

즉 위의 두 개 중 후자를 쓰는 방법. 이렇게 검색 pattern을 생략하면 vim은 / register를 사용해 pattern을 채워넣는다.

보통 뭔가 찾아서 replace하려 할 때 사람이 그리 과감하지 않죠. 먼저 검색을 해서 내 의도대로 검색 패턴이나 정규식이 잘 검색되나 확인을 해보고, 아 잘되네 이걸로 replace 해야겠구나 생각을 하는데 여기에서 귀찮은게 바로 replace 하기 위한 명령을 적을 때 검색어를 또 적어야 한다는 거.

/pattern 으로 먼저 검사를 해서 확인을 했으면 substitute 는 걍 :s//replace 로 끝낼 수 있다. 이렇게 타이핑 몇 번을 또 줄이게 되는 것. 레지스터 만세.

*의 사용

이건 당연히 * 검색에서도 통한다. *은 다른게 아니고 단어 텍스트 오브젝트를 검색해주는 normal 명령인데 커서가 지시하고 있는 단어를 바로 검색해주므로 몹시 편하다. 그런데 패턴을 잘 보면 양쪽에 \< \>를 씌우고 있다. 이건 vim에서 사용하는 단어의 경계를 의미하는 패턴.

그래서 단어 하나를 검색해 replace하는 쉬운 방법 하나는 단어 위에 커서가 있을 때 *을 누르고 :%s//replace/g 처럼 입력하는 것. 이러면 검색 패턴도 * 한 번 누르는 것으로 해결되므로 실제로 누르는 키스트로크가 많이 줄어든다.

very magic

한편 vim의 정규식이 perl 스타일의 정규식이나 그걸 이어받은 JavaScript 스타일의 정규식과 좀 달라서 vim에서 정규식을 쓰는 건 좀 복잡한 일일 수 있는데, 이걸 설정하는 옵션이 있다. 그것이 \v 역슬래시 브이. 이건 이름이 좀 웃김. very magic 으아 베리에 매직이라니.

/ 뒤에 바로 \v를 입력하고 익숙한 스타일의 정규식을 사용하면 된다. vim 빌트인 정규식은 캡처 그룹 괄호에도 이스케이프를 해줘야 하는 등 헷갈리는 게 있는데 \v를 쓰면 이런걸 신경쓰지 않고 JavaScript 정규식 쓰는 기분으로 쓸 수 있어 편하다.

여러 파일 검색하기

그러면 파일 하나 안에서는 검색이 그렇다 치고, IDE에서처럼 여러 파일을 검색해서 목록으로 보는 기능도 있다. 그것이 vimgrep. vimgrep을 쓰면 검색 결과를 quickfix 로 볼 수 있게 갈무리해주는데… 아 이거 이야기하려면 quickfix도 이야기해야 하는구나…

vimgrep을 써서 검색하고 나서 검색 목록을 보려면 :copen을 입력하면 된다. 그러면 파일명 행번호 열번호 내용이 요약이 되고, 그 위에서 엔터를 치면 해당 파일로 이동하는 식. quickfix 이야기를 하려면 quickfix 설정법도 이야기하게 될테니 엄청 길어질 거라 이건 다음 기회에.

quickfix 이야기는 다음으로 미뤘고, 그러면 여러 파일 검색할 때 vimgrep만 쓰느냐 하면 그건 아님. vimgrep보다 더 많이 쓰는 게 fzf.vim. 혁명적인 UI로 CLI에 빛을 던져준 명령 fzf를 vim에서 쓸 수 있게 도와주는 플러그인이라 할 수 있다.

https://github.com/junegunn/fzf.vim

fzf.vim을 쓰는 방법은 다양한데, 플러그인에서 제공해주는 기본 셋팅만으로도 꽤 편리한 명령이 많아서 어지간해서는 커스터마이징이 필요없을 정도. 가장 많이 쓰는 건 :Files, :Ag. Ag 는 나도 늘 사용하고 있는 [[/cmd/ag]]를 통합하는 명령이지만 다른 걸로 바꿔 끼울 수도 있을듯.

/ 와 숫자의 조합

여기에서 마무리할까 했는데 생각해보니 하나 더 이야기하면 좋겠어서 좀 더 써보자. /로 돌아가자. 두 가지 상식을 조합하도록 하자.

  1. vim 검색을 할 때 /로 시작한다.
  2. 대부분의 vim normal 명령은 숫자를 먼저 지정할 수 있다.

그래서 /도 숫자를 지정할 수 있다. 검색하고 nnn 해도 되지만 번지수를 알고 있다면 이렇게.

10/plug로 검색한 영상을 찍어 보았다.

/ 에서 구분자는 꼭 / 가 아니어 된다

오늘 오전은 여기에서 끝. 아니다 하나 더 써야 한다. sed와 perl 처럼 vim의 검색 구분자도 / 말고 다른 것도 쓸 수 있다. s/pattern/replace/g 이렇게 쓸 뿐만 아니라 s,pattern,replace,g 이렇게도 되고 + 도 되고, # 도 되고… 파일 경로 같은 거 쓸 때 / 쓰면 구분자랑 겹쳐서 잘 안 돌아가니까 이런 걸로 바꿔주면 된다.

vim guide 소개

이번엔 예전에 작성해둔 vim 가이드를 공유해보자. 시간이 꽤 지나서 이것저것 추가하고 싶은 것도 있고, 수정하고 싶은 내용도 있지만 일단은.

https://github.com/johngrib/simple_vim_guide

아니 플러그인 작성하는 방법을 글로 써야지 하고 TODO 리스트에 추가한 게 5년 전이라니… 세월이 쏜살같이 흐르네.

정말 우물쭈물하다 시간이 훅훅 간다. 내가 작성한 vim 가이드의 "키 조합에 대하여"에서 미처 적지 못한 내용은 이 글에 대부분 녹여둔 것 같다.

[[/special-chars]]