Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 15916] ファイルの概要

このコミットは、Go言語のソースコードをKateエディタで表示する際のシンタックスハイライトに関するバグ修正です。具体的には、Go言語のマルチラインのRaw String Literals(バッククォートで囲まれた文字列)が正しくハイライトされない問題を解決しています。

コミット

commit 80234d5c6bb44a83a5d6abf7c8215411f6f4bcb2
Author: Oling Cat <olingcat@gmail.com>
Date:   Sat Mar 23 15:16:58 2013 -0700

    misc/kate: fix multiline raw string syntax highlighting error.
    From VisualFC.
    Fixes #4862.
    
    R=golang-dev, minux.ma, r
    CC=golang-dev
    https://golang.org/cl/7568043
---
 misc/kate/go.xml | 2 +--
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/misc/kate/go.xml b/misc/kate/go.xml
index 1e00cfcbf5..c187eda82b 100644
--- a/misc/kate/go.xml
+++ b/misc/kate/go.xml
@@ -95,7 +95,7 @@
         <HlCHex attribute="Hex" context="#stay"/>
         <HlCChar attribute="Char" context="#stay"/>
         <DetectChar attribute="String" context="String" char="&quot;"/>
-        <DetectChar attribute="Multiline String" context="Multiline String" char="`"/>
+        <DetectChar attribute="String" context="Multiline String" char="`"/>
         <Detect2Chars attribute="Comment" context="Comment 1" char="/" char1="/"/>
         <Detect2Chars attribute="Comment" context="Comment 2" char="/" char1="*" beginRegion="Comment"/>
         <AnyChar attribute="Symbol" context="#stay" String=":!%&amp;()+,-/.*&lt;=&gt;?[]|~^&#59;"/>

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/80234d5c6bb44a83a5d6abf7c8215411f6f4bcb2

元コミット内容

このコミットは、misc/kate ディレクトリ内のGo言語のシンタックスハイライト定義ファイルにおいて、マルチラインのRaw String Literalsのシンタックスハイライトエラーを修正するものです。この修正はVisualFCによって提供され、GoのIssue #4862を解決します。

変更の背景

Go言語には、バッククォート(`)で囲まれたRaw String Literalsという特殊な文字列リテラルがあります。これは、エスケープシーケンスを解釈せず、複数行にわたる文字列をそのまま表現できるという特徴を持っています。

Kateエディタは、KDEデスクトップ環境で広く使われている高機能なテキストエディタであり、プログラミングIDEとしての機能も備えています。その機能の一つにシンタックスハイライトがあり、これは言語ごとのXML定義ファイルに基づいて実現されています。

以前のKateのGo言語シンタックスハイライト定義では、通常の引用符(")で囲まれた文字列と、バッククォートで囲まれたRaw String Literalsの扱いが異なっていました。特に、バッククォートで始まる文字列に対しては、attribute="Multiline String"という設定が適用されていました。しかし、この設定が原因で、マルチラインのRaw String LiteralsがKateエディタ上で正しくハイライトされないというバグ(Go Issue #4862)が発生していました。

このバグは、コードの可読性を損ない、開発者がGo言語のコードをKateで編集する際に不便を感じる原因となっていました。そのため、この問題を解決し、KateでのGo言語開発体験を向上させる必要がありました。

前提知識の解説

Go言語のRaw String Literals (バッククォート文字列)

Go言語では、文字列リテラルを定義する方法が2つあります。

  1. 解釈済み文字列リテラル (Interpreted String Literals): ダブルクォート(")で囲まれた文字列です。この文字列内では、\n(改行)、\t(タブ)などのエスケープシーケンスがGoコンパイラによって解釈され、対応する特殊文字に変換されます。複数行にわたる文字列を表現するには、各行の終わりに\nを含める必要があります。

    message := "Hello,\nWorld!" // "Hello,\nWorld!" は2行の文字列として解釈される
    
  2. Raw String Literals (Raw String Literals): バッククォート(`)で囲まれた文字列です。この文字列内では、エスケープシーケンスは一切解釈されず、バッククォートとバッククォートの間の文字がすべてそのままの形で文字列の内容となります。改行コードもそのまま文字列に含まれるため、複数行の文字列を記述するのに非常に便利です。正規表現やHTML、JSONなどの、エスケープ文字を多用する文字列を扱う際に特に有用です。

    html := `
    <html>
        <body>
            <h1>Hello, Go!</h1>
        </body>
    </html>
    ` // html変数は、改行やインデントを含むHTMLコードをそのまま保持する
    

このコミットで修正されたのは、このRaw String Literalsのシンタックスハイライトに関する問題です。

Kateエディタとシンタックスハイライト

Kateは、KDEプロジェクトの一部として開発されている高機能なテキストエディタです。プログラミング、マークアップ言語、スクリプト言語など、様々な種類のテキストファイルを編集するために設計されています。Kateの主要な機能の一つにシンタックスハイライトがあり、これによりコードの異なる要素(キーワード、文字列、コメントなど)が異なる色で表示され、可読性が向上します。

Kateのシンタックスハイライトは、XML形式の定義ファイルに基づいて行われます。これらのファイルは、特定の言語の構文規則を記述し、どのパターンがどの「属性」(色やスタイル)でハイライトされるべきかを指定します。

Kateのシンタックスハイライト定義ファイル (XML)

Kateのシンタックスハイライト定義ファイルは、通常.xml拡張子を持ち、特定の言語の構文要素を認識するためのルールを記述します。これらのファイルは、Highlighting要素をルートとし、その中にContextDetectCharDetect2CharsKeywordsなどの要素を含みます。

  • DetectChar: 特定の単一文字を検出するためのルールを定義します。
    • char: 検出する文字を指定します。
    • attribute: その文字が検出された際に適用されるハイライト属性(色やスタイル)を指定します。
    • context: その文字が検出された後に遷移するコンテキスト(状態)を指定します。#stayは現在のコンテキストに留まることを意味します。

このコミットで変更された行は、DetectChar要素を使用してバッククォート文字(`)を検出するルールを定義しています。

技術的詳細

このコミットの技術的な核心は、KateエディタのGo言語シンタックスハイライト定義ファイルであるmisc/kate/go.xml内のDetectChar要素のattribute値の変更にあります。

変更前の定義は以下の通りでした。

<DetectChar attribute="Multiline String" context="Multiline String" char="`"/>

この行は、バッククォート文字(`)を検出した際に、その文字列を「Multiline String」という属性でハイライトし、かつ「Multiline String」というコンテキストに遷移するように指示していました。

問題は、Kateのシンタックスハイライトシステムにおいて、「Multiline String」という属性が、Go言語のRaw String Literalsの期待されるハイライトと一致していなかった点にあります。GoのRaw String Literalsは、その性質上、内部に改行を含みますが、通常の文字列リテラルと同様に、単一の文字列として扱われるべきです。しかし、attribute="Multiline String"という設定が、Kateの内部的な処理で、この種の文字列を適切にハイライトできない、あるいは予期しない表示を引き起こす原因となっていました。

この修正では、attributeの値を"Multiline String"から"String"に変更しています。

<DetectChar attribute="String" context="Multiline String" char="`"/>

この変更により、バッククォートで始まる文字列は、通常の引用符で囲まれた文字列と同じ「String」属性でハイライトされるようになります。context="Multiline String"はそのまま維持されており、これはバッククォートで囲まれた文字列が複数行にわたる可能性があることをKateに引き続き認識させるために重要です。しかし、ハイライトの「見た目」を決定するattributeを一般的な「String」にすることで、KateはGoのRaw String Literalsを、他の通常の文字列と同様に、期待される色とスタイルで表示できるようになりました。

この修正は、KateエディタがGo言語のRaw String Literalsを正しく解釈し、視覚的に一貫性のあるシンタックスハイライトを提供するために不可欠でした。

コアとなるコードの変更箇所

--- a/misc/kate/go.xml
+++ b/misc/kate/go.xml
@@ -95,7 +95,7 @@
         <HlCHex attribute="Hex" context="#stay"/>
         <HlCChar attribute="Char" context="#stay"/>
         <DetectChar attribute="String" context="String" char="&quot;"/>
-        <DetectChar attribute="Multiline String" context="Multiline String" char="`"/>
+        <DetectChar attribute="String" context="Multiline String" char="`"/>
         <Detect2Chars attribute="Comment" context="Comment 1" char="/" char1="/"/>
         <Detect2Chars attribute="Comment" context="Comment 2" char="/" char1="*" beginRegion="Comment"/>
         <AnyChar attribute="Symbol" context="#stay" String=":!%&amp;()+,-/.*&lt;=&gt;?[]|~^&#59;"/>

コアとなるコードの解説

変更された行は、misc/kate/go.xmlファイルの96行目です。

変更前:

<DetectChar attribute="Multiline String" context="Multiline String" char="`"/>

この行は、バッククォート文字(`)を検出した際に、その文字列を「Multiline String」というハイライト属性で表示するように指定していました。しかし、この「Multiline String」属性が、Kateエディタの内部的な処理において、Go言語のRaw String Literalsの正しいハイライトを妨げていました。

変更後:

<DetectChar attribute="String" context="Multiline String" char="`"/>

この修正では、attributeの値を"Multiline String"から"String"に変更しています。

  • attribute="String": これにより、バッククォートで始まる文字列は、通常のダブルクォートで囲まれた文字列と同じ「String」属性でハイライトされるようになります。これは、GoのRaw String Literalsが、エスケープシーケンスを解釈しないという特殊性を持つものの、本質的には「文字列」であるというGo言語のセマンティクスと一致します。
  • context="Multiline String": この部分は変更されていません。これは、バッククォートで囲まれた文字列が複数行にわたる可能性があるという事実をKateに引き続き認識させるために重要です。このコンテキストによって、Kateは文字列の終了バッククォートを正しく探し、その間の内容を適切に処理することができます。

このシンプルなattributeの変更により、KateエディタはGo言語のマルチラインRaw String Literalsを、他の文字列と同様に、期待される色とスタイルで正しくハイライトできるようになり、Goコードの可読性が向上しました。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (Raw String Literalsに関する情報)
  • Kateエディタの公式ドキュメント (シンタックスハイライト定義に関する情報)
  • XMLの基本構文に関する一般的な知識
  • Gitのdiffコマンドの出力形式に関する一般的な知識