ちなみに

火曜日の空は僕を押しつぶした。

VSCodeでGoの文字列内のSQLをシンタックスハイライトしたい

TL;DR

適当な Grammer 拡張を入れて以下の設定を書いておきましょう。

"gopls": {
  "ui.semanticTokens": true,

  // you can optionally turn on these features for more colors
  // see https://go.dev/issue/45753 and https://go.dev/issue/45792
  "ui.noSemanticString": true,  // delegates string syntax highlighting to vscode
  "ui.noSemanticNumber": true,  // delegates number syntax highlighting to vscode
}

本文

仕事では主に Go を書いていて、DBへのクエリは生のSQLを文字列で Go のファイル内に書いている。 このSQLはただの文字列なので当然シンタックスハイライトはされない。

Goland を使っている同僚は、JetBrains のテクノロジーによってシンタックスハイライトされるらしい。ずるい。 VSCode でもこれをやりたい。

実は VSCode でも特定の言語内に埋め込まれた別の言語をあつかう方法は用意されていて Injection grammars というやつを使うと実現できる。

難点は Grammer の設定は拡張にしか書けないので、手元でシュッとやることができない。 なんか適当なやつを入れるか、自分で拡張を書く必要がある。 自分は Inline SQL というやつを入れているが、シンタックスハイライトしたいだけには過剰なのでもっとシンプルなやつでいいと思います。

ところで VSCode で Go を書いている人はほぼ間違いなく Go拡張 を使っていると思います。

この拡張経由で gopls を使うと Semantic Highlighting によって、より正確なシンタックスハイライトが出来るわけですが、これを使うと Injection grammars を使うことができません。「文字列」としてトークナイズされて処理されるので文字列の色にしかなりません。

よって、以下のような設定で Semantic Tokens を無効にするような手段が提示されています。SQLシンタックスハイライトのために失うものが大きすぎる。

{
    "gopls.ui.semanticTokens": false
}

僕はこれをなんとかするために自前でテーマ拡張を書くことで文字列だけ Semantic Highlighting の対象外にする力業をやっていました。

しかし、実は ui.noSemanticString 使うことで回避できるらしい。そしてよくみると Features に しっかり書いて あった。 2022年の8月ごろ に実装された設定らしく、拡張側のドキュメントに記載されたのが 2023年2月 ごろなので、気付くのに一年以上かかってしまった。