先日、Visual Studio Codeの新しい拡張機能で、VS Codeが4Dと通信してコードを管理できるようになったことをお話しました。シンタックスハイライトは、4D v19 R6の最初のLanguage Server Protocolの機能でした。それでは、ソースコードのレンダリングをカスタマイズする方法を見ていきましょう。
下図のように、シンタックスハイライトを独自のスタイルシートまたは4Dのデフォルトスタイルシートにカスタマイズすることができます。

さらに技術的な情報を見てみましょう。
セマンティックトークン
すべてのプログラミング言語において、コードはセマンティックトークンで構成されています。セマンティック・トークンとは、クラス、メソッド、変数など、ユニークな意味を持つコードの一部分です。他の言語と同様に、4Dコードもセマンティックトークンとモディファイアに分割されています。
VS Codeでは、コードエディターでセマンティックトークンを確認することができます。表示方法は、VSコードのコマンドパレットを開き、「エディタのトークンとスコープを検査」を検索し、選択します。

パレットには、セマンティックトークンとそのモディファイアを含む、カーソルの後ろのコード部分のプロパティが表示されます(もしあれば)。コードの他の部分を選択するだけで、関連するプロパティを直接見ることができます。

以下は、4D言語とLSPセマンティックトークン間のマッピング表です。
| LSPセマンティックトークン | 4D言語 |
| メソッド | メソッド |
| メソッド.defaultLibrary | コマンド |
| メソッド.プラグイン | プラグインメソッド |
| プロパティ | オブジェクトの属性 |
| 関数 | オブジェクトメンバーファンクション |
| パラメータ | メソッドパラメータ、オブジェクトメンバーファンクションパラメータ |
| 変数.プロセス間 | プロセス間変数 |
| 変数.プロセス | プロセス変数 |
| 変数.ローカル | ローカル変数 |
| キーワード | キーワード |
| テーブル | テーブル |
| フィールド | フィールド |
| コメント | コメント |
| タイプ | タイプ |
| 定数 | 定数 |
| 文字列 | 文字列 |
| エラー | エラー |
フォントの設定方法は?
VS Codeは、4Dコードを自動的に認識しますが、それ以上何が必要でしょうか?これは最後のステップで、それぞれのセマンティックトークンのフォントを設定するのです。
これをカスタマイズするには、VS Codeが使用する設定ファイルを編集する必要があります。そのためには、VS Codeのコマンドパレットを開き、「Settings.json」を検索して編集してください。
ちなみに、VS CodeのSettings.jsonファイルは、ここに置かれています。
macOSの場合は、/Users/{UserName}/Library/Application Support/Code/User/settings.jsonとなります。
Windowsの場合は、C:³ Files³ Electronics Tools³ Electronics Tools³ Electronics Tools³ Electronics Tools³ Electronics Tools³ Electronics Tools³ Electronics Tools³.json。


4Dコードを「light 4D」と「dark 4D」のスタイルシートで表示するために追加するJSON設定は以下の通りです(settings.jsonで「4D-Analyzer.server.path」という行を探し、以下のブロック全体を上か下の行に挿入してください)。
"editor.semanticHighlighting.enabled": true,
"editor.semanticTokenColorCustomizations": {
"[Default Light+]":{
"enabled": true,
"rules": {
"*:4d": {"foreground": "#000000", "bold": false, "italic": false, "underline": false, "strikethrough": false},
"method:4d": {"foreground": "#000088", "bold": true, "italic": true},
"method.defaultLibrary:4d": {"foreground": "#068c00", "italic": false},
"method.plugin:4d": {"foreground": "#000000"},
"property:4d": {"foreground": "#a0806b"},
"function:4d": {"foreground": "#5f8e5e", "italic": true},
"parameter:4d": {"foreground": "#000b76", "bold": true},
"variable.interprocess:4d": {"foreground": "#ff0088"},
"variable.process:4d": {"foreground": "#0000ff"},
"variable.local:4d": {"foreground": "#0031ff"},
"keyword:4d": {"foreground": "#034d00", "bold": true},
"table:4d": {"foreground": "#532300"},
"field:4d": {"foreground": "#323232"},
"comment:4d": {"foreground": "#535353"},
"type:4d": {"foreground": "#068c00", "bold": true},
"constant:4d": {"foreground": "#4d004d", "underline": true},
"string:4d": {"foreground": "#000000"},
"error:4d": {"foreground": "#ff0000", "bold": true, "italic": true}
}
},
"[Default Dark+]":{
"enabled": true,
"rules": {
"*:4d": {"foreground": "#FFFFFF", "bold": false, "italic": false, "underline": false, "strikethrough": false},
"method:4d": {"foreground": "#1B79F3", "bold": true, "italic": true},
"method.defaultLibrary:4d": {"foreground": "#59BB00", "italic": false},
"method.plugin:4d": {"foreground": "#BFBFBF"},
"property:4d": {"foreground": "#A0806B"},
"function:4d": {"foreground": "#4EC36E", "italic": true},
"parameter:4d": {"foreground": "#0C70FF", "bold": true},
"variable.interprocess:4d": {"foreground": "#FF0088"},
"variable.process:4d": {"foreground": "#53B0EB"},
"variable.local:4d": {"foreground": "#18B3F1"},
"keyword:4d": {"foreground": "#575757", "bold": true},
"table:4d": {"foreground": "#CF5600"},
"field:4d": {"foreground": "#9C6765"},
"comment:4d": {"foreground": "#8F8F8F"},
"type:4d": {"foreground": "#59BB00", "bold": true},
"constant:4d": {"foreground": "#FA647F", "underline": true},
"string:4d": {"foreground": "#FFFFFF"},
"error:4d": {"foreground": "#ff0000", "bold": true, "italic": true}
}
}
},
各意味トークン型の後の「:4d」は必須ではありませんが、このシンタックスハイライトを4D言語に対してのみ設定できるようにすることに注意してください。こうすることで、他の言語に対するシンタックスハイライトはそのままになります。
設定を保存すると、コードエディタで直接効果を確認することができます
このカスタマイズは、Webパーツを含む4DプロジェクトでVS Codeを使用する際に有効です。すべての言語は、それぞれのシンタックスハイライトを保持しています。HTML、CSS、Javascript、そして今回は…。4D!
