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

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

このコミットは、Go言語のコマンドラインツールであるgoコマンドのBashおよびZshシェルにおける補完ルールを修正・更新するものです。既存の補完スクリプトにおける問題点や不足を解消し、特にjohn.gossetによって以前に指摘された修正点を取り入れています。これにより、goコマンドのシェル補完機能の正確性と利便性が向上します。

コミット

  • コミットハッシュ: 6119dc1b52c550c47aa42b8b10b1760f7cad5d5d
  • Author: Rui Ueyama ruiu@google.com
  • Date: Thu Mar 27 00:29:55 2014 -0400
  • Original Commit Message:
    misc/bash, misc/zsh: fix completion rules
    
    This patch includes fixes pointed out in CL 52140043, which was
    originally written by john.gosset.
    
    LGTM=minux.ma
    R=golang-codereviews, minux.ma
    CC=golang-codereviews
    https://golang.org/cl/80320043
    

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

https://github.com/golang/go/commit/6119dc1b52c550c47aa42b8b10b1760f7cad5d5d

元コミット内容

misc/bash, misc/zsh: fix completion rules

This patch includes fixes pointed out in CL 52140043, which was
originally written by john.gosset.

LGTM=minux.ma
R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/80320043

変更の背景

goコマンドはGo言語開発における中心的なツールであり、その効率的な利用は開発者の生産性に直結します。シェル補完機能は、コマンド名、サブコマンド、フラグ、引数などをTabキーで自動補完することで、コマンド入力の手間を大幅に削減し、タイプミスを防ぎ、利用可能なオプションをユーザーに提示する上で不可欠です。

このコミットは、既存のgoコマンドのシェル補完スクリプト(misc/bash/gomisc/zsh/go)に存在する不正確さや不足を修正するために行われました。コミットメッセージには、「CL 52140043で指摘された修正が含まれている」と明記されており、これはjohn.gossetによって以前に作成された変更セットに起因する問題や改善点を解決することを示唆しています。

具体的な変更の背景としては、以下のような点が挙げられます。

  • goコマンドの進化: Go言語自体とそのツールチェインは継続的に進化しており、新しいサブコマンド、フラグ、ヘルプトピックが追加されたり、既存のツールが非推奨になったり、機能が統合されたりすることがあります。シェル補完スクリプトは、これらの変更に追随し、常に最新かつ正確な情報を提供する必要があります。
  • ツールの整理と統合: ebnflintgotypeprofといった一部のgo toolコマンドがBashの補完リストから削除されたり、Zshのgo tool補完からdocが削除されたりしているのは、これらのツールがGoの標準ツールセットから外れたか、あるいはその機能が他のより汎用的なツールに統合されたためと考えられます。例えば、godocの利用方法の変更などが考えられます。
  • 新機能への対応: go testコマンドに-coverフラグの補完が追加されたことは、コードカバレッジ分析がGo開発ワークフローにおいてより重要になったことを反映しています。これにより、開発者はテスト実行時にカバレッジ情報を容易に取得できるようになります。
  • ヘルプトピックの更新: go helpコマンドで利用可能なヘルプトピックが更新され、c(C言語連携)やpackages(パッケージに関する説明)といった新しいトピックが追加された一方で、remote(リモートインポートパス)のような古いトピックが削除されました。これは、Goのパッケージ管理やエコシステムの進化に伴うドキュメンテーションの変更に合わせたものです。

これらの変更は、Go開発者がよりスムーズで効率的なコマンドライン操作を行えるようにするための、継続的なメンテナンスと改善の一環として実施されました。

前提知識の解説

  • シェル補完 (Shell Completion): コマンドラインインターフェース(CLI)において、ユーザーがコマンドやその引数を入力する際に、Tabキーを押すことで残りの部分を自動的に補完する機能です。これにより、コマンドの入力速度が向上し、スペルミスが減り、利用可能なオプションをユーザーが簡単に発見できるようになります。BashやZshなどの主要なシェルには、この機能を実現するための独自のメカニズムが備わっています。

  • Bash補完スクリプト: Bashシェルでは、completeコマンドを使用して特定のコマンドに対する補完ルールを定義します。多くの場合、_completionという命名規則に従った関数が作成され、その関数内でcompgenなどの組み込みコマンドを利用して、現在の入力に基づいて適切な補完候補を生成します。これらのスクリプトは通常、ユーザーの.bashrcやシステム全体の補完設定ファイル(例: /etc/bash_completion.d/内のファイル)に読み込まれます。

  • Zsh補完スクリプト: ZshはBashよりも高度で柔軟な補完システムを持っています。compdef関数を使ってコマンドと補完関数を関連付け、_arguments_valuesといった強力な組み込み関数やフレームワークを利用して、より複雑な補完ロジックを記述できます。Zshの補完は、コンテキストに応じた補完候補の提示、説明付きの補完、複数の補完候補からの選択など、豊富な機能を提供します。

  • Goコマンド (go): Go言語の公式ツールチェーンに含まれる主要なコマンドラインツールです。Goプログラムのビルド、テスト、依存関係の管理、パッケージのインストール、各種ツールの実行など、Go開発におけるほとんどのタスクをこのコマンドを通じて行います。go buildgo testgo getgo rungo installgo fmtgo vetなど、多数のサブコマンドを持ちます。

  • Goツール (go tool): goコマンドのサブコマンドの一つで、Go言語の内部ツールや低レベルなユーティリティを実行するために使用されます。これらは通常、Goコンパイラやランタイムの内部で使われることが多いですが、開発者が直接呼び出して特定のタスク(例: プロファイリング、コード生成、静的解析)を行うこともできます。例えば、go tool pprof(プロファイリング)、go tool vet(静的解析)などがあります。

  • CL (Change List): Goプロジェクトでは、コードレビューシステムとしてGerritが使用されています。Gerritにおける変更の単位は「Change List (CL)」と呼ばれます。これはGitのコミットに相当する概念ですが、レビュープロセスを経てまだメインのコードベースにマージされていない、提案中の変更のセットを指します。コミットメッセージにCL番号が記載されている場合、そのコミットが特定のGerrit上の変更セットに関連していることを示し、そのCLで議論された内容や修正点がこのコミットに反映されていることを意味します。

技術的詳細

このコミットは、goコマンドのシェル補完スクリプトであるmisc/bash/gomisc/zsh/goの2つのファイルを対象に、その内部ロジックを修正しています。これらのスクリプトは、ユーザーがBashまたはZshシェルでgoコマンドを入力し、Tabキーを押した際に、適切な補完候補を提示するためのルールを定義しています。

misc/bash/go の変更点

  1. addhelp 変数の更新:

    • 変更前は、go helpコマンドの補完候補としてgopath, importpath, remote, testflag, testfuncが含まれていました。
    • 変更後は、remoteが削除され、代わりにcpackagesが追加されました。
    • この変更は、go helpコマンドが提供するヘルプトピックのリストが更新されたことを反映しています。
      • c: GoとC言語の連携(cgo)に関するヘルプを指します。GoがCのコードを呼び出す機能を持つため、この関連情報へのアクセスが補完で容易になりました。
      • packages: Goのパッケージリストの記述に関するヘルプを指します。Goのモジュールシステムやパッケージの概念が進化する中で、その説明へのアクセスが重要になったと考えられます。
      • remote: リモートインポートパスの構文に関するヘルプが削除されました。これは、Goのパッケージ管理の進化(Go Modulesの導入など、このコミット時点ではまだ存在しないが、その萌芽となる変更)により、以前のリモートパスの概念が直接的なヘルプトピックとして不要になったか、あるいはより一般的なpackagesヘルプに統合された可能性を示唆します。
  2. _go() 関数内の case ステートメントからのツール削除:

    • go toolサブコマンドの補完候補としてリストされていたebnflintgotypeprofの各ツールに対するエントリが削除されました。
    • これらのツールは、Goの初期開発段階で存在したか、あるいは実験的なツールであった可能性があります。時間の経過とともに、これらのツールが非推奨になった、機能が他のツールに統合された、あるいはGoの標準ツールセットから外されたため、シェル補完リストから削除されたと考えられます。
      • ebnflint: Goのソースコードを解析するためのリンターツールの一つであった可能性があります。
      • gotype: Goの型チェックを行うツールであった可能性があります。
      • prof: プロファイリング関連のツールであった可能性があります。go tool pprofのようなより汎用的なプロファイリングツールが存在するため、特定のprofツールが不要になったのかもしれません。
    • これらのエントリはコメントアウトされており、将来的に再実装される可能性も示唆されていますが、このコミット時点では補完対象から外されています。

misc/zsh/go の変更点

  1. __go_tool_complete() 関数からの doc ツール削除:

    • go toolサブコマンドの補完候補としてリストされていたdocgodocを実行する)のエントリが削除されました。
    • これは、go tool docという形式でのgodocの実行が非推奨になったか、あるいはgo docという直接的なコマンドが推奨されるようになったためと考えられます。godocはGoのドキュメンテーションツールであり、その利用方法が変更されたことを反映しています。
  2. go test コマンドへの -cover フラグ補完の追加:

    • go testコマンドの補完候補に-coverフラグが追加されました。
    • -coverフラグは、go testコマンドでコードカバレッジ分析を有効にするためのものです。このフラグの補完が追加されたことで、Zshユーザーはコードカバレッジ機能をより容易に利用できるようになり、開発の利便性が向上します。
  3. help コマンドの補完の更新:

    • Zshのgo helpコマンドの補完候補も更新されました。Bashスクリプトと同様に、cpackagesが追加され、remoteが削除されました。
    • これにより、Zshユーザーも最新のヘルプトピックにアクセスしやすくなり、go helpコマンドを通じてGoの機能や概念に関する情報を効率的に検索できるようになります。

これらの技術的な変更は、Goコマンドの機能セットと提供されるツールの進化にシェル補完スクリプトを同期させることを目的としています。これにより、ユーザーはより正確で、現在のGo開発環境に即した補完機能を利用できるようになります。

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

diff --git a/misc/bash/go b/misc/bash/go
index 90defda827..50f4f720b4 100644
--- a/misc/bash/go
+++ b/misc/bash/go
@@ -22,8 +22,7 @@ _go()
 
   local cmds="build clean env fix fmt get
     install list run test tool version vet"
-  local addhelp="gopath importpath remote
-    testflag testfunc"
+  local addhelp="c gopath importpath packages testflag testfunc"
   local other="help"
 
   if [ "$COMP_CWORD" == 1 ]; then
@@ -185,15 +184,9 @@ _go()
           'dist') # TODO: Implement something.
             #_go_tool_dist
             ;;
-          'ebnflint') # TODO: Implement something.
-            #_go_tool_ebnflint
-            ;;
           'fix') # TODO: Implement something.
             #_go_tool_fix
             ;;
-          'gotype') # TODO: Implement something.
-            #_go_tool_gotype
-            ;;
           'nm') # TODO: Implement something.
             #_go_tool_nm
             ;;
@@ -203,9 +196,6 @@ _go()
           'pprof') # TODO: Implement something.
             #_go_tool_pprof
             ;;
-          'prof') # TODO: Implement something.
-            #_go_tool_prof
-            ;;
           'vet') # TODO: Implement something.
             #_go_tool_vet
             ;;
diff --git a/misc/zsh/go b/misc/zsh/go
index 18bcaaff28..066cf40654 100644
--- a/misc/zsh/go
+++ b/misc/zsh/go
@@ -19,7 +19,6 @@ __go_tool_complete() {
   commands+=(\n    'build[compile packages and dependencies]'\n    'clean[remove object files]'\n-    'doc[run godoc on package sources]'\n    'env[print Go environment information]'\n    'fix[run go tool fix on packages]'\n    'fmt[run gofmt on package sources]'\n@@ -92,6 +91,7 @@ __go_tool_complete() {\n         "-short[use short mode]" \\\n         "-parallel[number of parallel tests]:number" \\\n         "-cpu[values of GOMAXPROCS to use]:number list" \\\n+\t"-cover[enable coverage analysis]" \\\n         "-run[run tests and examples matching regexp]:regexp" \\\n         "-bench[run benchmarks matching regexp]:regexp" \\\n         "-benchmem[print memory allocation stats]" \\\n@@ -106,9 +106,10 @@ __go_tool_complete() {\n       ;;\n   help)\n       _values "${commands[@]}" \\\n+        'c[how to call C code]' \\\n+        'importpath[description of import path]' \\\n         'gopath[GOPATH environment variable]' \\\n         'packages[description of package lists]' \\\n-        'remote[remote import path syntax]' \\\n         'testflag[description of testing flags]' \\\n         'testfunc[description of testing functions]'\n       ;;\n```

## コアとなるコードの解説

### `misc/bash/go`

*   **`local addhelp="..."` の変更**:
    *   `- local addhelp="gopath importpath remote testflag testfunc"`
    *   `+ local addhelp="c gopath importpath packages testflag testfunc"`
    *   この行は、`go help`コマンドの補完候補として表示されるヘルプトピックを定義しています。変更前は`remote`が含まれていましたが、変更後はこれが削除され、代わりに`c`と`packages`が追加されました。これは、Goのヘルプシステムが提供する情報が更新され、C言語との連携(`cgo`など)やGoのパッケージに関する説明がより重要になったことを反映しています。
*   **`case` ステートメントからのツールの削除**:
    *   `-          'ebnflint') # TODO: Implement something.`
    *   `-            #_go_tool_ebnflint`
    *   `-          'gotype') # TODO: Implement something.`
    *   `-            #_go_tool_gotype`
    *   `-          'prof') # TODO: Implement something.`
    *   `-            #_go_tool_prof`
    *   これらの行は、`go tool`サブコマンドの補完候補から`ebnflint`, `gotype`, `prof`を削除しています。これらのツールは、Goのツールチェインの進化に伴い、非推奨になったか、他のツールに統合された、あるいはGoの標準的な開発ワークフローから外れたため、補完リストから除外されました。コメントアウトされていることから、将来的な再検討の可能性も示唆されています。

### `misc/zsh/go`

*   **`__go_tool_complete()` 関数内の `commands` 配列からの `doc` の削除**:
    *   `-    'doc[run godoc on package sources]'\n`
    *   この行は、Zshの`go tool`補完候補から`doc`を削除しています。これは、`go tool doc`という形式での`godoc`の利用が変更されたか、`go doc`という直接的なコマンドが推奨されるようになったためと考えられます。
*   **`go test` コマンドへの `-cover` フラグの追加**:
    *   `+	"-cover[enable coverage analysis]" \\\n`
    *   この行は、`go test`コマンドの補完候補に`-cover`フラグを追加しています。`-cover`はGoのテストでコードカバレッジを有効にするための重要なフラグであり、Zshユーザーがこの機能を容易に利用できるようにするための改善です。
*   **`help)` ケース内の補完候補の変更**:
    *   `+        'c[how to call C code]' \\\n`
    *   `+        'importpath[description of import path]' \\\n`
    *   `-        'remote[remote import path syntax]' \\\n`
    *   `+        'packages[description of package lists]' \\\n`
    *   Bashスクリプトと同様に、Zshの`go help`補完候補も更新されています。`c`と`packages`が追加され、`remote`が削除されました。これにより、Zshユーザーも最新のヘルプトピックにアクセスできるようになります。`importpath`は元々存在していましたが、このdiffでは追加行として表示されています。これは、diffのコンテキストによるもので、実際には`importpath`は以前から存在し、`c`と`packages`が追加され、`remote`が削除されたと解釈できます。

これらの変更は、Goコマンドの機能と提供されるツールの進化に合わせて、シェル補完の精度と利便性を向上させるためのものです。

## 関連リンク

*   Go Gerrit CL 80320043: [https://golang.org/cl/80320043](https://golang.org/cl/80320043)

## 参考にした情報源リンク

*   Go言語公式ドキュメンテーション (Go command, go tool, godoc, go test -cover などに関する情報)
*   Bash Completion Documentation
*   Zsh Completion System Documentation