vimのマクロとレジスタ
한국어 원문으로 표시합니다.
목표
매크로가 무엇인지 - 레지스터에 담긴 그냥 텍스트라는 것 - 를 직접 확인하고, 반복 가능한 매크로를 설계하는 방법을 익힙니다.
왜 중요한가
qa 로 기록한 매크로는 키 입력이 문자열 그대로 레지스터 a 에 저장된 것입니다. yank 와 매크로가 같은 a~z 공간을 쓰는 것도 그래서입니다. 이 사실을 알면 매크로를 파일로 꺼내 편집하고 다시 넣을 수 있고, 실습에서처럼 파일로 제출해 검증할 수도 있습니다. 그리고 반복 가능한 매크로에는 설계 원칙이 있습니다 - 시작점을 절대 고정하고, 이동은 내용 기준으로 하고, 마지막에 다음 대상으로 넘어간다. 이 셋 중 하나라도 빠지면 두 번째 줄부터 어긋납니다.
단계
/root/vmac 디렉터리에서 작업합니다. 매크로 파일에는 키 입력을 한 줄로 적습니다.
/root/vmac/list.txt에 다음 6줄을 넣으세요.web01/web02/db01/db02/cache01/queue01- 각 줄을
- web01처럼 만드는 매크로 키 입력을/root/vmac/macro1.txt에, 적용 결과를/root/vmac/bulleted.txt에 저장하세요. - 각 줄을
"web01",로 만드는 매크로를/root/vmac/macro2.txt에, 결과를/root/vmac/quoted.txt에 저장하세요. 이 매크로에는 ESC 문자가 반드시 들어가야 합니다. - 각 줄 앞에
1.,2.처럼 줄 번호를 붙이는 ex 명령을/root/vmac/number.ex에, 결과를/root/vmac/numbered.txt에 저장하세요. /root/vmac/hosts.txt에 다음 6줄을 넣으세요.web01.prod.example.com/web02.staging.example.com/db01.prod.example.com/db02.staging.example.com/cache01.prod.example.com/queue01.staging.example.com그리고 staging 이 든 줄에만 맨 앞에#를 붙이는 명령을/root/vmac/onlystaging.ex에, 결과를/root/vmac/staging.txt에 저장하세요.hosts.txt에서prod가 든 줄만 모아 파일 맨 끝에 덧붙이는(총 9줄) 명령을/root/vmac/collect.ex에, 결과를/root/vmac/collected.txt에 저장하세요./root/vmac/table.txt에 다음 5줄을 넣으세요.name=web01/role=frontend/zone=seoul/port=8080/tier=gold각 줄을NAME:web01처럼 키는 대문자로, 등호는 콜론으로 바꾸는 매크로를/root/vmac/macro3.txt에, 결과를/root/vmac/table_out.txt에 저장하세요.hosts.txt에서 prod 줄만 남기고 앞에-, 뒤에:80을 붙이는 명령들을/root/vmac/final.ex에, 결과를/root/vmac/final.txt에 저장하세요.
참고
- 채점기는 매크로 파일의 첫 줄을 레지스터에 넣고
:%normal @q로 모든 줄에 적용해 봅니다. :normal로 실행되는 삽입 모드는 명령이 끝날 때 자동으로 종료되므로, 마지막이 삽입인 매크로에는 ESC 가 없어도 됩니다. 중간에 삽입을 끝내야 할 때만 필요합니다.:reg a로 레지스터 내용을 눈으로 확인할 수 있습니다.- 흔한 실수 1: 2번의 매크로 끝 공백이 저장 과정에서 잘리면 결과가
-web01이 됩니다. - 흔한 실수 2: 6번에서 소문자 레지스터를 쓰면 매번 덮어써서 마지막 한 줄만 남습니다.
연습용 목록 만들기
/root/vmac/list.txt 에 다음 6줄을 넣으세요.
web01 / web02 / db01 / db02 / cache01 / queue01
6줄 정확히. 순서도 맞춰야 합니다.
첫 매크로: 글머리 기호 붙이기
각 줄을 - web01 처럼 만드는 매크로 키 입력을 /root/vmac/macro1.txt 에, 적용 결과를 /root/vmac/bulleted.txt 에 저장하세요.
I 는 줄 맨 앞에서 입력을 시작합니다. 매크로 마지막의 공백 한 칸까지 파일에 그대로 저장돼야 합니다.
매크로에 ESC 문자 넣기
각 줄을 "web01", 로 만드는 매크로를 /root/vmac/macro2.txt 에, 결과를 /root/vmac/quoted.txt 에 저장하세요. 이 매크로에는 ESC 문자가 반드시 들어가야 합니다.
삽입 모드에서 빠져나오는 키도 매크로의 일부입니다. vim 에서 Ctrl-V 를 누른 뒤 Esc 를 누르면 그 문자가 파일에 들어갑니다.
줄 번호 매기기
각 줄 앞에 1. , 2. 처럼 줄 번호를 붙이는 ex 명령을 /root/vmac/number.ex 에, 결과를 /root/vmac/numbered.txt 에 저장하세요.
줄마다 값이 달라지므로 고정 문자열로는 안 됩니다. 치환의 바꿀 자리에서 식(expression)을 평가하게 만드는 문법이 있습니다.
조건에 맞는 줄에만 적용
/root/vmac/hosts.txt 에 다음 6줄을 넣으세요.
web01.prod.example.com / web02.staging.example.com / db01.prod.example.com / db02.staging.example.com / cache01.prod.example.com / queue01.staging.example.com
그리고 staging 이 든 줄에만 맨 앞에 # 를 붙이는 명령을 /root/vmac/onlystaging.ex 에, 결과를 /root/vmac/staging.txt 에 저장하세요.
:g/패턴/normal 키입력 형태로 줄 필터와 Normal 모드 키를 결합합니다.
흩어진 줄 한곳에 모으기
hosts.txt 에서 prod 가 든 줄만 모아 파일 맨 끝에 덧붙이는(총 9줄) 명령을 /root/vmac/collect.ex 에, 결과를 /root/vmac/collected.txt 에 저장하세요.
소문자 레지스터는 덮어쓰고 대문자 레지스터는 덧붙입니다. 모은 뒤 파일 끝에 붙여넣으세요.
두 동작을 묶은 매크로
/root/vmac/table.txt 에 다음 5줄을 넣으세요.
name=web01 / role=frontend / zone=seoul / port=8080 / tier=gold
각 줄을 NAME:web01 처럼 키는 대문자로, 등호는 콜론으로 바꾸는 매크로를 /root/vmac/macro3.txt 에, 결과를 /root/vmac/table_out.txt 에 저장하세요.
텍스트 객체로 단어 하나를 대문자로 바꾸고, 문자 찾기와 한 글자 치환을 이어 붙입니다.
필터 + 접두 + 접미 종합
hosts.txt 에서 prod 줄만 남기고 앞에 - , 뒤에 :80 을 붙이는 명령들을 /root/vmac/final.ex 에, 결과를 /root/vmac/final.txt 에 저장하세요.
앞에서 쓴 기법들을 순서대로 조합하세요. 남길 줄을 먼저 고르는 것이 순서상 유리합니다.