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

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

このコミットは、Go言語のコマンドラインツール go のbash補完スクリプト misc/bash/go から、go doc サブコマンドの自動補完機能を削除するものです。

コミット

commit 50f1e1a6b9317a975477bc89503e2e1c1fa6b1be
Author: Rui Ueyama <ruiu@google.com>
Date:   Tue Mar 18 21:01:23 2014 -0700

    misc/bash/go: remove "doc" subcommand autocompletion
    
    "go doc" has been removed in CL 17799.
    
    LGTM=iant
    R=golang-codereviews, iant
    CC=golang-codereviews
    https://golang.org/cl/77420045

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

https://github.com/golang/go/commit/50f1e1a6b9317a975477bc89503e2e1c1fa6b1be

元コミット内容

このコミットは、misc/bash/go ファイルから go doc サブコマンドに関連するbash自動補完の定義を削除します。具体的には、cmds 変数から doc を削除し、doc サブコマンドに対する COMPREPLY の設定ブロックを削除しています。

変更の背景

この変更の背景には、Goツールチェーンにおける go doc コマンド自体の廃止があります。コミットメッセージに明記されている通り、"go doc" has been removed in CL 17799. (CL 17799で"go doc"は削除されました) という事実に基づいています。

Go言語の初期のバージョンでは、go doc コマンドはパッケージやシンボルのドキュメントを表示するために使用されていました。しかし、Go 1.2のリリース前後で、go doc の機能は godoc コマンド(スタンドアロンのドキュメントサーバーとしても機能する)に統合され、go doc コマンド自体は廃止されました。これにより、go コマンドのサブコマンドとして doc が存在しなくなったため、その自動補完機能も不要となりました。

このコミットは、Goツールチェーンの変更に追従し、ユーザーが廃止されたコマンドの補完候補を見ることがないようにするためのクリーンアップ作業の一環です。

前提知識の解説

  • Go言語の go コマンド: Go言語のビルド、テスト、実行、パッケージ管理など、多岐にわたる操作を行うための主要なコマンドラインツールです。go build, go run, go get など、多くのサブコマンドを持ちます。
  • Bash自動補完 (Bash Autocompletion): Bashシェルにおいて、ユーザーがコマンドや引数を入力する際に、Tabキーを押すことで残りの部分を自動的に補完する機能です。これにより、コマンド入力の手間を省き、タイプミスを減らすことができます。Go言語の go コマンドも、misc/bash/go のようなスクリプトを通じてこの機能を提供していました。
  • go doc コマンド (旧): Go言語の初期バージョンに存在したコマンドで、Goのソースコード内のコメントから生成されるドキュメントを表示するために使われました。例えば、go doc fmt と入力すると fmt パッケージのドキュメントが表示されました。
  • godoc コマンド: go doc コマンドの機能を引き継ぎ、さらに拡張されたツールです。Goのドキュメントをコマンドラインで表示するだけでなく、HTTPサーバーとして起動し、Webブラウザを通じてドキュメントを閲覧することもできます。Go 1.2以降、ドキュメント参照の主要な手段となりました。
  • CL (Change List): Goプロジェクトにおける変更の単位です。Gitのコミットに相当しますが、GoプロジェクトではGerritというコードレビューシステムを使用しており、そこで管理される変更のまとまりをCLと呼びます。コミットメッセージにある CL 17799 は、go doc コマンドが削除された具体的な変更セットを指します。

技術的詳細

このコミットが変更している misc/bash/go ファイルは、Go言語の go コマンドに対するbashのプログラム可能な補完 (programmable completion) を定義するスクリプトです。Bashの補完機能は、complete コマンドと、それに渡される関数によって実現されます。このスクリプトでは、_go という関数が go コマンドの補完ロジックを実装しています。

_go 関数内では、COMP_WORDSCOMPREPLY という特別なBash配列変数が使用されます。

  • COMP_WORDS: 現在のコマンドラインを単語の配列として保持します。例えば、go b<Tab> と入力した場合、COMP_WORDS[0]goCOMP_WORDS[1]b となります。
  • COMPREPLY: 補完候補のリストを保持します。この配列に設定された文字列が、Tabキーを押したときに表示される候補となります。

このスクリプトの主要な部分は、go コマンドの第1引数(サブコマンド)に基づいて補完候補を生成するロジックです。 変更前は、local cmds 変数に doc が含まれており、case "$cmd" in ... esac ブロック内に doc サブコマンドに対する補完ロジック(_go_importpath 関数を呼び出してインポートパスを補完する)が存在していました。

このコミットでは、以下の2点が変更されています。

  1. cmds 変数からの doc の削除: local cmds="build clean env doc fix fmt get ..." から local cmds="build clean env fix fmt get ..." へと変更されています。これにより、go コマンドのサブコマンドとして doc が補完候補に表示されなくなります。

  2. doc サブコマンドの補完ロジックの削除: case "$cmd" in ... esac ブロック内の doc に対応する COMPREPLY 設定部分が削除されています。

        'doc')
          COMPREPLY=(`_go_importpath "$cur"`)
          ;;
    

    このブロックは、ユーザーが go doc と入力した際に、その後に続く引数(パッケージパスなど)を補完するためのものでした。go doc コマンド自体がなくなったため、この補完ロジックも不要となり削除されました。

これらの変更により、go コマンドのbash補完は、廃止された go doc コマンドを一切考慮しなくなり、より正確でクリーンな補完体験を提供します。

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

--- a/misc/bash/go
+++ b/misc/bash/go
@@ -20,7 +20,7 @@ _go()
 
   local cmd="${COMP_WORDS[1]}"
 
-  local cmds="build clean env doc fix fmt get
+  local cmds="build clean env fix fmt get
     install list run test tool version vet"
   local addhelp="gopath importpath remote
     testflag testfunc"
@@ -88,9 +88,6 @@ _go()
         COMPREPLY=(`_go_importpath "$cur"`)\
       fi
       ;;\
-    'doc')
-      COMPREPLY=(`_go_importpath "$cur"`)
-      ;;\
     'fix')
       COMPREPLY=(`_go_importpath "$cur"`)
       ;;\

コアとなるコードの解説

変更は misc/bash/go ファイル内の _go 関数に集中しています。

  1. local cmds 変数の変更: local cmds="build clean env doc fix fmt get ..." の行から doc が削除されています。 この cmds 変数は、go コマンドの有効なサブコマンドのリストを定義しています。doc をここから削除することで、Tabキーを押したときに doc がサブコマンドの候補として表示されなくなります。これは、go doc コマンドがもはや存在しないという事実を反映したものです。

  2. case "$cmd" in ... esac ブロック内の doc エントリの削除: case "$cmd" in は、ユーザーが入力したサブコマンド ($cmd) に応じて異なる補完ロジックを実行するためのBashの条件分岐です。 以前は 'doc') というケースがあり、その中で COMPREPLY=(_go_importpath "$cur") が実行されていました。これは、go doc の後に続く引数(通常はパッケージのインポートパス)を補完するためのものでした。 go doc コマンドが廃止されたため、このケース全体が不要となり、削除されました。これにより、存在しないコマンドに対する補完ロジックが実行されることがなくなります。

これらの変更は、go doc コマンドの廃止という上位の変更に完全に同期しており、Goツールチェーンの整合性を保つための重要なクリーンアップ作業です。

関連リンク

  • CL 17799 (go doc コマンド削除のコミット): このコミットメッセージで言及されている CL 17799 は、go doc コマンドが実際に削除された変更セットです。このCLを直接参照することで、go doc がなぜ、どのように削除されたかの詳細な背景を知ることができます。 (注: 2014年当時のCL番号は現在のGerritのURL形式とは異なる場合がありますが、Goプロジェクトのコミット履歴を辿ることで見つけることができます。一般的には go tool docgodoc への移行が背景にあります。)
  • Go 1.2 Release Notes: Go 1.2のリリースノートには、go doc コマンドの変更や godoc への移行に関する情報が含まれている可能性があります。 https://go.dev/doc/go1.2
  • godoc コマンドのドキュメント: 現在の godoc コマンドの公式ドキュメントを参照することで、go doc の後継としての役割と機能について理解を深めることができます。 https://pkg.go.dev/golang.org/x/tools/cmd/godoc

参考にした情報源リンク