EmEditor 플러그-인 제작 방법

EmEditor에서 매크로, 외부 도구, 및 코드 조각을 사용하여 거의 대부분의 작업을 자동화 할 수 있습니다. 하지만, 일부 사용자들은 여전히 특정 용도를 위한 플러그 인 개발을 원할 수 있습니다. 플러그 인의 작성의 이점들은 다음과 같습니다:

  • Win32 API로 C++ 코드를 작성할 수 있습니다.
  • 대화 상자와 같은 그래픽 사용자 인터페이스 (GUI) 요소를 작성할 수 있습니다.
  • 사용자 지정 표시줄, 사용자 도구 모음, 및 출력 바를 사용할 수 있습니다.

반면에, 사용하기 까다로운 Microsoft Visual C++ 사용을 필요로 할 수 있습니다. 하지만, 이미 C++ 또는 Win32를 사용하고 있는 경우, 플러그 인은 작성하기에 편리할 것입니다.

HELLO WORLD 샘플

Visual C++ 2012를 가지고 있지 않은 경우, Windows 데스크톱을 위한 Visual Studio Express 2012를 다운받아 설치 할 수 있습니다. 여기에서 다운로드 가능합니다:

EmEditor 웹사이트 라이브러리에서, Hello World!! 샘플 다운로드가 가능합니다. 여기에서 다운로드 할 수 있습니다:

이 파일을 다운로드 받고, 폴더에 압축을 해제하고, Visual C++로 Hello.sln 솔루션을 열면 Hello 프로젝트에 다음의 파일들이 포함되어 있는 것을 찾을 수 있습니다.

파일 이름용도편집의 필요성
etlframe.hETL (EmEditor Template Library) 헤더없음
hello.hHello World 플러그 인 구현 파일있음
plugin.hEmEditor 플러그 인 헤더없음
resource.hHello World 플러그 인 리소스 파일있음
stdafx.h미리 컴파일 헤더경우에 따라
bitmap1.bmp도구 모음 버튼 비트맵 (16 색, 16×16 픽셀)있음
hello.rcHello World 플러그 인 리소스있음
hello.cppHello World 플러그 인 구현 파일경우에 따라
hello.def정의 파일없음

이 파일 가운데, 편집이 필요한 파일을 hello.h, hello.rc, resource.h, 그리고 bitmap1.bmp 입니다. hello.cppstdafx.h은 헤더 파일 추가를 필요로 하는 경우에 수정 가능합니다. 다른 파일에는 Emurasoft에서 제공하는 헤더 파일 plugin.hetlframe.h가 있고 수정할 수 없습니다. 이 헤더 파일의 최신 버전을 다운로드 할 수 있습니다:

hello.def는 EmEditor가 필요한 내보내기 가능한 기능을 정의한 파일로 수정 할 필요가 없습니다.

첫번째로, 프로젝트를 열면 아무것도 변경하지 않고 작성을 시도해 보십시오. 그런 후에 파일 Hello.dll을 보게 될 것입니다. 이 파일을 EmEditor 설치 폴더의 PlugIn 하위 폴더에 복사합니다. 일반적으로 C:Program FilesEmEditorPlugIns 입니다. 다음으로 EmEditor를 실행하면, 플러그 인 도구 모음에 노란색 동그라미 버튼을 볼 수 있습니다. 그 버튼을 클릭하면 텍스트 편집기에 Hello World!!라는 텍스트가 보이게 됩니다.

다음 섹션에서는, 이 예제를 수정하여 플러그 인이 출력 표시줄을 열고, 출력 표시줄에 Hello World!! 텍스트를 표시하도록 해봅시다.

가장 중요한 기능: ONCOMMAND

hello.h 파일의 가장 중요한 기능은 OnCommand입니다. 사용자가 메뉴로부터 플러그 인을 선택하거나 플러그 인 버튼을 클릭했을 때 작동됩니다. 기능 내용을 수정하여 원하는 방향으로 플러그 인 작동을 변경할 수 있습니다. 이 샘플에서는, 기존의 Editor_InsertW 기능을 삭제한 후에, 다음의 Editor_OutputString 기능을 추가하십시오.

// Editor_InsertW( hwndView, L"Hello World!!n", true );
Editor_OutputString( hwndView, L"Hello World!!n", FLAG_OPEN_OUTPUT );

Editor_로 시작하는 위의 기능들은 plug-in.h에 정의되어 있습니다. EmEditor에서 hello.h를 연 후에, Editor_로 시작하는 기능 이름에 커서를 올려놓고, 그 기능에 관한 설명을 도움말에서 보려면 F1을 누릅니다.

hello.h 파일에서, 다음 중요한 기능은 QueryStatus입니다. QueryStatus 기능은 EmEditor가 메뉴를 표시하거나 도구 모음 버튼을 새로 고침 하기 위해 업데이트가 필요할 때 작동합니다. 이 기능은 플러그 인이 활성화 되면 TRUE를 반환합니다. 또한,

*pbChecked = TRUE

플러그 인 메뉴 항목을 체크하고 도구 모음 버튼을 누른 상태로 표시합니다.

OnEvents는 파일이 열려있을 때, 문서가 업데이트 되었을 때, 또는 다양한 다른 이벤트가 발생할 때 작동합니다. 이벤트의 목록은 도움말-플러그 인 참조-이벤트 페이지에서 찾을 수 있습니다. 이 이벤트들 중, 출력 표시줄에 “Text Changed!!” 텍스트를 표시하기 위해 EVENT_CHANGE 이벤트를 변경합니다. 이렇게 하려면, 다음의 3줄을 추가해야 합니다.

if( nEvent & EVENT_CHANGE ){
    Editor_OutputString( hwndView, L"Text changed!!n", FLAG_OPEN_OUTPUT );
}

리소스 수정

다음으로, hello.rc 파일을 보도록 하겠습니다. 이 파일은 플러그 인의 이름인 IDS_MENU_TEXT를 포함한 다양한 문자열을 정의합니다. 이 이름을 “Hello Test!“로 변경해 봅시다.

STRINGTABLE
BEGIN
    IDS_MENU_TEXT "Hello Test!"
    IDS_VERSION "1"
    IDS_SURE_TO_UNINSTALL "Are you sure you want to uninstall this Plug-in?"
END

더 나아가, bitmap1.bmp을 좋아하는 이미지로 대체하고 저장할 수 있습니다. 예를 들어, 빨간색 동그라미로 변경해 보도록 하겠습니다.

다 되었습니다. Visual C++로 샘플 프로젝트를 빌드하는 경우, 사용자 지정된 Hello.dll 플러그 인이 생성됩니다. 새로운 플러그 인을 EmEditor 설치 폴더의 PlugIn 하위 폴더에 복사하고 EmEditor를 실행하여 플러그 인 버튼을 클릭합니다. 출력 표시줄에 “Hello World!!” 텍스트가 나타납니다. 텍스트 편집기에 새로운 텍스트를 입력해 보면 출력 표시줄에 “Text changed!!” 텍스트가 나타나는 것을 볼 수 있습니다.

플러그 인 사용자 지정 시 참고 사항

위의 예에서, Hello 샘플을 수정하였습니다. 하지만, 처음부터 새로운 플러그 인을 작성하기 원하는 경우 올바른지 확인이 필요한 몇가지 포인트들이 있습니다. 그 중 하나는 hello.def과 같은 정의 파일을 준비하는 것입니다.이 파일은 DLL 파일이 반드시 내보내야 하는 기능을 정의합니다. 또다른 포인트는 hello.def 파일이 반드시 링커의 입력 모듈 정의 파일로 지정되어야 한다는 점입니다. 더 나아가, __stdcall은 반드시 C/C++의 고급 설정에서 호출 규칙을 지정해야만 합니다. C/C++의 코드 생성에서 멀티 스레드 DLL이 아닌 아닌 멀티 스레드를 선택합니다. 최적화에서 코드 크기 우선을 선택합니다. 이 방법은 플러그 인을 작게 만들고, 런타임 라이브러리에 대한 의존성을 줄일 수 있습니다.

표준 플러그 인 소스 코드

EmEditor과 함께 오는 몇몇의 플러그 인의 소스 코드는 여기에서 다운로드 가능합니다:

다음의 플러그 인 소스 코드를 사용할 수 있습니다:

  • HTML 모음 (HTMLBar)
  • 문서 열기 (OpenDocuments)
  • 텍스트 윤곽 (OutlineText)
  • 검색 (Search)
  • 단어 개수 (WordCount)

이 중에서 HTML Bar는 사용자 지정 도구 모음을 만드는데 좋은 참조가 됩니다. 다른 플러그 인은 사용자 지정 표시줄을 만드는데 좋은 참조가 됩니다. 자신만의 플러그 인을 개방하는데 참고로 이러한 소스코드를 사용합니다.

EmEditor 플러그 인을 생성하는 법에 대해 설명해 보았습니다. 간단한 샘플만을 만들어 보았지만 어떤 플러그 인을 만들지는 아이디어에 달려있습니다. 자신만의 유용한 플러그 인을 생성하고 생산성을 높이기위해 활용해주시기 바랍니다!