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

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

このコミットは、Go言語のVimシンタックスハイライト定義ファイル misc/vim/syntax/go.vim に対する変更です。具体的には、Go言語におけるエラーハンドリングの進化に合わせて、VimがGoの組み込みerror型を正しくハイライトするように更新されています。これにより、os.Errorが非推奨となり、errorインターフェースが標準となったGoの変更がVimエディタの表示に反映されます。

コミット

  • コミットハッシュ: 782fd1fc9883c962b1414621e4e177c30499a1bf
  • Author: David Symonds dsymonds@golang.org
  • Date: Tue Nov 1 21:47:07 2011 -0400

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

https://github.com/golang/go/commit/782fd1fc9883c962b1414621e4e177c30499a1bf

元コミット内容

misc/vim: add error type.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5331046

変更の背景

このコミットが行われた2011年頃は、Go言語のエラーハンドリングが進化していた時期にあたります。初期のGoでは、os.Errorという具体的な型がエラーを表すために使われることがありましたが、Go言語の設計思想として、エラーは特定の型ではなく、Error() stringメソッドを持つ任意の型として表現されるべきであるという考え方が確立されていきました。これにより、Goの組み込みerrorインターフェースがエラーハンドリングの標準となりました。

この変更は、VimエディタのGo言語シンタックスハイライトが、この言語仕様の変更に追従するためのものです。os.Errorが非推奨となり、代わりに組み込みのerrorインターフェースが広く使われるようになったため、Vimのハイライト定義もこれに合わせて更新する必要がありました。特に、go_highlight_extra_typesというオプションが有効な場合に、os.Errorではなくio.Readerのような一般的なライブラリ型が例として挙げられるように説明が修正され、さらにgoTypeキーワードにerrorが追加されることで、error型が適切にハイライトされるようになります。

前提知識の解説

Go言語のエラーハンドリング (errorインターフェースとos.Error)

Go言語では、エラーは例外処理のようなメカニズムではなく、通常の戻り値として扱われます。Goの組み込み型であるerrorインターフェースは、エラーを表すための標準的な方法です。

type error interface {
    Error() string
}

このインターフェースは、Error()という文字列を返すメソッドを1つだけ持ちます。任意の型がこのError()メソッドを実装していれば、その型はerrorインターフェースを満たし、エラーとして扱うことができます。

初期のGo言語では、os.Errorという具体的な型がエラーを表すために使われることがありました。しかし、Goの設計思想が成熟するにつれて、エラーは特定の具象型に依存するのではなく、errorインターフェースを介して抽象的に扱われるべきであるという方針が明確になりました。そのため、os.Errorは非推奨となり、現在ではほとんど使われていません。Goのコードでは、関数がエラーを返す場合、通常は最後の戻り値としてerror型を返し、エラーがない場合はnilを返します。

Vimのシンタックスハイライト

Vimは、テキストエディタであり、プログラミング言語のコードを色分けして表示するシンタックスハイライト機能を持っています。これは、コードの可読性を高め、構文エラーを見つけやすくするために非常に重要です。

Vimのシンタックスハイライトは、syntaxディレクトリ内のファイル(例: syntax/go.vim)によって定義されます。これらのファイルは、特定のファイルタイプ(例: .goファイル)に対して、キーワード、型、コメント、文字列などを識別し、それぞれに異なるハイライトグループ(色やスタイル)を割り当てます。

  • syn keyword: 特定のキーワードをハイライトするために使用されます。例えば、if, for, funcなどがこれに該当します。
  • syn match: 正規表現パターンに一致するテキストをハイライトするために使用されます。より複雑なパターンや、特定の構造を持つ要素(例: 型名、関数呼び出し)をハイライトするのに適しています。
  • hi def link: あるハイライトグループを別の既存のハイライトグループにリンクさせ、同じ色やスタイルを適用するために使用されます。

ユーザーはVimの設定ファイル(例: .vimrc)で、syntax enableコマンドを使ってシンタックスハイライトを有効にしたり、go_highlight_extra_typesのようなオプションを設定して、特定のハイライト機能を有効/無効にしたりできます。

技術的詳細

このコミットは、VimのGo言語シンタックスハイライト定義ファイル misc/vim/syntax/go.vim を修正することで、Go言語の進化に対応しています。

  1. コメントの修正: go_highlight_extra_typesオプションの説明文が変更されています。 変更前: " Highlights commonly used library types (os.Error, etc.)." 変更後: " Highlights commonly used library types (io.Reader, etc.)." これは、os.Errorが非推奨となり、io.ReaderのようなインターフェースがGo言語でより一般的に使われるようになったことを反映しています。Vimのユーザーがこのオプションの目的を理解する上で、より適切な例が提供されるようになりました。

  2. errorキーワードの追加: syn keyword goTypeの定義にerrorが追加されました。 変更前: syn keyword goType chan map bool string 変更後: syn keyword goType chan map bool string error これにより、Goの組み込みerrorインターフェースが、chan, map, bool, stringといった他の組み込み型と同様に、goTypeハイライトグループとして認識され、Vimによって適切に色付けされるようになります。これは、Go言語のコードをVimで編集する際に、error型が視覚的に区別され、コードの可読性が向上することを意味します。

  3. os.ErrorgoExtraTypeからの削除: go_highlight_extra_typesオプションが有効な場合にハイライトされるgoExtraTypeの定義から、os.Errorが削除されました。 変更前: syn match goExtraType /\\<\\(os\\.Error\\)\\>/ 変更後: (この行が削除) これは、os.Errorが非推奨となり、もはや「一般的に使われるライブラリ型」ではないというGo言語の現状を反映しています。これにより、Vimは非推奨のos.Errorを特別な型としてハイライトするのをやめ、開発者が現代のGoのエラーハンドリング慣習に沿ったコードを書くことを促します。

これらの変更は、VimがGo言語の最新の慣習と仕様に準拠したシンタックスハイライトを提供し続けるために重要です。

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

diff --git a/misc/vim/syntax/go.vim b/misc/vim/syntax/go.vim
index 7c17534be7..1ce6cb27f7 100644
--- a/misc/vim/syntax/go.vim
+++ b/misc/vim/syntax/go.vim
@@ -18,7 +18,7 @@
 "     Highlights white space around the communications operator that don't follow
 "     the standard style.
 "   - go_highlight_extra_types
-"     Highlights commonly used library types (os.Error, etc.).
+"     Highlights commonly used library types (io.Reader, etc.).
 "   - go_highlight_space_tab_error
 "     Highlights instances of tabs following spaces.
 "   - go_highlight_trailing_whitespace_error
@@ -67,7 +67,7 @@ hi def link     goLabel             Label
 hi def link     goRepeat            Repeat
 
 " Predefined types
-syn keyword     goType              chan map bool string
+syn keyword     goType              chan map bool string error
 syn keyword     goSignedInts        int int8 int16 int32 int64 rune
 syn keyword     goUnsignedInts      byte uint uint8 uint16 uint32 uint64 uintptr
 syn keyword     goFloats            float32 float64
@@ -180,7 +180,6 @@ endif
 if go_highlight_extra_types != 0
   syn match goExtraType /\\<bytes\\.\\(Buffer\\)\\>/
   syn match goExtraType /\\<io\\.\\(Reader\\|Writer\\|ReadWriter\\|ReadWriteCloser\\)\\>/
-  syn match goExtraType /\\<\\(os\\.Error\\)\\>/
   syn match goExtraType /\\<reflect\\.\\(Kind\\|Type\\|Value\\)\\>/
   syn match goExtraType /\\<unsafe\\.Pointer\\>/\
 endif

コアとなるコードの解説

上記の差分は、misc/vim/syntax/go.vim ファイルに対する3つの主要な変更を示しています。

  1. 行 18: - " Highlights commonly used library types (os.Error, etc.). + " Highlights commonly used library types (io.Reader, etc.). これは、go_highlight_extra_typesというVimオプションに関するコメントの変更です。以前はos.Errorが例として挙げられていましたが、Go言語におけるエラーハンドリングの標準がerrorインターフェースに移行したため、より現代的な例としてio.Readerが挙げられるように修正されました。これはVimの動作には直接影響しませんが、ユーザーがオプションの意図を理解するのに役立ちます。

  2. 行 68: - syn keyword goType chan map bool string + syn keyword goType chan map bool string error この行は、VimがGo言語の「事前定義された型」として認識し、ハイライトするキーワードを定義しています。変更前はchan, map, bool, stringが含まれていましたが、このコミットでerrorが追加されました。これにより、Goの組み込みerrorインターフェースが、Vimによって他の組み込み型と同様にgoTypeハイライトグループとして適切に色付けされるようになります。

  3. 行 182: - syn match goExtraType /\\<\\(os\\.Error\\)\\>/ この行は削除されました。以前は、go_highlight_extra_typesオプションが有効な場合に、os.Errorという文字列がgoExtraTypeハイライトグループとして認識され、特別な色で表示されていました。os.Errorが非推奨となったため、このハイライトルールは不要となり、削除されました。これにより、Vimは非推奨の型を強調表示するのをやめ、開発者がより現代的なGoのエラーハンドリングパターンに集中できるようになります。

これらの変更は、VimのGoシンタックスハイライトがGo言語の進化に追従し、より正確で有用なコード表示を提供するためのものです。

関連リンク

参考にした情報源リンク