EmEditor v23.0 を公開しました (テクニカル レビューを含む)。

本日、EmEditor v23.0.0 を公開しました。

本バージョンは、従来の慣習を踏襲すると、本来は v22.6 と呼ぶのが相応しいのですが、本バージョンでは変更点が多く真にメジャーな更新であること、さらに本年最後のメジャーな更新になる予定であることから、今年 2023 年の下2桁に合わせて、今回は v23.0 と呼ぶことにしました。

最近、ChatGPT を含む生成 AI の進展により、様々な情報やサービスを Webブラウザを通して利用できるようになってきました。例えば、文章の翻訳や校正はもちろん、執筆からプログラム開発まで、より多くの分野に広がっています。こちらのお客様を含め、EmEditor のお客様の間には、外部ブラウザを使用しなくても、それらの Webサイトに EmEditor 内で使用したいと要望されるユーザー様が増えています。新バージョンでは、EmEditor ウィンドウ内のカスタム バーに Webブラウザを表示する機能を追加しました。この Webブラウザは、マクロと組み合わせて使用するように設計されているため、エディタ内の文書の一部を Webブラウザで表示されているサイトに送信したり、逆に、サイトの一部をエディタ内に取り込むことができるようになりました。注意点として、これらの機能を利用するには、[マクロのカスタマイズ] ダイアログの [オプション] ページで [JavaScriptエンジンとしてV8を使用する] が選択されているか、あるいは各マクロの最初の行に


#language = "V8"

の1行が指定されている必要があります。

具体的には、次の 2 つの機能が追加されています。

(1) web. キーワード: HTML の Document Object Model (DOM) にアクセスするには、小文字で web. キーワードを使用します。この背景には、EmEditor 内のオブジェクトと Webブラウザ内のオブジェクトを区別する必要が発生したためです。例えば、マクロで、


document.write( "テスト" );

と記述すると、EmEditor エディタ内に「テスト」と表示したいのか、あるいは Webブラウザの HTML に「テスト」と表示したいのか、区別がつかなくなります。そこで、Webブラウザで「テスト」と表示させたい場合には、document の前に web. を追加して、


// Webブラウザで「テスト」と表示
web.document.write( "テスト" );

と記述して実行します。このように指定すると、web. で始まるキーワードは Webブラウザで実行される命令だと解釈され、DOM にアクセスできるようになります。DOM を利用すると、例えば次のようなことが可能となります。


// 現在表示されている Webページの URL を返します
alert( web.location.href );

// ブラウザの優先言語を返します
alert( web.navigator.language );

// 現在表示されている Webページのテキストを新規文書に貼り付けます
editor.NewFile();
write( web.document.documentElement.innerText );

// 現在表示されている Webページの HTML を新規文書に貼り付けます
editor.NewFile();
write( web.document.documentElement.outerHTML );

(2) onLoad イベント: 最後に実行したマクロに function onLoad() から始まる関数が記述されている場合、Webページの更新や新ページのロードが完了時に、一度だけ呼ばれます。この機能を利用して、例えば、検索サイトで検索結果を取得することが可能になります。onLoad() を利用すると、例えば、次のようなことが可能となります。


function onLoad() {
    // HTML を取得して新規文書に貼り付けます
    editor.NewFile();
    document.write( web.document.documentElement.outerHTML );
}

Bing.jsee マクロ例では、Bing で検索した結果の HTML を取得し、その HTML を正規表現を使用して必要な情報のみを取得して表示する方法を示しています。ただし、注意点としては、検索サイトによっては Webページの更新や新ページのロードが行われないこともあることです。例えば、ChatGPT の無料サイトがその一例であり、そのようなサイトでは onLoad() イベントが発生しないため、残念ながら本イベントを利用して検索結果を取得することができなくなります。しかしながら、江村誠は、MutationObserver インターフェイスを使用して、特定の HTML エレメントを監視し、変更が発生したときにテキストを取得するというアイディアを思いつきました。ChatGPT.jsee マクロ例では、このインターフェイスを使って、ChatGPT からの回答を取得する方法を示しています。このマクロをそのまま実行すると、選択したテキストが ChatGPT のプロンプト ボックスに入力されるのみですが、99~100行目のコメントを解除すると、テキストを実際に送信します。免責事項:Bing および ChatGPT の応答のフォーマットは、将来、いつでも変更される可能性があり、その結果、このマクロの動作に影響を及ぼす可能性があります。このマクロは、EmEditor v23.0 の新機能を紹介することを唯一の目的としています。将来、これらのマクロが動作する保証はいたしません。

v23.0 のもう1つの主要な変更点は、巨大ファイルを扱う場合の高速化です。EmEditor のお客様の中には、数GB の巨大 CSV ファイルを扱うお客様が多くいらっしゃいます。そのような場合でも、EmEditor が軽快に速く動作しなければなりません。私は約 2GB の CSV ファイルを開いて、実際に様々な操作のテストを繰り返して、それらの操作が私のマシンでほぼ 1 秒以内に完了するように、多くのコマンドをマルチスレッド化して高速化しました。

CSV ファイルの列単位での削除や挿入といった操作を行うと、ファイルの全行が変更されるため、行単位で管理しているテキストエディタとしては、膨大な変更量を処理しなければなりません。従来のバージョンでは、巨大ファイルを扱う場合、変更行は一時ファイルに保存することによってシステム メモリの使用を抑えていましたが、全行をディスクに保存することになるため、非常に時間がかかっていました。v23.0 では、変更行を一時ファイルではなくメモリに保存することにより、より高速に動作するようになりました。ただ、この方法だとメモリが少ないシステムでは、かえって遅くなったり、システム メモリ不足でエラーが発生する場合があります。その場合には、[カスタマイズ] ダイアログの [高度] ページで、[編集時、一時ファイルを使用する] オプションを設定すると、従来の動作と同じ動作に戻ります。

これら 2点の改良を組み合わせることにより、CSV の列の削除、列の挿入、列の結合、列の並べ替え、列の貼り付け、その他、多くの CSV の列に対する操作が、v22.5 に比べて、約 21倍から 34倍に高速化しました

CSV コンバーターにおいても、従来のバージョンではマルチスレッド化していなかったため、巨大ファイルを扱うと動作が遅くなっていました。新バージョンではマルチスレッドと SIMD を使用して、より高速に動作するように改善し、数 GB のファイルであっても CSV フォーマットの変換が数秒以内に動作するようになりました。

さらに、日本語 (JIS) や日本語 (EUC) では、従来の Windows API の 1種である MultiLanguage オブジェクトの使用をやめて、独自のルックアップ テーブルを使用することにより、不正文字の検出ロジックを改善するとともに、ファイルを開いた後、検索などの多くの動作を大幅に高速化することができました。

v22.5 では、行番号の左端をクリックして、ブックマークの表示/非表示を切り替えられるようになりましたが、これがかえって不便だというあるお客様の要望により、この機能を無効にできるオプションを追加しました ([カスタマイズ] ダイアログボックスの [マウス] ページの [行番号の左端をクリックしてブックマークの表示/非表示を切り替え])。さらに、Markdown の設定では、Markdown 用の特別な構文を追加することにより、太字、斜体などの強調表示が、より正確に表現できるようになりました。

江村誠は、言語サーバー プロトコルを使用して、プログラム コードの選択範囲または文書全体をフォーマットを行う機能を追加しました。例えば、行頭のタブまたは空白の数、かっこ () または {} の表示位置や空白の有無などの揺れを無くして、見やすくするためのコマンドです。あらかじめフォーマットしたいコードを選択してから、[変換] メニューの [フォーマット] を選択すると、選択範囲をフォーマットします (ショートカット: Ctrl+K, F)。コードを選択しないで実行すると、全文書を選択するかどうかを選択するダイアログが表示されるので、そこで [継続する] を選択すると、文書全体をフォーマットします。または、Ctrl+K, D と押すことにより文書全体のフォーマットを行います。フォーマット コマンドを有効にするためには、設定のプロパティの [言語サーバー] ページで、[言語サーバー プロトコルを有効にする] オプションが設定されていて、その下の [文書タイプ] ドロップ ダウン リスト ボックスで使用する言語が選択されている必要があります。ここに記載されていないプログラミング言語については、EmEditor では対応していません。また、フォーマットの方法、例えば、カッコ内の空白の有無など、ユーザー毎に好みの異なる設定については、すべて言語サーバー側に依存されており、行頭のタブまたは空白の数を除き EmEditor 側で変更することはできません。

なお、本バージョンより、言語サーバー プロトコルの「(試験的)」の記述が無くなり、正式な機能となりました。それに伴い、C++、CSS、HTML、JavaScript、JavaScript for EmEditor、Perl、Python の設定では、言語サーバー プロトコルは既定で有効に設定されます。しかし、不要な場合には、設定のプロパティの [言語サーバー] ページで、いつでも無効にすることができます。

誠は、[コミット リスト (Git)] プラグインの変更サイド バーに [サブ モジュールの更新] オプションを追加して、サブ モジュールから変更をプルできるようになりました。また、予期される動作に関する混乱を避けるために、ステージング済みファイル一覧 (ステージングされていないファイルではない) から [変更を元に戻す] メニュー項目を削除しました。

さらに、従来のヘルプは古いシステムを使用していたため、デザインがあまり良くなく、保守が難しいという難点がありました。誠は、Sphinx を使用して、ヘルプのリデザインを思い付き、私共は、その変更を行いました。新しいヘルプは、GitHub の弊社のページ で保守、ビルドされています。

Pro版、Free版とも お気に入りいただけましたら幸いです。将来、ご質問、機能のリクエスト、アイディアなどがございましたら、ご連絡いただくか、フォーラムにご発言ください。

今後も EmEditor を引き続きご愛顧くださいますよう、よろしくお願い申し上げます。
— 江村豊

主な変更点、画面図など、詳しくは、「Version 23.0 の新機能」をご覧ください。

さらに本リリースは、v23.0 を開発中の不具合/問題の修正を含みます

デスクトップ インストーラー版をご使用の場合、[ヘルプ] メニューの [更新のチェック] を選択して更新していただけます。この方法で更新できない場合には、最新版をダウンロードして、そのダウンロードしたインストーラーを実行してください。デスクトップ ポータブル版の場合、こちらよりダウンロードして、更新していただけます。ストア アプリ版の場合、数日後、Microsoft ストア (64ビット または 32ビット) よりダウンロードまたは更新していただけます。