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

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

このコミットは、Notepad++ のGo言語のシンタックスハイライト定義ファイル userDefineLang.xml を修正し、Go言語の数値リテラル、特に小数点以下の 0 が省略された浮動小数点数や虚数、および16進数表記のハイライトに関する問題を解決します。

コミット

commit e82031618aff8c69ed09970cce66b9fcaaa939b8
Author: ChaiShushan <chaishushan@gmail.com>
Date:   Mon Sep 23 11:35:17 2013 +1000

    misc/notepadplus: fix some number syntax highlight issue
    
    notepadplus can only support some normal golang's hex and imaginary numbers.
    it can't detect some special number, eg. 1./1.e/1.i/1+0.1i (omit "0" in ".0").
    
    R=golang-dev, gvdschoot
    CC=ajstarks, golang-dev
    https://golang.org/cl/13401047

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

https://github.com/golang/go/commit/e82031618aff8c69ed09970cce66b9fcaaa939b8

元コミット内容

このコミットは、Notepad++ のGo言語のシンタックスハイライト定義ファイル misc/notepadplus/userDefineLang.xml を修正し、Go言語の数値リテラル、特に小数点以下の 0 が省略された浮動小数点数や虚数、および16進数表記のハイライトに関する問題を解決します。具体的には、1., 1.e, 1.i, 1+0.1i のような形式の数値が正しくハイライトされない問題を修正します。

変更の背景

Notepad++ は、ユーザーがカスタム言語定義ファイル(userDefineLang.xml)を使用して、独自のシンタックスハイライトルールを定義できる強力なテキストエディタです。Go言語の初期の段階では、Notepad++ 用のGo言語のシンタックスハイライト定義が完全ではなく、特にGo言語が許容する特定の数値リテラル形式(例: 小数点以下の 0 を省略した浮動小数点数や虚数、16進数)が正しく認識されず、ハイライトされないという問題がありました。

この問題は、Go言語のコードをNotepad++ で編集する際に、数値が適切にハイライトされないため、コードの可読性が低下し、開発体験を損なうものでした。このコミットは、これらの特殊な数値形式をNotepad++ が正しく認識し、ハイライトできるようにするために行われました。

前提知識の解説

Go言語の数値リテラル

Go言語は、整数、浮動小数点数、虚数など、様々な形式の数値リテラルをサポートしています。

  • 整数リテラル: 10進数、8進数(0 プレフィックス)、16進数(0x または 0X プレフィックス)で表現できます。
    • 例: 42, 077, 0xFF
  • 浮動小数点数リテラル: 10進数で表現され、小数点または指数部(e または E)を含みます。Go言語では、小数点の前または後の 0 を省略することができます。
    • 例: 3.14, .5, 1., 1.2e3, 1.e-2
  • 虚数リテラル: 浮動小数点数または整数に i サフィックスを付けて表現します。
    • 例: 3.14i, 5i, .5i

Notepad++ のユーザー定義言語

Notepad++ は、ユーザーがXML形式のファイル(通常 userDefineLang.xml)を使って、独自の言語のシンタックスハイライトルールを定義する機能を提供しています。このファイルでは、キーワード、コメント、演算子、数値などの要素に対して、正規表現やプレフィックス/サフィックスを指定してハイライトルールを設定します。

  • Keywords タグ: 特定のカテゴリ(例: Numbers, prefix2, Numbers, extras1, Numbers, suffix2)に属するキーワードを定義します。
    • Numbers, prefix1, Numbers, prefix2: 数値のプレフィックス(例: 0x)。
    • Numbers, extras1, Numbers, extras2: 数値に含まれる追加の文字(例: 16進数の a-f)。
    • Numbers, suffix1, Numbers, suffix2: 数値のサフィックス(例: i)。

技術的詳細

このコミットは、Notepad++ のGo言語のユーザー定義言語ファイル misc/notepadplus/userDefineLang.xml を直接変更しています。変更の核心は、Go言語の数値リテラルの構文規則をNotepad++ がより正確に認識できるように、Keywords タグ内の Numbers 関連の定義を拡張することです。

具体的には、以下の変更が行われました。

  1. 16進数プレフィックスの追加:
    • Numbers, prefix2 の定義が空から 0x 0X に変更されました。これにより、Notepad++ は 0x または 0X で始まる数値を16進数として認識し、適切にハイライトできるようになります。
  2. 16進数文字の追加:
    • Numbers, extras1 の定義が空から a b c d e f A B C D E F に変更されました。これにより、16進数リテラルに含まれるアルファベット(a から f、大文字小文字)が数値の一部として認識され、正しくハイライトされるようになります。
  3. 虚数サフィックスの追加:
    • Numbers, suffix2 の定義が空から i に変更されました。これにより、i で終わる数値(虚数リテラル)が正しく認識され、ハイライトされるようになります。

これらの変更により、Notepad++ はGo言語の数値リテラル、特に 1., 1.e, 1.i のような小数点以下の 0 が省略された浮動小数点数や虚数、および16進数表記を、より正確に構文解析し、適切な色でハイライトできるようになります。これは、Notepad++ の正規表現エンジンが、これらの新しいキーワード定義に基づいて数値を識別するようになるためです。

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

--- a/misc/notepadplus/userDefineLang.xml
+++ b/misc/notepadplus/userDefineLang.xml
@@ -7,11 +7,11 @@
         <KeywordLists>
             <Keywords name="Comments">00// 01 02 03/* 04*/</Keywords>
             <Keywords name="Numbers, prefix1"></Keywords>
-            <Keywords name="Numbers, prefix2"></Keywords>
-            <Keywords name="Numbers, extras1"></Keywords>
+            <Keywords name="Numbers, prefix2">0x 0X</Keywords>
+            <Keywords name="Numbers, extras1">a b c d e f A B C D E F</Keywords>
             <Keywords name="Numbers, extras2"></Keywords>
             <Keywords name="Numbers, suffix1"></Keywords>
-            <Keywords name="Numbers, suffix2"></Keywords>
+            <Keywords name="Numbers, suffix2">i</Keywords>
             <Keywords name="Numbers, range"></Keywords>
             <Keywords name="Operators1">( ) [ ] { } ... , ; &amp; ^ % &gt; &lt; ! = + - * / | :</Keywords>
             <Keywords name="Operators2"></Keywords>

コアとなるコードの解説

変更は misc/notepadplus/userDefineLang.xml ファイル内の <KeywordLists> セクションに集中しています。

  • <Keywords name="Numbers, prefix2">:

    • 変更前: <Keywords name="Numbers, prefix2"></Keywords> (空)
    • 変更後: <Keywords name="Numbers, prefix2">0x 0X</Keywords>
    • この変更により、Notepad++ は 0x および 0X を数値の有効なプレフィックスとして認識するようになります。これはGo言語の16進数リテラル(例: 0xFF)を正しくハイライトするために不可欠です。
  • <Keywords name="Numbers, extras1">:

    • 変更前: <Keywords name="Numbers, extras1"></Keywords> (空)
    • 変更後: <Keywords name="Numbers, extras1">a b c d e f A B C D E F</Keywords>
    • この変更により、Notepad++ は16進数リテラルに含まれる a から f までの文字(大文字・小文字)を数値の一部として認識するようになります。これにより、0xdeadbeef のような16進数も正しくハイライトされます。
  • <Keywords name="Numbers, suffix2">:

    • 変更前: <Keywords name="Numbers, suffix2"></Keywords> (空)
    • 変更後: <Keywords name="Numbers, suffix2">i</Keywords>
    • この変更により、Notepad++ は i を数値の有効なサフィックスとして認識するようになります。これはGo言語の虚数リテラル(例: 3.14i, 5i)を正しくハイライトするために不可欠です。

これらの変更は、Notepad++ の内部的な構文解析ロジックに、Go言語の数値リテラルのより詳細な規則を組み込むことで、シンタックスハイライトの精度を向上させています。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Notepad++ のユーザー定義言語に関するコミュニティフォーラムやドキュメント
  • コミットメッセージと差分情報
  • Go言語のコードレビューシステム (Gerrit) の変更リスト: https://golang.org/cl/13401047 (コミットメッセージに記載)