. 북마크 소개

북마크란 문서의 한 부분에 표식을 해놓아 다음에 쉽게 찾을 수 있도록 하는 기능이며 마치 읽던 페이지에 책갈피를 꽂아 두는 것과 유사하다고 하여 책갈피 기능이라고도 한다. 문서의 두 군데 이상을 왔다 갔다 하면서 참고해야 할 때 북마크는 아주 유용하게 사용되며 특히 소스 편집 중에는 반드시 필요한 필수 기능이다. 북마크 기능이 없다면 매번 문서를 스크롤시켜 가며 원하는 부분을 찾아야 하므로 아주 불편하다.

북마크는 이름있는 북마크와 이름없는 북마크 두 가지 종류가 있다. 이름있는 북마크는 보통 0~9까지 숫자를 붙여 놓고 단축키로 바로 이동할 수 있는 북마크이며 문서의 특정 부분에 고유한 번호의 북마크를 부여함으로써 한 번에 원하는 곳으로 갈 수 있다. 예를 들어 서론, 본론, 결론이 있다면 각각 1, 2, 3번 북마크를 설정해놓고 <Ctrl+1>, <2>, <3>키를 눌러 원하는 부분으로 신속하게 이동한다.

이름없는 북마크는 표식을 하기는 하되 북마크간의 구별이 없고 순서만 있다. 그래서 북마크한 특정 부위를 곧바로 이동할 수 있는 방법이 없으며 북마크 사이를 순회하는 방식으로 원하는 곳을 찾아야 한다. 두 방식 중 논리적으로 따져 본다면 이름있는 북마크가 더 편리하다. 하지만 실제로 사용해보면 이름없는 북마크보다 실용적이지 못한데 왜냐하면 북마크한 곳의 번호를 외워야 하고 또 그 개수에 제한이 있기 때문이다. 이름없는 북마크는 단순 무식한 방법이기는 하지만 북마크해 둘 곳의 수가 많지 않다면 오히려 사용하기 더 쉽다.

편집기 종류에 따라 북마크에 이름을 붙이는 것도 있고 그렇지 않은 것도 있는데 비주얼 C++의 편집기는 이름없는 북마크만 지원한다. 이름있는 북마크도 지원하기는 하는데 문자열로 이름을 주는 방식이다. ApiEdit는 두 방식의 북마크를 모두 지원할 생각이다.

북마크는 문단에 대한 표식을 붙이는 것이므로 문단 정보를 저장하는 곳에 같이 저장하는 것이 좋다. ApiEdit는 문단 정보를 pLine 배열에 기록하므로 이 배열에 nBookMark 같은 멤버를 추가하면 될 것 같다. 예를 들어 10번 문단에 북마크를 설정한다면 nPara 10인 배열요소를 찾아 nBookMark에 적당히 표식을 달면 될 것이다.

그러나 pLine 배열은 북마크 저장용으로는 부적당하다. 왜냐하면 북마크는 사용자에 의해서만 설정/해제되는 영구 정보인데 비해 pLine은 문서가 바뀔 때마다 완전히 리셋되는 임시 정보이기 때문이다. 굳이 pLine을 사용하려면 가능하기는 하겠지만 관리하기가 무척 어렵다. 정렬을 다시 하기 전에 북마크 정보를 모두 저장해놓고 정렬이 끝난 후 북마크가 있던 원래 위치에 다시 표식을 해야 하는데 이 작업이 그리 만만치가 않다.

그래서 ApiEdit pLine 배열에 북마크 정보를 저장하지 않고 북마크 저장 전용 배열을 따로 사용하기로 하였다. 다음 배열을 선언하도록 하자.

 

#define MAXBOOKMARK 100

 

int arMark[MAXBOOKMARK];

COLORREF MarkColor;

 

북마크는 문서 하나당 최대 100개까지 설정할 수 있는데 arMark 배열의 0~9까지는 이름있는 북마크 정보를, 10이후 99번까지는 이름없는 북마크 정보를 저장한다. 즉 이름없는 북마크를 최대 90개까지 한 번에 지정할 수 있다. 만약 더 많은 북마크를 지정하도록 하고 싶다면 MAXBOOKMARK 매크로만 늘려주면 된다.

arMark 배열요소의 값은 북마크가 설정된 문단번호를 가진다. 예를 들어 arMark[2] 12라는 값을 가지고 있다면 2번 북마크가 12번째 문단을 가리키고 있는 것이고 arMark[16] 24라는 값을 가지고 있다면 24번째 문단에 이름없는 북마크가 설정되어 있는 것이다. 북마크가 설정되어 있지 않으면 -1의 값을 가진다.