[インデックス 16886] ファイルの概要
このコミットは、Go言語のNotepad++におけるシンタックスハイライト定義を更新し、新しいUser Defined Language system (UDL2) に対応させるものです。これにより、Go言語のコードがNotepad++でより正確にハイライト表示されるようになります。特に、文字列リテラル内の引用符やバックスラッシュの扱い、そしてGo言語特有の識別子である _
(ブランク識別子) と .
(セレクタ) のハイライトに関する修正が含まれています。
コミット
commit c44e483542b7b9d8954d896f32c82f89bc86d9fc
Author: ChaiShushan <chaishushan@gmail.com>
Date: Sat Jul 27 08:12:42 2013 +1000
misc/notepadplus: use new User Defined Language system (UDL2)
Add missing single quotation and backslash marks.
Change dot and underscore character keyword type.
"_" is a predeclared identifier, not a operator.
"." is a selector, x.f should be one identifier highlight.
So the fix is to change it.
Fixes #5775.
Fixes #5788.
Fixes #5798.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/10480044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c44e483542b7b9d8954d896f32c82f82f89bc86d9fc
元コミット内容
このコミットの元のメッセージは以下の通りです。
misc/notepadplus: use new User Defined Language system (UDL2)
Add missing single quotation and backslash marks.
Change dot and underscore character keyword type.
"_" is a predeclared identifier, not a operator.
"." is a selector, x.f should be one identifier highlight.
So the fix is to change it.
Fixes #5775.
Fixes #5788.
Fixes #5798.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/10480044
変更の背景
このコミットは、Notepad++のGo言語シンタックスハイライト定義が、Notepad++の新しいUser Defined Language system (UDL2) に対応していなかった問題を解決するために行われました。UDL2はNotepad++ v6.2以降で導入された、より柔軟で強力なユーザー定義言語の仕組みです。
以前の定義では、Go言語のコードをNotepad++で表示した際に、以下の問題がありました。
- 文字列リテラル内の引用符とバックスラッシュのハイライト不足: Go言語の文字列リテラル(特にバッククォート文字列やダブルクォート文字列)内で使用されるシングルクォートやバックスラッシュが正しくハイライトされず、視認性が低下していました。
_
(ブランク識別子) の誤ったハイライト: Go言語において_
は特別な意味を持つ「ブランク識別子」であり、変数宣言などで値を破棄する際に使用されます。しかし、以前の定義ではこれを演算子として誤ってハイライトしていました。.
(セレクタ) の誤ったハイライト: Go言語において.
は構造体のフィールドやパッケージのメンバーにアクセスするための「セレクタ」です。例えばx.f
のような表現では、x.f
全体が1つの識別子としてハイライトされるべきですが、以前の定義では.
を単独の演算子としてハイライトしていました。
これらの問題を解決し、Notepad++でのGo言語開発体験を向上させるために、UDL2への移行とそれに伴う定義の修正が必要とされました。
前提知識の解説
Notepad++ と User Defined Language (UDL)
Notepad++は、Windowsで広く利用されている高機能なテキストエディタです。プログラミング言語のシンタックスハイライト機能は、コードの可読性を高める上で非常に重要です。Notepad++では、標準で多くの言語に対応していますが、ユーザーが独自の言語定義を追加することも可能です。これが「User Defined Language (UDL)」です。
UDLはXML形式のファイル (userDefineLang.xml
) で定義され、キーワード、演算子、コメント、文字列などの要素に対して色やスタイルを設定できます。
User Defined Language system (UDL2)
Notepad++ v6.2で導入されたUDL2は、従来のUDLシステムを改良し、より高度なシンタックスハイライト機能を提供します。主な改善点としては、以下が挙げられます。
- より詳細なキーワード分類: 従来のUDLよりも多くのキーワードグループ(Keywords1〜8)が利用可能になり、より細かくキーワードを分類して異なるスタイルを適用できるようになりました。
- デリミタの強化: 文字列やコメントなどのデリミタ(区切り文字)の定義が強化され、エスケープシーケンスやネストされたデリミタの扱いが改善されました。これにより、引用符やバックスラッシュを含む文字列のハイライトがより正確に行えるようになりました。
- フォールディングの改善: コードの折りたたみ(フォールディング)に関する設定がより柔軟になりました。
- XML構造の変更: UDL2の定義ファイルは、従来のUDLとは異なるXMLスキーマを使用します。
Go言語の _
(ブランク識別子)
Go言語には「ブランク識別子 (blank identifier)」と呼ばれる特別な識別子 _
が存在します。これは、変数宣言や関数の戻り値などで、特定の値を「破棄する」ために使用されます。例えば、複数の戻り値を持つ関数で、一部の戻り値が不要な場合に _
を使用します。
func doSomething() (int, error) {
// ...
return 1, nil
}
func main() {
// エラー値は不要なので破棄
result, _ := doSomething()
fmt.Println(result)
}
_
は通常の変数とは異なり、値を保持せず、再宣言も可能です。これはGo言語の設計思想の一つである「未使用変数の禁止」ルールを回避するためにも利用されます。Notepad++のシンタックスハイライトにおいては、これを通常の演算子としてではなく、特別な識別子として認識し、適切にハイライトする必要があります。
Go言語の .
(セレクタ)
Go言語において .
は、主に以下の2つの目的で使用される「セレクタ (selector)」です。
- 構造体のフィールドアクセス: 構造体のインスタンスからそのフィールドにアクセスするために使用します。
type Person struct { Name string Age int } p := Person{Name: "Alice", Age: 30} fmt.Println(p.Name) // p.Name で Name フィールドにアクセス
- パッケージのメンバーアクセス: インポートしたパッケージの関数、変数、定数、型などにアクセスするために使用します。
import "fmt" fmt.Println("Hello") // fmt パッケージの Println 関数にアクセス
シンタックスハイライトの観点からは、x.f
のような表現は x
と f
の間に .
があることで、全体として1つの意味を持つ識別子(またはその一部)として扱われるべきです。x
と f
がそれぞれ異なる色でハイライトされ、.
が単独の演算子としてハイライトされると、コードの視覚的なまとまりが損なわれる可能性があります。このコミットでは、x.f
全体を1つの識別子としてハイライトするように修正されています。
技術的詳細
このコミットの技術的な変更点は、主に misc/notepadplus/userDefineLang.xml
ファイルにおけるNotepad++のUDL定義の更新に集約されます。
-
UDL2への移行:
<UserLang>
タグにudlVersion="2.1"
属性が追加され、UDL2システムを使用することが明示されました。<Settings>
および<KeywordLists>
の内部構造がUDL2の新しいスキーマに合わせて変更されています。例えば、<Prefix>
タグの属性がwords1
からKeywords1
に変更され、より多くのキーワードグループが追加されています。
-
文字列リテラルとエスケープシーケンスのハイライト改善:
<KeywordLists>
内の<Keywords name="Delimiters">
の定義が大幅に拡張されました。- 以前は
"
と`
のみだったデリミタが、00" 01\\ 02" 03' 04\\ 05' 06
07 08"
), シングルクォート ('
), バッククォート (`
) の開始/終了デリミタと、バックスラッシュ (\
) のエスケープシーケンスが明示的に定義されました。 01\\
や04\\
のようにバックスラッシュをエスケープ文字として定義することで、文字列内のエスケープシーケンスが正しく認識され、ハイライトされるようになります。
-
_
(ブランク識別子) のハイライト修正:- 以前の定義では、
_
が<Keywords name="Operators">
に含まれていました。 - このコミットでは、
_
が<Keywords name="Operators1">
から削除され、代わりに<Keywords name="Keywords3">
に追加されました。 <Keywords name="Keywords3">
は、append
,cap
,close
などの組み込み関数やtrue
,false
,iota
,nil
といった組み込み定数と同じグループに分類されています。これにより、_
がGo言語の特別な識別子として適切にハイライトされるようになります。
- 以前の定義では、
-
.
(セレクタ) のハイライト修正:- 以前の定義では、
.
が<Keywords name="Operators">
に含まれていました。 - このコミットでは、
.
が<Keywords name="Operators1">
から削除されました。 - UDL2では、
.
のようなセレクタは通常、キーワードや演算子として明示的に定義するのではなく、言語の構文解析エンジンが識別子の一部として扱うことで、x.f
のような全体が適切にハイライトされるように設計されています。この変更により、Notepad++のGo言語ハイライトがGoのセレクタの振る舞いに合致するようになりました。
- 以前の定義では、
-
キーワードの再分類:
- Go言語のキーワードが、その種類に応じて
Keywords1
(制御構造、宣言など),Keywords2
(組み込み型、リテラルなど),Keywords3
(組み込み関数、ブランク識別子など) に細かく分類されました。これにより、Notepad++でGoコードを表示する際に、より意味に基づいた色分けが可能になります。
- Go言語のキーワードが、その種類に応じて
-
READMEファイルの更新:
misc/notepadplus/README
ファイルが更新され、UDL2を使用するためにはNotepad++ v6.2以降が必要であること、および新しいuserDefineLang.xml
のインストール手順が記載されました。特に、Notepad++のインストール方法(インストーラー版かzip/7z版か)に応じたuserDefineLang.xml
の配置場所が明確化されています。
コアとなるコードの変更箇所
このコミットで変更された主要なファイルは以下の2つです。
-
misc/notepadplus/README
:- Notepad++のGo言語シンタックスハイライトのインストール手順が更新されました。
- UDL2の導入に伴い、Notepad++ v6.2以降が必要である旨が追記されました。
userDefineLang.xml
の配置場所が、Notepad++のインストール方法(インストーラー版とzip/7z版)に応じて具体的に記述されました。- UDL2に関する参照リンクが追加されました。
-
misc/notepadplus/userDefineLang.xml
:<UserLang>
タグにudlVersion="2.1"
が追加されました。<Settings>
および<KeywordLists>
の内部構造がUDL2の新しいスキーマに合わせて変更されました。<Keywords name="Delimiters">
の定義が拡張され、シングルクォートとバックスラッシュが追加されました。<Keywords name="Operators">
から_
と.
が削除されました。_
が<Keywords name="Keywords3">
に移動されました。- Go言語のキーワードが
Keywords1
,Keywords2
,Keywords3
に再分類されました。 <Styles>
セクションもUDL2の新しいスタイル定義に合わせて更新されました。
コアとなるコードの解説
misc/notepadplus/userDefineLang.xml
の変更点
<!-- 変更前 -->
<UserLang name="go" ext="go">
<Settings>
<Global caseIgnored="no" />
<TreatAsSymbol comment="no" commentLine="no" />
<Prefix words1="no" words2="no" words3="no" words4="no" />
</Settings>
<KeywordLists>
<Keywords name="Delimiters">"`0"`</Keywords>
<Keywords name="Operators">( ) [ ] { } ... . , ; _ & ^ % > < ! = + - * / | :</Keywords>
<Keywords name="Words1">append bool break byte cap case chan close complex complex128 complex64 const continue copy default defer delete else error fallthrough false float32 float64 for func go goto if iota imag import int int16 int32 int64 int8 interface len make map new nil package panic print println range real recover return rune select string struct switch true type uint uint16 uint32 uint64 uint8 uintptr var</Keywords>
<!-- ... その他のKeywords ... -->
</KeywordLists>
<Styles>
<!-- ... 従来のスタイル定義 ... -->
</Styles>
</UserLang>
<!-- 変更後 -->
<UserLang name="go" ext="go" udlVersion="2.1">
<Settings>
<Global caseIgnored="no" allowFoldOfComments="yes" foldCompact="no" forcePureLC="0" decimalSeparator="0" />
<Prefix Keywords1="no" Keywords2="no" Keywords3="no" Keywords4="no" Keywords5="no" Keywords6="no" Keywords7="no" Keywords8="no" />
</Settings>
<KeywordLists>
<Keywords name="Comments">00// 01 02 03/* 04*/</Keywords>
<Keywords name="Operators1">( ) [ ] { } ... , ; & ^ % > < ! = + - * / | :</Keywords>
<Keywords name="Keywords1">break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var</Keywords>
<Keywords name="Keywords2">bool byte complex64 complex128 error float32 float64 int int8 int16 int32 int64 int8 rune string uint uint8 uint16 uint32 uint64 uintptr true false iota nil</Keywords>
<Keywords name="Keywords3">append cap close complex copy delete imag len make new panic print println real recover _</Keywords>
<Keywords name="Delimiters">00" 01\\ 02" 03' 04\\ 05' 06` 07 08` 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23</Keywords>
<!-- ... その他のKeywords ... -->
</KeywordLists>
<Styles>
<WordsStyle name="DEFAULT" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<WordsStyle name="COMMENTS" fgColor="AAAAAA" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
<!-- ... その他の新しいスタイル定義 ... -->
</Styles>
</UserLang>
udlVersion="2.1"
: これがUDL2を使用するための最も重要な変更点です。Notepad++はこれを見て、新しい解析エンジンを使用します。<Settings>
の変更:allowFoldOfComments
,foldCompact
,forcePureLC
,decimalSeparator
などの新しい属性が追加され、コメントの折りたたみや数値の扱いに関する設定がより詳細になりました。<Prefix>
タグの属性名もwordsN
からKeywordsN
に変更されています。<KeywordLists>
の変更:Delimiters
の定義が大幅に拡張され、シングルクォート ('
) とバックスラッシュ (\
) がエスケープ文字として追加されました。01\\
や04\\
のように、バックスラッシュ自体をエスケープする必要があるため、二重にエスケープされています。これにより、Go言語の文字列リテラル内のエスケープシーケンスが正しくハイライトされるようになります。Operators
がOperators1
に変更され、_
と.
が削除されました。_
はKeywords3
に移動されました。これは、append
,cap
,close
などのGoの組み込み関数と同じグループに属することで、特別な識別子として扱われることを意味します。- Go言語の予約語や組み込み型が
Keywords1
,Keywords2
,Keywords3
に適切に分類されました。例えば、break
,default
,func
などはKeywords1
に、bool
,byte
,int
などはKeywords2
に、append
,cap
,_
などはKeywords3
に分類されています。
<Styles>
の変更: UDL2の新しいスタイル定義に合わせて、styleID
属性が削除され、nesting
属性が追加されました。これにより、より柔軟なスタイル設定が可能になります。
これらの変更により、Notepad++はGo言語のコードをより正確に解析し、Go言語の構文規則に則った適切なシンタックスハイライトを提供できるようになります。特に、Go言語のブランク識別子 _
やセレクタ .
の特殊な振る舞いを考慮したハイライトは、開発者にとってコードの理解を深める上で非常に役立ちます。
関連リンク
- Notepad++ User Defined Languages: http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=User_Defined_Languages
- Notepad++ 6.2 Release (UDL2): http://notepad-plus-plus.org/news/notepad-6.2-release-udl2.html
- UDL2 Documentation (Weebly): http://udl20.weebly.com/index.html
- Go言語のブランク識別子: https://go.dev/doc/effective_go#blank
- Go言語のセレクタ: https://go.dev/ref/spec#Selectors
参考にした情報源リンク
- コミット情報:
/home/orange/Project/comemo/commit_data/16886.txt
- GitHub上のコミットページ: https://github.com/golang/go/commit/c44e483542b7b9d8954d896f32c82f89bc86d9fc
- Notepad++ UDL2に関する公式ドキュメントおよびコミュニティ情報
- Go言語の公式ドキュメント (Effective Go, Go言語仕様)