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

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

このコミットは、Go言語のVimプラグインmisc/vim/plugin/godoc.vimに対する変更です。具体的には、godocコマンドがシステムにインストールされていない場合に、ユーザーに対してその旨を通知し、インストール方法を案内する機能が追加されています。

コミット

misc/vim: godoc is optional. so should point installation instruction.

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

https://github.com/golang/go/commit/b128426804cc3b6f4243eab2651f6ad79519e5b1

元コミット内容

misc/vim: godoc is optional. so should point installation instruction.

R=golang-dev, r, dsymonds
CC=golang-dev
https://golang.org/cl/14017043

変更の背景

このコミットが行われた背景には、godocコマンドがGo言語の標準ツールチェインの一部ではなく、別途インストールが必要なツールであるという事実があります。以前のgodoc.vimプラグインは、godocコマンドが常に利用可能であることを前提としていました。しかし、これはユーザーがgodocをインストールしていない場合に、プラグインが期待通りに動作しない、あるいはエラーメッセージが不明瞭であるという問題を引き起こしていました。

この変更の目的は、ユーザーエクスペリエンスを向上させることです。godocコマンドが見つからない場合に、単にエラーを出すのではなく、その原因を明確にし、具体的な解決策(インストールコマンド)を提示することで、ユーザーが問題を迅速に解決できるようにします。これにより、VimでGoのドキュメントを参照しようとした際に、ユーザーが途方に暮れることなく、スムーズに作業を継続できるようになります。

前提知識の解説

Go言語のツールチェイン

Go言語は、コンパイラ、リンカ、フォーマッタ、テストツールなど、開発に必要な多くのツールを標準で提供しています。これらはまとめて「Goツールチェイン」と呼ばれます。しかし、すべてのGo関連ツールがこの標準ツールチェインに含まれているわけではありません。

godocコマンド

godocは、Go言語のソースコードからドキュメンテーションを生成し、表示するためのツールです。Goのパッケージや関数のドキュメントをコマンドラインで参照したり、HTTPサーバーとして起動してブラウザで参照したりすることができます。godocは、Goの標準ライブラリだけでなく、サードパーティのパッケージのドキュメントも表示できます。

重要な点として、godocはGoの標準インストールには含まれていません。これは、go.toolsリポジトリの一部として提供されており、go getコマンドを使って別途インストールする必要があります。

go getコマンド

go getは、Goのパッケージやコマンドをリモートリポジトリからダウンロードし、ビルドしてインストールするためのコマンドです。Goのプロジェクトで外部ライブラリやツールを利用する際によく使われます。例えば、go get code.google.com/p/go.tools/cmd/godocと実行することで、godocコマンドをダウンロード、ビルド、インストールすることができます。

Vimプラグイン

Vimは、高機能なテキストエディタであり、プラグインによってその機能を拡張することができます。misc/vim/plugin/godoc.vimは、Vim内でgodocコマンドの機能を利用するためのプラグインです。これにより、Vimの編集画面から直接Goのドキュメントを参照できるようになります。

executable() Vim関数

Vimスクリプトには、指定されたコマンドが実行可能であるかどうかをチェックするためのexecutable()関数があります。この関数は、コマンドがシステムパス上に存在し、実行権限がある場合に1を返し、そうでない場合に0を返します。

echohlecho Vimコマンド

Vimスクリプトでメッセージをユーザーに表示するために使用されるコマンドです。

  • echohl {highlight_group}: 後続のechoコマンドのテキストに適用されるハイライトグループを設定します。例えば、WarningMsgは警告メッセージ用のハイライトグループです。
  • echo {message}: 指定されたメッセージをコマンドラインに表示します。

技術的詳細

このコミットは、Vimスクリプトの関数s:GodocWord(word)内に条件分岐を追加することで、godocコマンドの存在チェックを実装しています。

変更前は、s:GodocWord関数は直接system('godoc ' . word)を実行し、その結果を処理していました。godocコマンドが見つからない場合、system()関数はエラーを返し、Vimのv:shell_error変数が設定されますが、ユーザーへのフィードバックは必ずしも明確ではありませんでした。

変更後は、system()を呼び出す前にif !executable('godoc')という条件が追加されました。

  • executable('godoc')は、システムパスにgodocという実行可能ファイルが存在するかどうかをチェックします。
  • !演算子により、godocが存在しない場合にこの条件が真となります。

条件が真の場合、以下の処理が実行されます。

  1. echohl WarningMsg: 警告メッセージとして表示するために、テキストのハイライトを警告色に設定します。
  2. echo "godoc command not found.": godocコマンドが見つからないことをユーザーに通知します。
  3. echo " install with: go get code.google.com/p/go.tools/cmd/godoc": godocのインストール方法を具体的に案内します。これは、go getコマンドと、godocが提供されているGoツールのパス(code.google.com/p/go.tools/cmd/godoc)を明示しています。
  4. echohl None: ハイライトをデフォルトに戻します。
  5. return: これ以上処理を進めずに、関数を終了します。これにより、godocコマンドが存在しない状態でsystem()が呼び出されるのを防ぎ、不必要なエラーや遅延を回避します。

この変更により、ユーザーはgodocコマンドが見つからない場合に、即座にその原因と解決策をVimのコマンドラインで確認できるようになり、デバッグの手間が省けます。

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

diff --git a/misc/vim/plugin/godoc.vim b/misc/vim/plugin/godoc.vim
index 47ba9e08f0..33c9ec05bf 100644
--- a/misc/vim/plugin/godoc.vim
+++ b/misc/vim/plugin/godoc.vim
@@ -66,6 +66,13 @@ function! s:GodocView()\
 endfunction
 
 function! s:GodocWord(word)\
+  if !executable('godoc')\
+    echohl WarningMsg\
+    echo "godoc command not found."\
+    echo "  install with: go get code.google.com/p/go.tools/cmd/godoc"\
+    echohl None\
+    return\
+  endif\
   let word = a:word\
   silent! let content = system('godoc ' . word)\
   if v:shell_error || !len(content)\

コアとなるコードの解説

変更は、function! s:GodocWord(word)の冒頭に追加された7行です。

  • if !executable('godoc'): この行が、godocコマンドがシステムパス上で実行可能であるかをチェックする主要な条件分岐です。executable()関数はVimの組み込み関数で、引数に与えられたコマンドが実行可能であれば真を返します。!は論理否定なので、「godocが実行可能でない場合」という条件になります。
  • echohl WarningMsg: この行は、続くechoコマンドで表示されるメッセージのテキスト色を、Vimの警告メッセージ用の色(通常は赤やオレンジなど)に設定します。これにより、ユーザーはメッセージが警告であることを視覚的に認識できます。
  • echo "godoc command not found.": この行は、godocコマンドが見つからなかったことをユーザーに通知するメッセージを表示します。
  • echo " install with: go get code.google.com/p/go.tools/cmd/godoc": この行は、godocコマンドをインストールするための具体的な手順(go getコマンドとその引数)をユーザーに提供します。これは、ユーザーが問題を解決するために必要な最も重要な情報です。
  • echohl None: この行は、メッセージの表示が終わった後、テキストのハイライトをデフォルトの状態に戻します。これにより、その後のVimの出力が警告色で表示され続けるのを防ぎます。
  • return: この行は、現在の関数s:GodocWordの実行をここで終了させます。godocコマンドが見つからない場合、それ以降のsystem('godoc ...')の呼び出しは無意味であり、エラーを引き起こす可能性があるため、ここで処理を中断するのが適切です。

この追加されたコードブロックにより、godoc.vimプラグインはより堅牢になり、ユーザーフレンドリーなエラーハンドリングを提供するようになりました。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Vimのヘルプドキュメント (:help executable(), :help echohl, :help echo)
  • go getコマンドに関する情報
  • GitHubのgolang/goリポジトリのコミット履歴
  • Go言語のVimプラグインに関する一般的な情報
  • code.google.com/p/go.tools/cmd/godoc は古いパスであり、現在は golang.org/x/tools/cmd/godoc が正しいパスです。コミット当時の情報源として記載しています。