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

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

このコミットは、Go言語のNotepad++用オートコンプリート定義ファイル misc/notepadplus/go.xml に対する変更です。具体的には、Go言語の組み込み関数(append, cap, close, complex, copy, delete, imag, len, make, new, panic, print, println, real, recover)に対して、Notepad++のCalltips(関数呼び出しヒント)機能のサポートを追加しています。

コミット

commit 844bc6c0acdb053936321739083cab80c4a913d4
Author: ChaiShushan <chaishushan@gmail.com>
Date:   Wed Aug 14 13:41:36 2013 +1000

    misc/notepadplus: support Calltips
    
    Fixes #5789.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/10601043

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

https://github.com/golang/go/commit/844bc6c0acdb053936321739083cab80c4a913d4

元コミット内容

このコミットの元の内容は、Notepad++のGo言語用オートコンプリート定義ファイル go.xml に、Go言語の組み込み関数に対するCalltips(関数呼び出しヒント)の情報を追加することです。これにより、Notepad++でGo言語のコードを記述する際に、これらの組み込み関数を呼び出す際に引数の型や戻り値の型に関するヒントが表示されるようになります。

具体的には、KeyWord タグに func="yes" 属性を追加し、その中に Overload タグと Param タグを用いて関数のシグネチャ(引数と戻り値)を定義しています。

変更の背景

この変更の背景には、Go言語の組み込み関数を使用する際に、その関数の正しい使い方(引数の型や数、戻り値の型など)を開発者が簡単に参照できるようにするという目的があります。Notepad++のようなテキストエディタでは、コード補完機能の一部としてCalltipsが提供されており、これにより開発者は関数のドキュメントを別途参照することなく、エディタ上で直接必要な情報を得ることができます。

コミットメッセージにある Fixes #5789 は、この変更がGo言語のIssue 5789を解決することを示しています。Issue 5789は「misc/notepadplus: add calltips for builtins」というタイトルで、Notepad++のGo言語サポートにおいて組み込み関数のCalltipsが不足していることを指摘していました。このコミットは、その不足を解消し、開発者の利便性を向上させるために行われました。

前提知識の解説

Notepad++

Notepad++は、Windows環境で動作するフリーのソースコードエディタです。多くのプログラミング言語に対応しており、シンタックスハイライト、コード折りたたみ、オートコンプリート、Calltipsなどの機能を備えています。これらの機能は、各言語の定義ファイル(XML形式)によってカスタマイズ可能です。

Calltips(関数呼び出しヒント)

Calltipsは、統合開発環境(IDE)や高機能なテキストエディタで提供される機能の一つです。関数名を入力した際に、その関数の引数のリスト、型、戻り値の型、簡単な説明などをポップアップ表示することで、開発者が関数の使い方を素早く理解し、正確にコードを記述するのを助けます。

Go言語の組み込み関数

Go言語には、言語仕様の一部として定義されている組み込み関数がいくつか存在します。これらは import なしで直接使用でき、特定のデータ型や操作に対して特別な機能を提供します。例としては、スライスやマップの操作 (append, cap, len, make, delete)、エラーハンドリング (panic, recover)、型変換 (complex, imag, real)、入出力 (print, println) などがあります。

XML形式のオートコンプリート定義ファイル

Notepad++では、各言語のオートコンプリートやCalltipsの定義をXMLファイルで管理しています。このファイルは、キーワード、関数、クラスなどの情報を構造化して記述し、エディタがこれらの情報を基に補完やヒントを提供できるようにします。

  • <NotepadPlus>: ファイル全体のルート要素。
  • <AutoComplete>: オートコンプリート機能に関する設定をまとめる要素。
  • <KeyWord>: 個々のキーワードや関数を定義する要素。
    • name 属性: キーワードまたは関数の名前。
    • func="yes" 属性: そのキーワードが関数であることを示す。これにより、Calltipsの対象となる。
  • <Overload>: 関数のオーバーロード(同じ名前で異なる引数を持つ関数)を定義する要素。
    • retVal 属性: 関数の戻り値の型。
  • <Param>: 関数の引数を定義する要素。
    • name 属性: 引数の名前。
    • type 属性: 引数の型(このコミットでは使用されていないが、一般的に使用される)。

技術的詳細

このコミットの技術的な核心は、Notepad++のXMLベースのオートコンプリート定義に、Go言語の組み込み関数のシグネチャ情報を正確にマッピングすることです。

変更された misc/notepadplus/go.xml ファイルでは、既存の <KeyWord> タグに対して以下の変更が加えられています。

  1. func="yes" 属性の追加: append, cap, close, complex, copy, delete, imag, len, make, new, panic, print, println, real, recover といった組み込み関数を表す <KeyWord> タグに func="yes" 属性が追加されました。これにより、Notepad++はこれらのキーワードを関数として認識し、Calltipsの対象とします。
  2. <Overload> タグの追加: 各組み込み関数に対して、その関数の戻り値の型を retVal 属性で指定する <Overload> タグが追加されました。Go言語の組み込み関数は通常オーバーロードを持ちませんが、Notepad++のCalltips機能の構造上、このタグが必要です。
  3. <Param> タグの追加: 各組み込み関数の引数を定義するために、<Param> タグが <Overload> タグの子要素として追加されました。name 属性には引数の名前(またはプレースホルダー)が記述され、これによりNotepad++は関数呼び出し時に引数のヒントを表示します。

例えば、append 関数の定義は以下のように変更されました。

変更前:

<KeyWord name="append"/>

変更後:

<KeyWord name="append" func="yes">
    <Overload retVal="[]Type">
        <Param name="slice []Type" />
        <Param name="elems ...Type" />
    </Overload>
</KeyWord>

これにより、Notepad++で append( と入力すると、「slice []Type, elems ...Type」といった引数ヒントと、戻り値が「[]Type」であることが表示されるようになります。

この変更は、Go言語の組み込み関数の正確なシグネチャをXML形式で表現するという、比較的単純ながらも重要な作業です。これにより、Notepad++を使用するGo開発者のコーディング体験が向上し、生産性が高まります。

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

変更は misc/notepadplus/go.xml ファイルのみです。

--- a/misc/notepadplus/go.xml
+++ b/misc/notepadplus/go.xml
@@ -1,69 +1,133 @@
-<NotepadPlus>	
+<NotepadPlus>
 	<!-- Go Programming Language  builtins and keywords -->
 	<AutoComplete>
-		<KeyWord name="append"/>
-		<KeyWord name="bool" /> 
-		<KeyWord name="break" /> 
+		<KeyWord name="append" func="yes">
+			<Overload retVal="[]Type">
+				<Param name="slice []Type" />
+				<Param name="elems ...Type" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="bool" />
+		<KeyWord name="break" />
 		<KeyWord name="byte" />
-		<KeyWord name="cap" />
-		<KeyWord name="case" /> 
-		<KeyWord name="chan" /> 
-		<KeyWord name="close" /> 
-		<KeyWord name="complex" /> 
-		<KeyWord name="complex128" /> 
-		<KeyWord name="complex64" /> 
-		<KeyWord name="const" /> 
+		<KeyWord name="cap" func="yes">
+			<Overload retVal="int">
+				<Param name="v Type" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="case" />
+		<KeyWord name="chan" />
+		<KeyWord name="close" func="yes">
+			<Overload retVal="">
+				<Param name="c chan<- Type" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="complex" func="yes">
+			<Overload retVal="ComplexType">
+				<Param name="r" />
+				<Param name="i FloatType" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="complex128" />
+		<KeyWord name="complex64" />
+		<KeyWord name="const" />
 		<KeyWord name="continue" />
-		<KeyWord name="copy" />
-		<KeyWord name="default" /> 
-		<KeyWord name="defer" /> 
-		<KeyWord name="delete" /> 
+		<KeyWord name="copy" func="yes">
+			<Overload retVal="int">
+				<Param name="dst" />
+				<Param name="src []Type" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="default" />
+		<KeyWord name="defer" />
+		<KeyWord name="delete" func="yes">
+			<Overload retVal="">
+				<Param name="m map[Type]Type1" />
+				<Param name="key Type" />
+			</Overload>
+		</KeyWord>
 		<KeyWord name="else" />
 		<KeyWord name="error" />
-		<KeyWord name="fallthrough" /> 
-		<KeyWord name="false" /> 
-		<KeyWord name="float32" /> 
+		<KeyWord name="fallthrough" />
+		<KeyWord name="false" />
+		<KeyWord name="float32" />
 		<KeyWord name="float64" />
 		<KeyWord name="for" />
-		<KeyWord name="func" /> 
-		<KeyWord name="go" /> 
-		<KeyWord name="goto" /> 
-		<KeyWord name="if" /> 
+		<KeyWord name="func" />
+		<KeyWord name="go" />
+		<KeyWord name="goto" />
+		<KeyWord name="if" />
 		<KeyWord name="iota" />
-		<KeyWord name="imag" />
-		<KeyWord name="import" /> 
-		<KeyWord name="int" /> 
-		<KeyWord name="int16" /> 
-		<KeyWord name="int32" /> 
-		<KeyWord name="int64" /> 
-		<KeyWord name="int8" /> 
-		<KeyWord name="interface" /> 
-		<KeyWord name="len" />
-		<KeyWord name="make" />
-		<KeyWord name="map" /> 
-		<KeyWord name="new" />
-		<KeyWord name="nil" /> 
-		<KeyWord name="package" /> 
-		<KeyWord name="panic" />
-		<KeyWord name="print" />
-		<KeyWord name="println" />
-		<KeyWord name="range" /> 
-		<KeyWord name="real" />
-		<KeyWord name="recover" />
+		<KeyWord name="imag" func="yes">
+			<Overload retVal="FloatType">
+				<Param name="c ComplexType" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="import" />
+		<KeyWord name="int" />
+		<KeyWord name="int16" />
+		<KeyWord name="int32" />
+		<KeyWord name="int64" />
+		<KeyWord name="int8" />
+		<KeyWord name="interface" />
+		<KeyWord name="len" func="yes">
+			<Overload retVal="int">
+				<Param name="v Type" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="make" func="yes">
+			<Overload retVal="Type">
+				<Param name="Type" />
+				<Param name="size IntegerType" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="map" />
+		<KeyWord name="new" func="yes">
+			<Overload retVal="*Type">
+				<Param name="Type" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="nil" />
+		<KeyWord name="package" />
+		<KeyWord name="panic" func="yes">
+			<Overload retVal="">
+				<Param name="v interface{}" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="print" func="yes">
+			<Overload retVal="">
+				<Param name="args ...Type" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="println" func="yes">
+			<Overload retVal="" >
+				<Param name="args ...Type" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="range" />
+		<KeyWord name="real" func="yes">
+			<Overload retVal="FloatType">
+				<Param name="c ComplexType" />
+			</Overload>
+		</KeyWord>
+		<KeyWord name="recover" func="yes">
+			<Overload retVal="interface{}">
+			</Overload>
+		</KeyWord>
 		<KeyWord name="return" />
 		<KeyWord name="rune" />
-		<KeyWord name="select" /> 
-		<KeyWord name="string" /> 
-		<KeyWord name="struct" /> 
-		<KeyWord name="switch" /> 
-		<KeyWord name="true" /> 
-		<KeyWord name="type" /> 
-		<KeyWord name="uint" /> 
-		<KeyWord name="uint16" /> 
-		<KeyWord name="uint32" /> 
-		<KeyWord name="uint64" /> 
-		<KeyWord name="uint8" /> 
-		<KeyWord name="uintptr" /> 
-		<KeyWord name="var" /> 
-	</AutoComplete>	
+		<KeyWord name="select" />
+		<KeyWord name="string" />
+		<KeyWord name="struct" />
+		<KeyWord name="switch" />
+		<KeyWord name="true" />
+		<KeyWord name="type" />
+		<KeyWord name="uint" />
+		<KeyWord name="uint16" />
+		<KeyWord name="uint32" />
+		<KeyWord name="uint64" />
+		<KeyWord name="uint8" />
+		<KeyWord name="uintptr" />
+		<KeyWord name="var" />
+	</AutoComplete>
 </NotepadPlus>

コアとなるコードの解説

このコミットのコアとなる変更は、misc/notepadplus/go.xml ファイル内のGo言語組み込み関数に対する <KeyWord> エントリの拡張です。

各組み込み関数(例: append, cap, close など)について、以下の要素が追加または変更されています。

  1. func="yes" 属性: これは、Notepad++に対して、この KeyWord が関数であり、Calltips機能の対象となることを明示します。この属性がない場合、Notepad++はそのキーワードを単なる静的なキーワードとして扱い、関数呼び出しヒントを表示しません。
  2. <Overload> タグ: Go言語の組み込み関数は通常、単一のシグネチャを持ちますが、Notepad++のCalltipsメカニズムは <Overload> タグを介して関数のシグネチャを定義します。retVal 属性は関数の戻り値の型を示します。例えば、appendretVal="[]Type" は、スライスを返すことを示唆しています。Type はGo言語のジェネリックな型を表すプレースホルダーです。
  3. <Param> タグ: 各 <Overload> タグの内部には、関数の引数を定義する <Param> タグが一つ以上含まれます。name 属性は引数の名前またはその役割を示すプレースホルダーです。例えば、appendParam name="slice []Type"Param name="elems ...Type" は、それぞれ第一引数がスライス、第二引数以降が可変長引数であることを示しています。

これらの変更により、Notepad++はGo言語の組み込み関数をよりインテリジェントに認識し、開発者が関数を呼び出す際に、その場で必要な引数情報や戻り値の型を提示できるようになります。これにより、Go言語の組み込み関数の利用がよりスムーズになり、特にGo言語に不慣れな開発者にとっては大きな助けとなります。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Notepad++のドキュメント(XMLオートコンプリート定義に関する情報)
  • GitHubのGo言語リポジトリのコミット履歴
  • Go言語のIssueトラッカー
  • 一般的なプログラミングエディタの機能に関する知識