EmEditor v23.1.0 출시 (기술 리뷰 포함)

오늘 EmEditor v23.1.0을 출시합니다.

이전 버전(v23.0)에서는 매크로와 EmEditor에 내장된 웹 브라우저를 사용하여 생성형 AI의 웹 페이지에 액세스하고 다양한 정보와 서비스를 얻는 방법을 소개했습니다. 그러나 생성형 AI 사이트의 유료 API 키가 있는 고객은 API를 직접 호출하면 더 빠르고 고품질의 서비스를 더 안정적으로 이용할 수 있습니다. 이를 위해서는 JavaScript의 fetch 함수를 사용하는데, 이 함수는 비동기적으로 동작하므로 매크로가 끝나기 전에 함수의 반환 값을 얻지 못할 수 있습니다. 실제로 v23.0에서도 EmEditor에 내장된 웹 브라우저가 표시되어 있으면 이 방법을 사용할 수 있었지만, 웹 브라우저가 표시되지 않으면 비동기 함수를 사용할 수 없다는 문제가 있었습니다. 이 새 버전(v23.1)에서는 KeepRunning 속성을 사용하여 매크로를 종료하지 않고 비동기 함수의 완료를 기다릴 수 있습니다(EmEditor Professional 전용). 비동기 함수를 호출하기 전에 다음과 같이 KeepRunning 속성을 지정하십시오.

shell.KeepRunning = true;

이렇게 하면 매크로가 계속 실행되어 비동기 함수의 반환 값을 얻을 수 있습니다. 비동기 함수의 반환 값을 얻은 후 매크로를 종료하려면 다음과 같이 지정하면 됩니다:

shell.KeepRunning = false;

이는 비동기 함수의 완료를 기다릴 때 Quit()와 거의 동일하며, 매크로는 즉시 종료됩니다.

다음은 fetch 함수를 사용하여 **OpenAI API**를 활용하는 샘플 매크로입니다. 이 샘플 매크로를 실행하려면 {your-API-key}를 자신의 API 키로 바꿔야 합니다. 다음 매크로를 실행하면 OpenAI API에 “How are you?”라는 질문을 보내고 답변을 출력 표시줄에 표시합니다.

#language="v8"

const apiKey = "{your-API-key}";

/**
 * Sends prompt to OpenAI and returns the response.
 * Docs: https://platform.openai.com/docs/guides/text-generation/chat-completions-api?lang=curl
 * @param {string} endpoint URL for request
 * @param {string} apiKey API key
 * @param {string} messageContent The prompt
 * @returns {string} The text content of the response
 */
async function callOpenAI(endpoint, apiKey, messageContent) {
    const response = await fetch(
        endpoint,
        {
            method: "POST",
            headers: {
                "Authorization": `Bearer ${apiKey}`,
                "content-type": "application/json",
            },
            body: JSON.stringify({
                "model": "gpt-3.5-turbo",
                "messages": [
                    {
                        "role": "user",
                        "content": messageContent,
                    }
                ],
            }),
        }
    );
    if (!response.ok) {
        alert(await response.text());
        Quit();
    }

    const responseObj = await response.json();
    if (responseObj.choices.length == 0) {
        alert("choices length is 0");
        Quit();
    }

    // Get content of first choice
    return responseObj.choices.pop().message.content;
}

async function main() {
    const endpoint = "https://api.openai.com/v1/chat/completions";
    const sPrompt = "How are you?";
    shell.KeepRunning = true;
    const response = await callOpenAI(endpoint, apiKey, sPrompt);
    OutputBar.writeln( response );
    OutputBar.Visible = true;
    shell.KeepRunning = false;
}
main();

CharOpenAI.jsee 매크로 예제는 현재 선택한 텍스트 또는 전체 문서에 대해 자주 사용하는 질문(“교정”, “요약”, “조회”, “번역”…)의 팝업 메뉴를 표시하여 이 샘플을 더 확장합니다. 질문을 선택하면 해당 질문을 OpenAI API로 보내고 답변을 출력 표시줄에 표시합니다.

실제로 저는 이 블로그를 작성하면서 CharOpenAI.jsee 매크로를 사용하여 번역과 교정을 하고 있습니다. 생성형 AI를 텍스트 편집기와 결합하여 작업 효율성을 크게 향상시킬 수 있었습니다.

v23.1의 또 다른 주요 변경 사항은 대용량 파일을 처리할 때의 속도 향상입니다. v23.0에서는 더 빠른 작업을 위해 줄 변경 내용을 임시 파일 대신 메모리에 저장했습니다. 그러나 메모리가 제한된 시스템에서는 시스템 메모리 부족으로 인해 속도가 느려지거나 오류가 발생할 수 있었습니다. v23.1에서는 메모리 관련 알고리즘이 더 효율적으로 작동하도록 수정되었습니다. 또한 가상 메모리가 부족해지면 이제 임시 파일을 사용하여 데이터를 저장합니다. 그 결과 사용자는 가상 메모리 크기에 대해 더 이상 걱정할 필요가 없으며 메모리 부족으로 인한 충돌 빈도가 크게 줄었습니다. 메모리 관련 코드의 개선과 멀티스레딩 및 SIMD 명령어 집합의 사용으로 CSV 파일을 비롯한 거대한 파일을 편집할 때 많은 명령에서 v23.0에 비해 1.51~41.2배 빨라졌습니다.

도움말 기능은 이제 v22.5 이전 버전과 마찬가지로 EmEditor의 내장 웹 브라우저 대신 외부 브라우저를 기본적으로 사용합니다. 또한 사용자 지정 대화 상자에 도움말 페이지가 추가되어 도움말 관련 설정을 변경할 수 있습니다.

마지막으로 Makoto Emura는 LSP(Language Server Protocol)를 사용하는 완성 목록 기능을 추가했습니다. 이 기능을 사용하려면 구성 속성의 언어 서버 페이지에서 언어 서버 프로토콜을 활성화하고 완성 목록 표시 옵션도 활성화해야 합니다(EmEditor Professional 전용). 현재 이 기능은 JavaScript만 지원합니다.

Professional 또는 Free 버전을 사용하든 EmEditor가 마음에 드시길 바랍니다. 질문, 기능 요청 또는 향후 아이디어가 있으면 문의하거나 포럼에 작성해 주십시오.

EmEditor를 사용해 주셔서 감사합니다!
— Yutaka Emura

자세한 내용과 스크린샷은 EmEditor v23.1의 새로운 기능을 참조하십시오.

이 릴리스에는 v23.1 개발 중의 모든 버그 수정도 포함되어 있습니다.

데스크톱 설치 프로그램 버전을 사용하는 경우 도움말에서 업데이트 확인을 선택하여 최신 버전을 다운로드할 수 있습니다. 이 방법이 실패하면 최신 버전을 다운로드하여 다운로드한 설치 프로그램을 실행하십시오. 데스크톱 휴대용 버전을 사용하는 경우 다운로드 페이지에서 최신 버전을 다운로드할 수 있습니다. Store 앱 버전은 며칠 후 Microsoft Store(64비트 또는 32비트)를 통해 업데이트할 수 있습니다.