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(
w
나i{
같은)을 받는다. - 현재 window에서 즉시 검색을 수행하여 그 결과를 quickfix window로 보낸다.
- 첫번째 결과가 기대한 값이 아닐 수 있기 때문에 첫번째 결과로 커서를 이동하지는 않는다.
이는 다음과 같이 사용될 것이다:
<leader>giw
: 현재 커서에 있는 단어(word)를 grep<leader>giW
: 현재 커서에 있는 단어(WORD)를 grep<leader>gi'
: 현재 작은 따옴표 안에 있는 컨텐츠 스트링을 grepviwe<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>
word
와WORD
의 차이는: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 문자는 문자 그대로 해석되기 때문에, 이전 명령어보다 훨씬 안정적인 명령어라고 할 수 있다.
나머지 내용은 다음장에..
'tools > vim' 카테고리의 다른 글
vim 자동완성의 끝판왕, coc.nvim (0) | 2020.04.11 |
---|---|
Learn Vimscript The Hard Way - 32. Case Study: Grep Operator, Part One - 2/2 (0) | 2020.04.10 |
Learn The Vimscript The Hard Way - 31. Basic Regular Expressions (0) | 2020.04.08 |
Learn Vimscript The Hard Way - 30. Execute Normal! (0) | 2020.04.07 |
Learn Vimscript The Hard Way - 29. Normal (0) | 2020.04.06 |