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

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

このコミットは、Notepad++のバージョン6.5以降におけるGo言語のFunction List(関数リスト)の表示問題を修正するものです。具体的には、Notepad++のUser Defined Languages (UDL) の設定ファイルであるfunctionList.xmlにおいて、言語の関連付け方法が変更されたことに対応しています。

コミット

commit 33580e8305da21fced5d86c16cb64c71e33d09ef
Author: ChaiShushan <chaishushan@gmail.com>
Date:   Wed Dec 18 10:17:38 2013 -0800

    misc/notepadplus: Fix Function List in Notepad++ 6.5
    
    Since version 6.5, npp change the Function List syntax for User Defined Languages.
    We need use userDefinedLangName syntax in association tag in Notepad++ 6.5.
    
    Fix issue 6735.
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/22770043

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

https://github.com/golang/go/commit/33580e8305da21fced5d86c16cb64c71e33d09ef

元コミット内容

Notepad++ 6.5におけるFunction Listの修正。 バージョン6.5以降、Notepad++はUser Defined LanguagesのFunction List構文を変更しました。 Notepad++ 6.5では、関連付けタグ内でuserDefinedLangName構文を使用する必要があります。 Issue 6735を修正します。

変更の背景

このコミットの背景には、テキストエディタNotepad++のバージョン6.5における内部的な変更があります。Notepad++は、多くのプログラミング言語に対応するための強力な機能を提供しており、その一つに「Function List(関数リスト)」があります。これは、現在開いているファイル内の関数やメソッドの一覧を表示し、それらに素早くジャンプできるナビゲーション機能です。

Notepad++は、標準でサポートされていない言語に対しても、ユーザーが独自の言語定義(User Defined Languages, UDL)を作成できる機能を提供しています。UDLは、シンタックスハイライト、コードの折りたたみ、コメントの定義などをカスタマイズできる強力なメカニズムです。Go言語は、Notepad++の標準サポート言語ではありませんでしたが、ユーザーがUDLとして定義し、Function Listで関数を認識させるための設定ファイルが提供されていました。

問題は、Notepad++のバージョン6.5で、このFunction ListのUDLに対する設定ファイルの構文が変更されたことにあります。以前のバージョンでは、ファイル拡張子(例: .go)を使って言語とFunction Listのパーサーを関連付けていましたが、バージョン6.5からは、UDLの名前(userDefinedLangName)を使って関連付ける方式に変わりました。この変更により、Go言語のUDLを使用しているNotepad++ユーザーは、バージョン6.5にアップデートするとFunction Listが正しく機能しなくなるという問題(Issue 6735)が発生しました。

このコミットは、このNotepad++の仕様変更に対応し、Go言語のFunction ListがNotepad++ 6.5以降でも正しく機能するように、関連付けの設定を更新することを目的としています。

前提知識の解説

Notepad++

Notepad++は、Microsoft Windowsで動作するフリーかつオープンソースのテキストエディタです。プログラミング言語のソースコード編集に特化しており、シンタックスハイライト、コードの折りたたみ、タブインターフェース、マクロ記録、プラグインサポートなど、多くの高度な機能を備えています。軽量でありながら高機能であるため、開発者やシステム管理者など、幅広いユーザーに利用されています。

Function List (関数リスト)

Function Listは、Notepad++の主要な機能の一つで、現在開いているファイル内の関数、メソッド、クラス、構造体などの定義を一覧表示するパネルです。このリストから項目を選択することで、コード内の対応する定義箇所に直接ジャンプできます。これにより、大規模なソースコードファイル内でのナビゲーションが大幅に効率化されます。Function Listは、正規表現を使用してファイルの内容を解析し、定義を識別します。

User Defined Languages (UDL)

User Defined Languages(UDL)は、Notepad++が標準でサポートしていないプログラミング言語やテキスト形式に対して、ユーザーが独自のシンタックスハイライト、コードの折りたたみ、コメントスタイルなどを定義できる機能です。UDLは、キーワード、演算子、文字列、コメントなどの要素に異なる色やスタイルを割り当てることができ、特定のファイル拡張子と関連付けることで、その拡張子のファイルを開いた際に自動的にUDLが適用されます。UDLの設定は、通常userDefineLang.xmlというファイルに保存されます。

functionList.xml

functionList.xmlは、Notepad++のFunction List機能の設定を定義するXMLファイルです。このファイルには、各言語(組み込み言語およびUDL)がどのように解析され、関数が識別されるかに関するルールが記述されています。具体的には、以下の主要なセクションが含まれます。

  • <associationMap>: 言語と、その言語の関数を解析するためのパーサー(解析ルールセット)を関連付けるセクションです。ファイル拡張子(ext属性)やUDL名(userDefinedLangName属性)を使用して関連付けを行います。
  • <parsers>: 各言語の関数を識別するための正規表現ルールを定義するセクションです。各パーサーには一意のidが割り当てられ、<associationMap>で参照されます。

このファイルは、Notepad++のインストールディレクトリ内、またはユーザーのアプリケーションデータディレクトリ(例: %APPDATA%\Notepad++\functionList\)に配置されます。

技術的詳細

Notepad++のFunction List機能は、functionList.xmlというXMLファイルを通じて、どの言語のどのファイル拡張子に対して、どのパーサー(関数を識別するための正規表現ルールセット)を適用するかを定義します。

Notepad++のバージョン6.4までは、Go言語のようなUser Defined Language (UDL) の場合、functionList.xml内の<associationMap>セクションで、以下のようにファイル拡張子(.go)を使ってパーサーを関連付けていました。

<association ext=".go" id="go"/>

しかし、Notepad++のバージョン6.5以降、UDLに対するFunction Listの関連付けの仕組みが変更されました。この変更により、ファイル拡張子ではなく、UDLとして定義された言語の名前userDefinedLangName)を使用して関連付けを行う必要が生じました。これは、Notepad++がUDLを内部的に識別する方法の変更に起因します。

新しい構文では、<associationMap>内で以下のようにuserDefinedLangName属性を使用します。

<association userDefinedLangName="go" id="go"/>

ここで、userDefinedLangName="go"は、Notepad++でUDLとして「Go」という名前で定義されている言語を指します。id="go"は、functionList.xml内の<parsers>セクションで定義されている、Go言語の関数を解析するためのパーサーのIDを指します。

このコミットは、このNotepad++の仕様変更に対応するため、misc/notepadplus/functionList.xmlファイル内のGo言語の関連付けを、古いext=".go"形式から新しいuserDefinedLangName="go"形式に更新しています。これにより、Notepad++ 6.5以降のバージョンでも、Go言語のファイルでFunction Listが正しく機能するようになります。

変更は、既存のext=".go"行を削除し、代わりにuserDefinedLangName="go"行を追加する形で行われ、Notepad++のバージョンに応じたコメントも追加されています。

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

--- a/misc/notepadplus/functionList.xml
+++ b/misc/notepadplus/functionList.xml
@@ -1,8 +1,15 @@
 <!-- <NotepadPlus> -->
  	<!-- <functionList> -->
  	<!-- <associationMap> -->
++
++		<!--
++		if npp version == 6.4:
+ 		<association ext=".go" id="go"/>
+ 
++		if npp version >= 6.5:
++		<association userDefinedLangName="go" id="go"/>
++		-->
++
  	<!-- </associationMap> -->
  	<!-- <parsers> -->
  	<parser id="go" displayName="Go" commentExpr="((/\*.*?\*)/|(//.*?$))">

コアとなるコードの解説

このdiffは、misc/notepadplus/functionList.xmlファイルに対する変更を示しています。

  • - <association ext=".go" id="go"/>: この行は、Notepad++のバージョン6.4以前で使用されていたGo言語のFunction List関連付けの定義です。ファイル拡張子.gogoというIDのパーサーに関連付けていました。この行は削除されています。
  • + <!-- から + -->: 新しく追加されたXMLコメントブロックです。このコメントは、Notepad++のバージョンによって使用すべき関連付けの構文が異なることを説明しています。
    • if npp version == 6.4: の下には、古い構文である <association ext=".go" id="go"/> が示されています。
    • if npp version >= 6.5: の下には、新しい構文である <association userDefinedLangName="go" id="go"/> が示されています。
  • + <association userDefinedLangName="go" id="go"/>: この行が、Notepad++ 6.5以降に対応するための新しい関連付けの定義です。ext属性の代わりにuserDefinedLangName属性を使用し、Notepad++で「go」という名前で定義されたUser Defined LanguageをgoというIDのパーサーに関連付けています。

この変更により、Notepad++のバージョン6.5以降を使用しているユーザーは、Go言語のファイルを開いた際にFunction Listが正しく機能するようになります。コメントは、将来的にNotepad++のバージョンアップがあった際に、どちらの構文を使用すべきかを明確にするためのガイドラインとして機能します。

関連リンク

参考にした情報源リンク