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

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

このコミットは、Go言語の統合開発環境(IDE)やテキストエディタのサポートに関連するもので、具体的にはNotepad++におけるGo言語のサポート改善を目的としています。misc/notepadplus/functionList.xmlmisc/notepadplus/userDefineLang.xmlの2つのファイルが変更されており、Go言語のインターフェースの関数リスト表示と、コメントのシンタックスハイライトの改善が行われています。

コミット

misc/notepadplus: add interface to function list and use clang color in comments

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

https://github.com/golang/go/commit/640a57c8811c5bd45f519fc65ff10443e9f5a8a2

元コミット内容

misc/notepadplus: add interface to function list and use clang color in comments

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/13587043

変更の背景

この変更は、Notepad++という人気のテキストエディタにおけるGo言語のサポートを向上させることを目的としています。Notepad++には、コード内の関数やクラスを一覧表示する「関数リスト」機能と、ユーザーが定義した言語のシンタックスハイライトを設定できる「ユーザー定義言語」機能があります。

以前のNotepad++のGo言語サポートでは、インターフェース内に定義されたメソッドが関数リストに適切に表示されなかったり、コメントのシンタックスハイライトが最適でなかったりする問題がありました。このコミットは、これらの問題を解決し、Notepad++でGo言語のコードをより快適に編集できるようにするためのものです。特に、Go言語のインターフェースは重要な概念であり、そのメソッドが関数リストに表示されないことは、コードのナビゲーションや理解を妨げる要因となっていました。また、コメントの色付けを一般的なC/C++/Objective-CコンパイラであるClangのデフォルト色に合わせることで、開発者にとってより視覚的に馴染みやすい環境を提供しようとしています。

前提知識の解説

Notepad++

Notepad++は、Windowsで動作するフリーのソースコードエディタおよびメモ帳の代替ソフトウェアです。多くのプログラミング言語に対応しており、シンタックスハイライト、コードの折りたたみ、関数リストなどの機能を提供します。

Notepad++の関数リスト (Function List)

Notepad++の関数リスト機能は、現在開いているファイル内の関数、クラス、構造体などの定義をツリービューで表示し、それらの定義に素早くジャンプできる機能です。この機能は、各言語に対応するXMLファイル(例: functionList.xml)によって設定されます。このXMLファイルには、正規表現を用いて、どのパターンを関数やクラスとして認識するかを定義します。

Notepad++のユーザー定義言語 (User Defined Language - UDL)

Notepad++のユーザー定義言語機能は、Notepad++が標準でサポートしていない言語や、特定のファイル形式に対して、ユーザーが独自のシンタックスハイライトやコードの折りたたみルールを定義できる機能です。これはuserDefineLang.xmlというXMLファイルに設定が保存されます。キーワード、演算子、コメント、文字列などの要素に対して、それぞれ異なる色やスタイルを設定できます。

Go言語のインターフェース

Go言語におけるインターフェースは、メソッドのシグネチャの集まりを定義する型です。インターフェースは、そのインターフェースで定義されたすべてのメソッドを実装する任意の型によって満たされます。Go言語では、明示的なimplementsキーワードは不要で、型がインターフェースのすべてのメソッドを実装していれば、そのインターフェースを満たしていると見なされます(ダックタイピング)。インターフェースは、ポリモーフィズムを実現し、柔軟な設計を可能にするGo言語の重要な特徴の一つです。

例:

type MyInterface interface {
    MethodA()
    MethodB(int) string
}

type MyStruct struct {}

func (s MyStruct) MethodA() {
    // ...
}

func (s MyStruct) MethodB(x int) string {
    // ...
    return "hello"
}

この例では、MyStructMyInterfaceを満たしています。

Clang

Clangは、C、C++、Objective-C、Objective-C++などのプログラミング言語をコンパイルするためのフロントエンドです。LLVMプロジェクトの一部として開発されており、高速なコンパイルと詳細なエラーメッセージが特徴です。多くのIDEやエディタで、Clangのシンタックスハイライトの配色が参考にされることがあります。

技術的詳細

このコミットは、Notepad++のGo言語サポートを改善するために、2つのXMLファイルを変更しています。

misc/notepadplus/functionList.xmlの変更

このファイルでは、Go言語のインターフェース内に定義されたメソッドを関数リストに表示するための新しいclassRange要素が追加されています。

  • classRange要素の追加:
    • mainExpr="^type\\s+\\w+\\s+interface\\s*\\{": この正規表現は、type MyInterface interface { のようなGo言語のインターフェース定義の開始行を検出します。これにより、Notepad++はインターフェースを「クラス」のような構造として認識し、その内部を解析するようになります。
    • openSymbole = "\\{"closeSymbole = "\\}": インターフェースの定義が波括弧 {} で囲まれていることを示します。
    • displayMode="node": 関数リストでの表示モードを設定します。
    • className要素:
      • nameExpr expr="type\\s+\\w+"
      • nameExpr expr="\\s+\\w+"
      • nameExpr expr="\\w+": これらの正規表現は、インターフェース名の抽出を試みます。例えば、type MyInterface interface から MyInterface を抽出します。
    • function要素(classRange内):
      • mainExpr="^\\s+\\w+\\s*\\(": この正規表現は、インターフェース内で定義されたメソッドのシグネチャ(例: MethodA()MethodB(int) string)を検出します。行頭の空白と、メソッド名、そしてその後に続く括弧 ( を捉えます。
      • functionName要素内のfuncNameExpr expr="\\w+": 検出されたメソッドシグネチャからメソッド名を抽出します。

この変更により、Notepad++の関数リストでGo言語のインターフェースとそのメソッドが階層的に表示されるようになり、コードのナビゲーションが大幅に改善されます。

misc/notepadplus/userDefineLang.xmlの変更

このファイルでは、Go言語のコメントのシンタックスハイライトの色が変更されています。

  • COMMENTSLINE COMMENTSfgColor属性の変更:
    • 変更前: fgColor="AAAAAA" (薄い灰色)
    • 変更後: fgColor="008000" (緑色)

この変更は、コメントの色をより視認性の高い緑色(RGB値で008000、これは一般的なClangのコメント色に似ています)に変更することで、コードとコメントの区別を明確にし、視覚的な快適さを向上させます。

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

misc/notepadplus/functionList.xml

--- a/misc/notepadplus/functionList.xml
+++ b/misc/notepadplus/functionList.xml
@@ -6,6 +6,23 @@
  		<!-- </associationMap> -->
  		<!-- <parsers> -->
  			<parser id="go" displayName="Go" commentExpr="((/\*.*?\*)/|(//.*?$))">
+			<classRange
+				mainExpr="^type\s+\w+\s+interface\s*\{"
+				openSymbole = "\{"
+				closeSymbole = "\}"
+				displayMode="node">
+				<className>
+					<nameExpr expr="type\s+\w+"/>
+					<nameExpr expr="\s+\w+"/>
+					<nameExpr expr="\w+"/>
+				</className>
+				<function
+					mainExpr="^\s+\w+\s*\(">
+					<functionName>
+						<funcNameExpr expr="\w+"/>
+					</functionName>
+				</function>
+			</classRange>
  				<function
  					mainExpr="(^func\s+\w+)|(^func\s*\(\s*\w*\s*\*?\s*\w+\s*\)\s*\w+)"
  					displayMode="$className->$functionName">

misc/notepadplus/userDefineLang.xml

--- a/misc/notepadplus/userDefineLang.xml
+++ b/notepadplus/userDefineLang.xml
@@ -36,8 +36,8 @@
         </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" />
-            <WordsStyle name="LINE COMMENTS" fgColor="AAAAAA" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="COMMENTS" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
+            <WordsStyle name="LINE COMMENTS" fgColor="008000" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
             <WordsStyle name="NUMBERS" fgColor="A52A2A" bgColor="FFFFFF" fontName="" fontStyle="0" nesting="0" />
             <WordsStyle name="KEYWORDS1" fgColor="AA0000" bgColor="FFFFFF" fontName="" fontStyle="1" nesting="0" />
             <WordsStyle name="KEYWORDS2" fgColor="AA0000" bgColor="FFFFFF" fontName="" fontStyle="1" nesting="0" />

コアとなるコードの解説

functionList.xmlの変更

追加された<classRange>要素は、Go言語のインターフェース定義をNotepad++の関数リストが認識できるようにするためのものです。

  • mainExpr="^type\\s+\\w+\\s+interface\\s*\\{": この正規表現は、Go言語のインターフェースの宣言(例: type MyInterface interface {)を検出します。これにより、Notepad++はインターフェースブロックの開始を認識します。
  • <className>内の<nameExpr>タグ群は、インターフェース名(例: MyInterface)を抽出するための正規表現を定義しています。
  • <function>タグは、インターフェースブロック内で定義されているメソッドを検出するためのものです。
    • mainExpr="^\\s+\\w+\\s*\\(": この正規表現は、インターフェース内のメソッド宣言(例: MethodA())を検出します。行頭の空白、メソッド名、そしてそれに続く括弧を捉えます。
    • <functionName>内の<funcNameExpr>は、検出されたメソッド名(例: MethodA)を抽出します。

これらの設定により、Notepad++の関数リストは、Go言語のインターフェースとその内部で定義されたメソッドを正確に解析し、ツリー構造で表示できるようになります。これにより、大規模なGoプロジェクトにおいて、インターフェースの定義と実装を追跡する作業が格段に容易になります。

userDefineLang.xmlの変更

この変更は非常にシンプルで、Go言語のコメントの表示色を薄い灰色(AAAAAA)から緑色(008000)に変更しています。これは、Notepad++でGo言語のコードを編集する際の視覚的な体験を向上させるためのものです。緑色は多くのプログラミングエディタでコメントのデフォルト色として使用されており、Clangなどのコンパイラが生成する出力の配色とも調和します。これにより、コメントがより目立つようになり、コードの可読性が向上します。

関連リンク

参考にした情報源リンク