OpenVOS 커널에 변경 사항을 적용하는 과정에서 약 150개의 파일을 수정해야 하는 과제에 직면했습니다. 이는 소스 제어 시스템에서 해당 파일들을 예약하고, 저작권을 업데이트하며, 수정 내역 라인을 추가하고, 코드 변경(즉, #include 전처리 문 추가)을 수행해야 함을 의미했습니다. 이 작업을 단순히 수동으로 시작한다면 영원히 걸릴 것임을 알았습니다. 그래서 작업을 더 빨리 끝내기 위해 몇 가지 지름길을 사용했습니다.
내가 사용한 첫 번째 방법은 편집해야 할 모든 파일 목록을 만드는 것이었습니다. 소스 제어 시스템을 이용해 그 목록을 생성했지만, 바로 사용할 수 있는 형태가 아니었습니다. 그래서 명령어 출력을 캡처한 후, emacs 키보드 매크로를 사용해 이를 명령어 매크로로 가공했습니다. emacs 키보드 매크로를 한 번도 사용해 본 적이 없다면, 정말 재미있는 경험을 하게 될 겁니다. 이미 사용해 본 적이 있다면, 이 부분은 건너뛰고 다음 트릭으로 넘어가도 됩니다.
Emacs 편집기는 입력되는 편집 요청을 기록할 수 있는 명령어를 제공합니다. OpenVOS Emacs와 GNU Emacs 모두에서 명령어 기록을 시작하는 명령어는 "ESC-( "입니다. 이후 입력하는 모든 명령어는 실행되고 기록됩니다. 기록을 중지하려면 "ESC-)"를 입력합니다. 키보드 매크로는 OpenVOS Emacs에서는 "ESC-m", GNU Emacs에서는 "^X-e"를 입력하여 한 번만 실행할 수 있습니다. 키보드 매크로는 매우 반복적인 파일 편집에 탁월하며, 제가 마주한 상황도 바로 그런 경우였습니다. 다음은 'a'로 시작하는 POSIX 함수 목록을 사용하는 간단한 예시입니다:
목록
파일: 17, 블록: 19
r 2 abort.c
r 1 access.c
r 1 adjtime.c
r 1 aio_cancel.c
r 1 aio_error.c
r 1 aio_fsync.c
r 1 aio_read.c
r 1 aio_return.c
r 1 aio_suspend.c
r 1 aio_write.c
r 2 alarm.c
r 1 altzone.c
r 1 asctime.c
r 1 asctime_r.c
r 1 asprintf.c
r 1 assert.c
r 1 atexit.c
이 버퍼를 편집하여 각 줄이 다음과 같이 보이도록 해야 했습니다:
abort.c 수정
fixup.cm은 여러 작업을 수행하는 명령 매크로였습니다(자세한 내용은 후술). 그래서 처음 몇 줄을 삭제하여 emacs 버퍼에 남은 것은 반복되는 파일 목록뿐이었습니다. 커서를 첫 줄 시작 부분에 두고 "ESC-("를 입력해 기록을 시작한 후, 해당 줄을 편집하여 처음 두 "단어"를 삭제하고 "fixup" 문자열로 대체했습니다. 그런 다음 커서를 다음 줄 시작 부분에 두고 "ESC-)"로 기록을 종료했습니다. 다음은 제가 입력한 정확한 순서입니다(OpenVOS emacs 키 바인딩 사용):
ESC-( ESC-d ESC-d 수정 ^N ^A ESC-)
이제 첫 번째 줄이 편집되었고 커서가 두 번째 줄의 시작 부분에 위치해 있습니다. 모든 것이 정상적으로 작동했으므로, 저는 다음과 같이 입력했습니다:
ESC-99 ESC-m
파일의 나머지 부분을 편집하기 위해. 버퍼에 99줄 미만이 있으므로, 이 매크로는 버퍼 끝까지 실행된 후 중지됩니다. 그런 다음 버퍼를 "fixup_all.cm"로 출력했습니다.
다음 단계는 "fixup.cm" 명령 매크로를 작성하는 것이었습니다. 이 매크로는 저작권을 업데이트하고 수정 내역을 업데이트한 후 emacs로 진입하여 수동으로 #include 문을 추가할 수 있도록 하기로 결정했습니다. emacs 환경에 머물면서 커서 위치에 필요한 #include 문을 삽입하는 새 키보드 매크로를 생성했습니다:
ESC-( #include “sample.h” ESC-)
각 파일마다 emacs를 열고 닫아야 했기 때문에, 이 매크로를 영구적으로 저장하고 키에 바인딩해야 했습니다. 현재 키보드 매크로를 영구 매크로로 저장하라는 emacs 요청은 "save_macro"이지만 기본 키 바인딩이 없습니다. 한 번 실행하려면 다음을 입력하세요:
ESC-r 매크로 저장
그러면 이 새 매크로에 연결할 이름을 묻는 메시지가 표시됩니다. 저는 매크로 이름을 "add_include_file"로 지정했습니다. 그런 다음 start_up.emacs 파일을 편집하여 다음 줄을 추가했습니다:
set_key ^z-i add_include_file
그래서 이제 emacs를 종료하고 다시 시작했습니다. set_key 문이 제대로 작동하는지 확인하기 위해서였죠. 그런 다음 fixup.cm의 텍스트를 입력했습니다. 수정 내역을 업데이트하는 가장 쉬운 방법이라고 생각했기 때문에 라인 에디터를 사용했습니다.
&begin_parameters
파일 경로명, 요청
&end_parameters
!저작권 추가 &파일&
&attach_input
!line_edit &file& -no_backup –no_verbose
l/수정 내역 끝/
-1
i
/* 2017년 10월 5일 Paul Green에 의해 수정됨 … */
.
쓰다
그만두다
&입력 분리
emacs &파일&
&return
이 매크로는 저작권 정보를 추가(또는 업데이트)하고, 수정 내역 섹션의 끝을 표시하는 주석 바로 앞에 수정 내역 줄을 추가한 후, emacs로 진입하여 %include 문장을 추가할 위치를 수동으로 찾을 수 있도록 합니다.
이제 두 개의 명령 매크로가 있습니다: "fixup_all.cm"과 "fixup.cm". 전자는 수정해야 할 파일마다 후자를 한 번씩 호출합니다. 이후 "fixup_all"을 입력하며 마라톤 편집 세션을 시작했고, 제가 해야 할 일은 #include 문 삽입 위치를 찾은 뒤 "^Z-i"를 입력하고 파일을 출력한 후 종료하는 것뿐이었습니다. 나머지 작업은 매크로가 처리해 주었습니다.
매크로를 작성하는 데 걸린 시간조차도, 이 편집기 및 명령어 매크로를 만들어서 많은 시간과 노력을 절약했고 (아마도 몇 가지 오타도 줄였을 것이다). 또한 지루한 작업을 훨씬 더 흥미로운 작업으로 바꿔주었다.
이 정보가 도움이 되길 바랍니다. 지금은 여기까지입니다.
