Notepad++ 4.1.2 버전의 경우 형식 메뉴에서 인코딩 방식을 유니코드로 변경한 다음 ANSI로 돌아오면 코드 페이지가 엉뚱하게 설정됩니다. 그래서 한글 조합이 이상하게 되는 현상이 발생하죠. 이는 일본어, 중국어등의 특수한 코드 페이지를 사용하는 곳에서는 공통으로 발생하는 현상입니다. 아래 실행 파일로 덮어 씌우면 제대로 된 코드 페이지로 설정됩니다.
제가 지금껏 제공했던 Scintilla용 IME 패치에서 문제점으로 지적된 것들을 고친 버전입니다. 이 버전은 Scintilla를 DLL 형태로 사용하는 대다수 프로젝트에 모두 사용할 수 있습니다. Notepad++, TSVN 아무 때나 DLL만 덮어 씌우면 됩니다. 패치에 사용된 소스는 현재 Scintilla 홈페이지에서 배포하고 있는 1.74 버전입니다. 수정 내용은 아래와 같습니다.
- 유니코드, ANSI 모드에서 모두 정상적으로 캐럿 출력
- Undo 사용 시에 한글이 한자씩 지워지도록 수정
- 영문 삭제 Undo가 한번에 발생하는 것을 한글자씩 되도록 수정
- 2000에서 한글 IME 창이 아래 쪽에 출력되는 문제 수정
- 코드 페이지 변경 시에 Undo 히스토리 삭제
삽질 에피소드
Scintilla의 Undo는 다른 것들과는 조금 다릅니다. 대표적인 예가 치환의 경우입니다. 블록을 잡고 치환할 경우 다른 에디터들은 치환을 하나의 Undo 과정으로 처리합니다. 하지만 Scintilla는 삭제, 추가라는 두 단계의 Undo 과정을 거치죠.
어제 테스트 하던 중 발견한 이상한 현상은 이런 것이었습니다. "abcd^"상태에서 d를 지웁니다. "abc^"가 되겠죠. 여기서 Undo를 수행하면 "abcd^"가 되는게 정상입니다. 그런데 "abc^d"가 되는 겁니다. ^는 카렛의 위치를 나타냅니다. 그래서 저는 Undo 시에 카렛 위치가 계산이 잘못되어서 그랬구나 하고 관련 부분을 고쳤습니다. 에러가 나더군요. 계산이 중복 적용되면서 나는 에러였습니다. 이상한 일이었습니다. 소스 상에는 모든 것이 완벽한데 카렛은 계속 앞에 있는 것이었죠.
결국 알고 봤더니 원인은 제가 테스트 하던 Notepad++이란 프로그램에 있었습니다. 그쪽에서 자꾸 앞으로 가도록 메시지를 날리고 있었던 것이었죠. 제 PC에 설치된 버전이 4.0.2였는데, 4.1.2를 설치하니 그 문제가 해결되더군요. 이 것 때문에 날린 시간을 생각하면 ^^