tools/vim

Learn Vimscript The Hard Way - 32. Case Study: Grep Operator, Part One - 1/2

seul chan 2020. 4. 9. 01:06

Case Study: Grep Operator, Part One

해당 장은 꽤 많은 내용을 담고 있어서 두 장으로 나눠서 작성할 예정이다. (part one의 part one이다...)

이번 장에서는 꽤 복잡한 vimscript를 작성해 볼 것이다. 이전 장들에서 공부했던 내용도 있을 것이고, 새로 나오는 내용도 있을 것이다.

익숙하지 않은 명령어들이 나오면 :help를 잘 활용하자

Grep

:grep을 한 번도 사용해 보지 않았다면 :help :grep:help :make를 읽어보길 바란다. quickfix-window를 사용해보지 않았다면 :help quickfix-window도 읽어보아라. (벌써부터 help text 읽을게 산더미...)

간결히 얘기해서: :grep ...은 외부의 grep 프로그램을 실행시켜서 내가 입력안 arguement를 파싱하여 vim에서 사용할 수 있는 quickfix list에 채워주는 역할을 한다.

아래 예시에서는 grep operator를 추가하여 vim의 기본 모션 (뿐만 아니라 추가한 모션)에서 :grep 명령어를 더 쉽게 쓸 수 있도록 해볼 것이다.

Usage

첫 vimscript를 쓰면서 가장 먼저 해야 하는 생각은, "이 기능이 어떻게 사용될 것인가?" 하는 것이다.

이번 예시에서는 책이 대신해준다 한다.

  • <leader>g에 매핑된 "grep operator"를 만든다.
  • 다른 vim의 operator와 동일하게 작동하며 motion(wi{같은)을 받는다.
  • 현재 window에서 즉시 검색을 수행하여 그 결과를 quickfix window로 보낸다.
  • 첫번째 결과가 기대한 값이 아닐 수 있기 때문에 첫번째 결과로 커서를 이동하지는 않는다.

이는 다음과 같이 사용될 것이다:

  • <leader>giw: 현재 커서에 있는 단어(word)를 grep
  • <leader>giW: 현재 커서에 있는 단어(WORD)를 grep
  • <leader>gi': 현재 작은 따옴표 안에 있는 컨텐츠 스트링을 grep
  • viwe<leader>g: 비주얼 모드에서 선택된 단어와 그 다음에 오는 단어까지를 선택하여 grep

이 외에도 아주 많은 방식으로 사용이 가능하다.

A Preliminary Sketch

vimscript를 작성하는 한 가지 팁은 달성하고자 하는 목표를 간단히 해서 최종 결론에 대한 모양을 그려보는(?) 것이다.

우리의 목표를 다음과 같이 간소화 시켜보자: "현재 커서 아래 있는 단어를 검색하는 mapping을 만드는 것". 이것은 유용하지만 조금 더 간단해서 시도해 보기 더 쉽다. 이를 <leader>g로 매핑해보자

:nnoremap <leader>g :grep -R something .<cr>

:hele grep을 읽었다면 위 명령어는 간단할 것이다 (..?)

"something" string을 현재 경로 (.)부터 재귀적으로 (-R) grep한다. :grep -R something .을 입력해도 동일하다.

The Search Term

위의 예시는 현재 커서가 아닌 something이라는 string만 검색한다. 다음 명령어를 실행시켜보자.

:nnoremap <leader>g :grep -R <cword> .<cr>

<cword>는 vim의 command-line 모드에서 쓸 수 있는 특별한 용어로, vim은 이를 "현재 커서 밑에 있는 단어(word)"로 해석한다.

<cWORD>를 사용하여 word 대신 WORD를 사용할 수 있다.

:nnoremap <leader>g :grep -R <cWORD> .<cr>

wordWORD의 차이는 :help 03.1에서 더 자세히 볼 수 있다. 간단하게 얘기하면 WORD는 whitespace로만 분리되는 반면 word는 다른 캐릭터((), [], -) 등으로도 나눠진다.

이제 foo-bar라는 단어 아래에서 <leader>g를 실행하면 foo-bar 전체를 grep하는 것을 볼 수 있다.

그래도 아직 또 다른 문제가 있다: special shell character가 있다면 vim이 이를 바로 외부 검색 (:grep)으로 넘겨 에러를 반환할 것이다.

foo;ls 위에 커서를 두고 <leader>g를 실행시켜보자. grep 명령어가 실패하고 심지어 foo 명령어가 실행되어 버릴 것이다.

이를 고치기 위해서 grep argument를 quote 해주자.

:nnoremap <leader>g :grep -R '<cWORD>' .<cr>

대부분의 쉘에서 single-quoted 문자는 문자 그대로 해석되기 때문에, 이전 명령어보다 훨씬 안정적인 명령어라고 할 수 있다.

나머지 내용은 다음장에..