buffer를 아무 Unix 도구에나 흘려보내기
Vim이 셸과 워낙 깊이 붙어 있어서 텍스트 처리 작업 상당수는 plugin이 필요 없어. buffer를 sort, jq, awk, python 뭐든지에 통과시키고 결과를 도로 받아오면 되거든. 이미 알고 있는 Unix 도구 전부의 앞단이 Vim이 되는 셈이야.
셸을 부르는 세 가지 방식
:!cmd— 셸 명령을 실행하고 결과만 보여줘 (buffer는 안 건드려).:r !cmd— 셸 명령을 실행하고 결과를 커서 아래에 끼워 넣어.:%!cmd— buffer 전체를 명령에 통과시키고 결과로 갈아끼워.:'<,'>!cmd는 Visual로 고른 범위에만 같은 일을 해.
한 줄짜리 결정타들
:%!sort는 파일을 정렬해. :%!sort -u는 정렬하면서 중복까지 걸러내고. :%!python -m json.tool은 JSON을 예쁘게 펴주고, :%!jq .는 JSON을 다시 포맷하면서 유효한지도 검사해줘. :%!sed 's/foo/bar/g'는 sed에 익숙한 사람용이고, :'<,'>!sort는 고른 범위만 정렬해.
:% 토큰
:%!cmd, :%s/..., :%y에서 %는 언제나 파일 전체야. 다른 범위 토큰도 있어. .는 지금 줄, $는 마지막 줄, 'a,'b는 mark a부터 mark b까지, '<,'>는 Visual 선택이야.
Global 명령
:g는 Vim에서 가장 강력한데 가장 안 쓰이는 명령 중 하나야. 패턴에 걸리는 모든 줄에 명령을 실행해. 반대 짝인 :v (또는 :g!) 는 걸리지 않는 줄에 실행하고. :normal과 붙이면 걸러낸 줄 묶음에만 Normal mode 동작을 걸 수도 있어.
:g는 찾아서-무엇이든-하는 명령이야. :%s가 찾아서 바꾸기라면 :g는 찾아서 아무거나 하기야. :g/pattern/cmd가 손에 붙으면, 남들이 grep 떠놓고 손으로 고치고 있는 리팩터링 기회가 눈에 보이기 시작해.고급 치환 레시피
캡처 그룹을 쓰면 치환이 프로그래밍이 돼. \v (very-magic) 까지 얹으면 문법이 드디어 읽을 만해지고. 자주 쓰는 것들이야.
- 단어 두 개 자리 바꾸기:
:%s/\v(\w+) (\w+)/\2 \1/g. - 단어마다 첫 글자 대문자로:
:%s/\v(\w+)/\u\1/g. - 걸린 부분 통째로 대문자로:
:%s/.*/\U&/. - 걸린 부분을 괄호로 감싸기:
:%s/\v(\d+)/[\1]/g.