テキストエディター「Mery」アルファ版 Ver 3.2.5 を公開、ダークモードに対応 (試験的)

テキストエディター「Mery」アルファ版 Ver 3.2.5 を公開、ダークモードに対応 (試験的)

今回はダークモードを試験的に実装したので、その概要を簡単にご紹介したいと思います。

スポンサーリンク

ダークモードに対応 (試験的)

画面の配色を暗くすることで目に優しく作業に集中でき、なおかつオシャレで省エネということでちょっとしたブームになったダークモード。

Windows 10 にダークモードが搭載されてからかれこれ 2 年ほどになりますが、現在では多くのアプリケーションがダークモードに対応しています。

しかしながら Windows 10 のダークモードがサポートしているのは UWP アプリのみで、Mery のような Win32 アプリは完全に取り残されてしまいました。

そんな Win32 アプリですが、実はこっそりダークモード関連の API が用意されていることがわかっており、これらの API が正式に公開される日を待ちわびていました。

2 年待ってもそんな日はやって来ませんでした。

どうやって実装したのか?

Win32 アプリからでも UWP アプリのモダンな外観を使えるようにして Win32 アプリを復活させるという「Project Reunion」なる計画がありますが、そういったものを使ったわけではなく、非公開 API と独自描画を使ってゴリゴリと実装しました。

どうやって実装したのか?

非公開 API ということで Windows 10 のバージョンによっては API の仕様が変わってしまうこともありえますし、実際に今までにも何度か仕様変更がありました。

そういった理由から非公開 API を使うのは最終手段だと思っていたのですが、CrystalDiskInfo さんや EmEditor さんなどの有名な Win32 アプリが続々と非公開 API を使ってダークモードに対応されているようなので Mery も便乗してみた次第です。

ちなみに、エクスプローラーやコマンドプロンプトのような Windows 標準の Win32 アプリがダークモードに対応したこともあってか、Windows 10 1903 [OS ビルド 18362] (2019年5月21日) 以降、非公開 API に大きな仕様変更はないようです。

Mery のダークモードは現時点 (2020年10月26日) で以下の環境で動作確認しました。

  • Windows 10 1809 (OS ビルド 17763)
  • Windows 10 1903 (OS ビルド 18362)
  • Windows 10 1909 (OS ビルド 18363)
  • Windows 10 2004 (OS ビルド 19041)
  • Windows 10 20H2 (OS ビルド 19042.572)
  • Windows 10 Insider Preview (OS ビルド 20201)

【追記】Mery のダークモードは現時点 (2020年11月02日) で以下の環境で動作確認しました。

  • Windows 10 1809 (OS ビルド 17763.1)
  • Windows 10 1809 (OS ビルド 17763.107)
  • Windows 10 1809 (OS ビルド 17763.195)
  • Windows 10 1809 (OS ビルド 17763.404)
  • Windows 10 1809 (OS ビルド 17763.615)
  • Windows 10 1809 (OS ビルド 17763.652)
  • Windows 10 1809 (OS ビルド 17763.678)
  • Windows 10 1809 (OS ビルド 17763.720) [非公開 API で仕様変更あり]
  • Windows 10 1809 (OS ビルド 17763.805)
  • Windows 10 1809 (OS ビルド 17763.1432)
  • Windows 10 1809 (OS ビルド 17763.1554)

ダークモードの設定方法

ダークモードはメインメニューから [オプション] をクリックして、[基本] カテゴリの中にある [外観モード] の項目から設定できます。

ダークモードの設定方法 1

  • ライト: 通常の外観モードです
  • ダーク: ダークモードを使用します
  • 自動: Windows 10 の [色] の設定に連動します

その項目の右側にある [アクセント カラーを使用する] をオンにすると、アクティブなタブなどの色に Windows 10 のアクセントカラーが適用されます。

ダークモードの設定方法 2

Windows 10 のアクセントカラーは、スタートメニューの [設定] から [個人用設定] を選択し、その中の [色] という項目で設定することができます。

ダークモードの設定方法 3

例えば本番環境と開発環境でカラーを変えて分かりやすくしたり、職場用と自宅用で気分を変えたりなどの用途で役に立つかもしれません。

また、エディター部分の色はダークモードの設定には連動しませんので、必要に応じて [表示] カテゴリの [テーマ] からお好みの暗いテーマを選択してください。

ダークモードの制限事項

Windows 10 は Win32 アプリ向けにダークモードを提供していません。

Mery のダークモードは非公開 API を使って無理やり実装しているものなので、UWP アプリのようなモダンな外観のダークモードとは異なる部分が多々ありますが、仕様上の制限事項ということでご了承ください。

  • Windows 10 1809 (OS ビルド 17763) 以上が必要

    Windows 10 のバージョンがそれより古い場合はダークモードを使用できません。

  • Windows 10 のアップデートによって動作しなくなる恐れがある

    Windows 10 のアップデートで非公開 API の仕様が変更されてしまうと、ダークモードが使用できなくなったり、Mery が起動しなくなったりするかもしれません。

  • ツールバーのアイコンが見づらい

    これはどうしようもない部分ですが、ダークモードに対応した高品質なアイコン素材集が欲しいところです。

    また、以前に当サイトで期間限定の特典として配布していた「マテリアルアイコン」を入手されていれば、それを使うことである程度は見やすくなるかもしれません。

  • ダークモードにならない箇所がある

    一部のコントロールはダークモードに対応していなかったり、実装が不十分だったりします。

  • プラグインはダークモードに未対応

    同梱されているアウトラインプラグインはダークモードに対応させておきましたが、MeryWiki で公開されているその他のプラグインはダークモードに対応していません。

  • Windows 10 のバージョンによって動作が異なることがある

    例えば、Windows 10 1809 ですとダークモードを強制する機能がありません。[外観モード] は [ライト] と [自動] の 2 つとなり、設定変更時には Mery の再起動が必要です。

万が一のときには…

Mery のダークモードは非公開 API を使っているため、Windows 10 のアップデートによってダークモードが使用できなくなるかもしれません。

ダークモードの API に仕様変更が発生した場合、自動的にダークモードをオフにして起動するようにはしているつもりですが、仕様の変わり方によっては Mery が起動できなくなってしまう可能性もあります。

そのような事態が発生した場合、Mery.ini * を書き換えてダークモードの設定を削除すれば、ダークモード関連の API を使用することなく Mery を通常通り起動できるようになります。

Mery を終了 (タスクトレイに常駐している場合はトレイアイコンも終了) した状態で、メモ帳などを使って Mery.ini のGeneralセクションにあるDarkMode=1 or 2の項目を削除します。

Mery.ini
[General]
DarkMode=0

* Mery.ini は通常、C:\Users\<ユーザー名>\AppData\Roaming\Mery\Mery.iniにあります。

テキストカーソルインジケーターに対応 (試験的)

Ver 3.2.2 では Windows 10 May 2020 Update (20H1) からの新機能、テキストカーソルインジケーターに対応してみました。

テキストカーソルインジケーターに対応 (試験的)

テキストカーソルインジケーターを有効にするとカーソルに目印が表示されるようになり、文字入力における視認性が向上します。

インジケーターの色やサイズも自由に変更することができるので、目立つ色にしておけばカーソルを見失うことがなくなります。

プレゼンなどで画面を共有しているときなんかにも役に立ちそうですね。

テキストカーソルインジケーターの設定方法

テキストカーソルインジケーターを使用するためには Windows 10 May 2020 Update (20H1) 以降が必要です。

テキストカーソルインジケーターを有効にすると Mery 以外にもメモ帳や Word など、対応しているすべてのアプリケーションでテキストカーソルインジケーターが表示されるようになります。

それではテキストカーソルインジケーターを有効にする手順をご紹介します。

テキストカーソルインジケーターの設定方法 1

[スタート] ボタンをクリックして [設定] を開き、その中の [簡単操作] を選択します。

[簡単操作] の設定画面が表示されたら、画面の左側にある項目の一覧から [視覚] カテゴリの中にある [テキスト カーソル] をクリックします。

[テキスト カーソル] の設定画面が表示されたら [テキスト カーソル インジケーターを有効する] という項目のスイッチをオンにします。

テキストカーソルインジケーターの設定方法 2

この画面からテキストカーソルインジケーターの色やサイズも変更することができるので、お好みの設定にカスタマイズしてみてくださいね。

メモ帳や Word などはこれだけの設定でテキストカーソルインジケーターが有効になります。

Mery でテキストカーソルインジケーターを有効にする

Mery でも標準でテキストカーソルインジケーターに対応できれば良いのですが、現在のところは試験的な機能となっているためオプション画面やメニューなどには表示していません。

Mery を終了 (タスクトレイに常駐している場合はトレイアイコンも終了) した状態で、メモ帳などを使って Mery.ini のDisplayセクションにCursorIndicator=1を追記します。

Mery.ini
[Display]
CursorIndicator=1

* Mery.ini は通常、C:\Users\<ユーザー名>\AppData\Roaming\Mery\Mery.iniにあります。

Windows 10 のテキストカーソルインジケーターはサーバー側 UI オートメーションプロバイダーを実装することで動作する仕組みになっているため、上記のオプションを設定すると Mery がサーバー側 UI オートメーションプロバイダーとして動作するようになります。
上記のオプションはテキストカーソルインジケーターが無効のときでも動作速度や安定性に多少影響があるものと思われますので、Mery でテキストカーソルインジケーターを使う必要がない場合は設定しないほうが良いです。

注意事項

テキストカーソルインジケーターは Windows 10 に搭載されて間もないこともあってか、インジケーターがカーソルに追従しなくなったり表示されなくなったり、アプリケーションを巻き込んでクラッシュしたりなど不安定といった情報をみかけます。

例えば、Microsoft 標準のコントロールでもウィンドウを移動させるとインジケーターが追従しないものもありますし、Google Chrome のテキストエリアなども同様、スクロールやウィンドウの移動でインジケーターが追従しなくなることがあるようです。

また、私の環境ではテキストカーソルインジケーターを有効にしていると Delphi 10.3 で [新規作成] から [VCL フォーム アプリケーション] を選択するだけで Delphi がクラッシュしてしまいます。

現状、これらの問題が Windows 10 のテキストカーソルインジケーターの不具合なのか、アプリケーション側の実装に不備があるのかは分かりません。

Mery でもそういった問題が発生するかもしれないということをご理解いただいたうえで、必要に応じて上記オプションをご利用いただければと思います。

ちなみに縦書きやマルチカーソルには対応していませんが、テキストカーソルインジケーターの仕様上、対応できる可能性は低いと思います。

変更ログ

本バージョンではいくつかの不具合修正や機能改善が含まれています。現在お使いのバージョンで問題がある場合はバージョンアップで改善されるかもしれません。

3.2.5 (2021-01-09)

  • exe ファイルの著作権情報を更新
  • 編集モードの構文解析でヌルポが発生する可能性があった箇所を修正
  • その他、細かい修正

3.2.4 (2021-01-07)

3.2.3 (2020-12-27)

  • Windows 10 20H2 の IME で [変換] キーを押したときに IME の動作がおかしくなることがある問題の対策

    特定の条件下で発生する問題のようです。いただいた情報をもとに対策を施してみましたが、他にも発生条件があるかもしれません。何かお気づきの点などがございましたら検証にご協力いただけると助かります。

    フォーラム 文字が打てない

  • アウトラインプラグインの [Alt + Up/Down で前/次のノードへ移動する] の仕様を見直した

    フォーラム Twitterに投稿されていたアレ!

3.2.2 (2020-12-24)

  • 鬼車を 6.9.6 に更新
  • Hunspell を 1.7.0 に更新
  • Ver 3.0.0 以降、[次の文字列を検索] と [前の文字列を検索] のショートカットキーの初期値が消えていたのを修正
  • DirectWrite で等幅フォントの幅がずれる対策が適用されていないケースがあったのを修正
  • ダークモードでクールバーのシェブロンを表示できるようにした

    シェブロンというのはメニューバーやツールバーではみ出した項目をメニュー表示するための [»] ボタンです。

  • ダークモードでアクセントカラーを変更したときのチラつきを軽減

    なるべくチラつかないようにしてみただけなので環境によってはチラつくことがあるかもしれません。

    フォーラム アウトラインのスクロールバーが……

  • ダークモードで単語補完ウィンドウを表示したときにリストの背景色が黒くなる問題を修正

    フォーラム ダークモードで単語補完したとき選択候補以外が視認しにくい

  • マクロの #icondark でダークモード用のアイコンを指定できるようにした

    フォーラム 【要望】ダークモード時のマクロアイコン切替え機能

  • マクロの document.selection.DestructiveInsert の動作を改善

    Visual Studio の EnvDTE の動作に合わせてみました。

  • 矩形選択で選択範囲をドラッグアンドドロップできるようにした

    これができないエディターは多いのですが、もしかして使い道がないからでしょうか?

  • 折り返し位置が変更されたときにスクロールバーの位置をなるべく保持するようにした

    フォーラム ペインを分割したときのカーソル位置

  • [保存する前に改行文字の前にある空白文字を削除] と [保存する前にファイルが改行で終了するようにする] でスクロール位置をなるべく保持するようにした

    EditorConfig で保存時の整形機能を使っている場合に効果が発揮されます。

    フォーラム カーソルが表示領域外にある時のキー押下

  • [変換中の文字列を挿入モードで入力] 有効時にオプションダイアログをキャンセルした後の最初の入力が確定される問題を修正

    フォーラム オプションダイアログキャンセル後、最初の入力が即確定される

  • アウトラインプラグインの設定に [Alt + Up/Down で前/次のノードへ移動する] を追加

    本体側にフォーカスがあるときにAlt+/でアウトラインの前/次のノードに移動できるようになります。

    Alt+ 方向キーは本体側でフリーカーソルモードに割り当てられているのでご注意ください。

    フォーラム Twitterに投稿されていたアレ!

  • 折り返しを挟んだ場合の末尾で [→] キーを押したときと、先頭で [←] キーを押したときの仕様を変更してみた (試験的)

    折り返しの先頭でキーを押したときはメモ帳の仕様と同様、前の行の末尾を 1 文字飛ばします。折り返しの末尾はメモ帳の仕様と異なり、キーで折り返しの末尾までカーソルを移動することができ、折り返しを超えると次の行の先頭を 1 文字飛ばします。

    副作用で折り返しを挟んだ場合のマクロのCharLeftCharRightが文字数と一致するようになります。

    折り返しをまたぐカーソル移動はエディターによって様々で、どの仕様も一長一短、賛否両論あると思いますが、キーボード操作でカーソルを折り返しの末尾に移動でき、なおかつ従来の Mery の仕様から違和感が少ないものということでこの仕様を採用してみました。ちなみに Visual Studio Code の仕様と同様です。

    フォーラム 1行の文字列が、折り返しで2行になっているときのカーソル移動

  • Windows 10 20H1 以降のテキストカーソルインジケーターに対応 (試験的)

    Windows 10 の機能として安定性に欠けるので没にしようと思ったのですが、ベータ版として実装してみたら?というご意見をいただいたので試験的に実装してみました。

  • その他、細かい修正

3.2.1 (2020-11-02)

  • ダークモードでウィンドウ分割時にペインを行き来すると画面の右端がチラつくことがあったのを修正
  • Per-Monitor DPI 対応の仕組みを作り直した

    フォーラム Per-Monitor DPI対応に不十分な点があります

  • Windows 10 1809 の特定のビルド (17763.720 ~ 17763.1554) でダークモードのタイトルバーが黒くならない問題の対策

    フォーラム ダークモードがタイトルバーにだけ適用されない

  • ダークモードに変更した直後、Mery を再起動するまでステータスバーの内容が更新されなくなる問題を修正
  • トゥルーインライン入力で入力時の装飾を波線から破線に変更 (お作法的に通常のインライン入力が波線、トゥルーインライン入力が破線っぽい)
  • DirectWrite で合字に対応 (試験的)
  • その他、細かい修正

3.2.0 (2020-10-26)

  • 鬼車を使った逆方向検索の実装方法を変更してみた

    フォーラム 検索の"前"と"次"で、正規表現"(?>pattern)"(原子的式集合)のヒットする回数が違う

  • ついでに鬼雲を使った逆方向検索の実装方法も変更してみた (本来の性能を発揮できるようになるはず)
  • Per-Monitor DPI でディスプレイ間を移動させたときに、特定の条件下でリストビューの表示がおかしくなる問題の対策

    フォーラム Per-Monitor DPI対応に不十分な点があります

  • ATOK で全角スペースをキーリピートで入力したときに画面に反映されるのが遅延する問題の対策
  • 前回の「その他、細かい修正」で ATOK の状態を示す小窓の位置がカーソルに追従しなくなっていたのでロールバック

    フォーラム Mery 3.1.0 試してみました

  • 選択範囲をドラッグしたときに表示される禁止マークの出現条件を調整

    フォーラム Mery 3.1.0での文字列の選択について

  • タブのドラッグアンドドロップで、タブの [X] ボタンの上にドロップしたときにも動作するようにした
  • ウィンドウ分割で選択範囲がないときもカーソル位置を同期するようにしてみた

    フォーラム ペインごとのカーソル位置と保存判定

  • ダークモードに対応してみた (試験的)
  • [オプション] から [鬼車を使用する] を設定できるようにしてみた (試験的)
  • タブのアイコンを Per-Monitor DPI に対応させた
  • ツールバーなどのヒントを Per-Monitor DPI に対応させた
  • 縦書きで DirectWrite オフのときの絵文字の文字間を修正
  • 印刷で接合された絵文字に対応 (カラー絵文字じゃないよ)
  • テーマのリソースを merycfg.dll に分離した
  • それにともないすべてのテーマを微調整した
  • その他、細かい修正

ダウンロード

導入が簡単なインストーラー版、設定ファイルを外部に作成しないポータブル版、レジストリを一切使用しない ZIP 版を用意しています。

インストーラー版

解凍などの作業が必要なく簡単に使えるインストーラー版です。

Mery Ver 3.2.5 (32 ビット版) インストーラー Mery Ver 3.2.5 (64 ビット版) インストーラー
VirusTotal で誤検出されたり SmartScreen で保護されたりしますが、もちろんウイルスではありません。ご心配なかたは正式版が Vector さんか窓の杜さんで公開されるまでお待ちください。

ポータブル版

インストールは不要。通常の ZIP 版と異なり設定ファイルを外部に作成しないので USB メモリに保存して持ち歩けますし、PC 環境を汚すこともありません。

Mery Ver 3.2.5 (32 ビット版) ポータブル Mery Ver 3.2.5 (64 ビット版) ポータブル
ポータブル版は解凍したフォルダの中に、設定ファイルなどのすべてのデータを保存しますので、必ずアクセス権のあるフォルダに配置してください。

ZIP 版

アーカイブを解凍するだけですぐに使える ZIP 版です。

Mery Ver 3.2.5 (32 ビット版) ZIP Mery Ver 3.2.5 (64 ビット版) ZIP
ZIP 版はレジストリを汚したくないかた向けにインストーラー版の内容を ZIP アーカイブにしたものです。1 つの環境に複数の Mery を導入する場合は ZIP 版ではなくポータブル版をご利用ください。

おわりに

アルファ版ということで鬼車に続いてダークモードを試験的に実装してみましたが、ツイッターでつぶやいた開発着手からかれこれ 1 年半も経過してしまいました。

おわりに

非公開 API の使い方は早い段階で分かっていたのですが、それを使って黒くできるのは一部のコントロールのみということで、その他のコントロールをどうやって黒くするかが大きな課題でした。

Delphi ですと VCL スタイルという機能があって、これを使えば簡単な操作であっという間にテーマ機能を実装できてしまうのですが、Mery では VCL スタイルを使っていません。

というのも、VCL スタイルは画像を使ってテーマ機能を実現しているため、リソースの埋め込みによるアプリケーションの肥大化と、リソースの読み込みによる起動速度の低下が避けられず、テキストエディターとしては致命的だったのです。

当初はそこまで考えが及ばず、数日かけてコツコツと VCL スタイルのスタイルファイルを制作していたこともありましたが、CrystalDiskInfo さんが非公開 API と独自描画を使ってダークモードに対応されたのを拝見し、私もイバラの道を進む覚悟を決めました。

そういうわけで、しばらくの間は Windows 10 の大型アップデートに注意しつつ、可能な範囲で非公開 API の仕様変更にも追従していくしかなさそうです。非公開 API が廃止されてしまった場合はどうしようもありませんが…。

それにしてもダークモードって良いものですね。

今まではなんか黒くてダッサと思って使っていませんでしたが、開発のために仕方なくダークモードに設定してから久しぶりにライトモードに戻してみたところ、あまりの眩しさに目を開けることができず、ダークモードから抜け出せない体になってしまいました。

スポンサーリンク

関連する記事

フォローする