[インデックス 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
関連の定義を拡張することです。
具体的には、以下の変更が行われました。
- 16進数プレフィックスの追加:
Numbers, prefix2
の定義が空から0x 0X
に変更されました。これにより、Notepad++ は0x
または0X
で始まる数値を16進数として認識し、適切にハイライトできるようになります。
- 16進数文字の追加:
Numbers, extras1
の定義が空からa b c d e f A B C D E F
に変更されました。これにより、16進数リテラルに含まれるアルファベット(a
からf
、大文字小文字)が数値の一部として認識され、正しくハイライトされるようになります。
- 虚数サフィックスの追加:
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">( ) [ ] { } ... , ; & ^ % > < ! = + - * / | :</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言語の仕様 - 数値リテラル: https://go.dev/ref/spec#Numeric_literals
- Notepad++ 公式サイト: https://notepad-plus-plus.org/
- Notepad++ ユーザー定義言語のドキュメント (一般的な情報): https://npp-user-manual.org/docs/user-defined-language/
参考にした情報源リンク
- Go言語の公式ドキュメント
- Notepad++ のユーザー定義言語に関するコミュニティフォーラムやドキュメント
- コミットメッセージと差分情報
- Go言語のコードレビューシステム (Gerrit) の変更リスト: https://golang.org/cl/13401047 (コミットメッセージに記載)