本日、EmEditor v23.1.0 を公開しました。
前バージョンの v23.0 では、新機能の Web ブラウザとマクロを使用して、生成 AI の Webサイトにアクセスし、様々な情報やサービスを取得する方法を紹介しました。しかし、生成 AI のサイトの有料の API キーをお持ちのお客様は、API を直接呼ぶことにより、より高速に、より高いサービスを、より安定した動作で取得することができます。そのためには、JavaScript の fetch 関数を使用する方法が使われますが、この関数は非同期に動作するため、マクロが終了前に関数の戻り値が得られないことがありました。実は、v23.0 でも、EmEditor 内蔵の Web ブラウザを表示していれば、この方法も可能だったのですが、Web ブラウザが表示されていない場合は、非同期関数が使えない問題がありました。本バージョンの v23.1 では、KeepRunning プロパティを使用することにより、マクロを終了せずに、非同期関数の終了を待つことができるようになりました (Professional 版のみ)。非同期関数を呼ぶ前に、KeepRunning プロパティは、以下のように指定します。
shell.KeepRunning = true;
すると、マクロが実行されたままになり、非同期関数の戻り値を得ることができます。このままだと、いつまでもマクロが実行されたままになりますので、非同期関数の戻り値を得られて、マクロの実行を終了したい場合には、次のように指定します。
shell.KeepRunning = false;
これは、非同期関数の終了を待っている状態では、Quit() とほぼ同等で、マクロがすぐに終了します。
以下に、fetch 関数を利用して、ChatGPT の開発元である OpenAI が提供している OpenAI API を利用するサンプル マクロを示します。このサンプル マクロを実行するには、{your-API-key} をお客様の API キーに書き換える必要があります。以下のマクロを実行すると、OpenAI API に「お元気ですか?」と質問を送り、その回答をアウトプット バーに表示します。
#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 = "お元気ですか?";
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 のもう 1つの主要な変更点は、巨大ファイルの処理速度の向上です。前バージョンの v23.0 では、変更行を一時ファイルではなくメモリに保存することで高速動作が実現しました。しかし、この方法ではメモリが少ないシステムでは逆に遅くなったり、メモリ不足でエラーが発生する可能性がありました。[カスタマイズ] ダイアログの [高度] ページで、[編集時、一時ファイルを使用する] オプションを設定することで従来と同じ動作に戻すことも可能でしたが、ファイルのサイズによって設定を切り替えるのは煩雑です。v23.1 では、メモリに関連するアルゴリズムを見直し、より効率的な動作を実現しました。さらに、仮想メモリが不足すると一時ファイルを使用してデータを保存するようにしました。これにより、仮想メモリのサイズに気を遣わずとも、メモリ不足によるクラッシュの頻度を大幅に軽減することができました。このメモリ関連の改善の効果と、マルチスレッド、SIMD 命令セットの使用により、CSV を含む巨大ファイルの編集時に多くのコマンドで、v23.0 に比べて 1.51 から 41.2 倍に高速化しました。
ヘルプは、EmEditor 内蔵の Web ブラウザではなく、v22.5 以前のように外部のブラウザを使用して表示することを既定の動作としました。さらに、[カスタマイズ] ダイアログ ボックスに [ヘルプ] ページを追加して、ヘルプに関する設定を変更することができるようになりました。
江村誠は、言語サーバー プロトコル (LSP) を使用して入力候補一覧を表示できるようにしました (Professional 版のみ)。この機能を利用するためには、設定のプロパティでの [言語サーバー] ページで、言語サーバー プロトコルが有効になっていて、[入力候補一覧を表示する] オプションが設定されている必要があります。現在のところ、JavaScript のみが入力候補一覧に対応しています。
Pro版、Free版とも お気に入りいただけましたら幸いです。将来、ご質問、機能のリクエスト、アイディアなどがございましたら、ご連絡いただくか、フォーラムにご発言ください。
今後も EmEditor を引き続きご愛顧くださいますよう、よろしくお願い申し上げます。
— 江村豊
主な変更点、画面図など、詳しくは、「Version 23.1 の新機能」をご覧ください。
さらに本リリースは、v23.1 を開発中の不具合/問題の修正を含みます。
デスクトップ インストーラー版をご使用の場合、[ヘルプ] メニューの [更新のチェック] を選択して更新していただけます。この方法で更新できない場合には、最新版をダウンロードして、そのダウンロードしたインストーラーを実行してください。デスクトップ ポータブル版の場合、こちらよりダウンロードして、更新していただけます。ストア アプリ版の場合、数日後、Microsoft ストア (64ビット または 32ビット) よりダウンロードまたは更新していただけます。