[インデックス 19251] ファイルの概要
このコミットは、Go言語のVimプラグイン設定に関するmisc/vim/readme.txt
ファイルに対する変更です。特に、macOSにバンドルされているVimの特定のバグに対するワークアラウンドと、$GOROOT
環境変数の設定に関するヒントの追加が目的です。
コミット
commit 6be21b9f020e2fd899712db068f49e9a7326f15d
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Mon Apr 28 14:24:14 2014 -0400
misc/vim/readme.txt: workaround weird OS X vim bug.
The vi bundled with OS X has a weird bug in that if you turn off
filetype in .vimrc when it's not turned on, even a clean exit of
vi will return 1 which breaks almost everything.
While we're at it, add hint to change $GOROOT to its actual value
in .vimrc.
Fixes #7865.
LGTM=robert.hencke, dsymonds
R=golang-codereviews, robert.hencke, gobot, dsymonds
CC=golang-codereviews
https://golang.org/cl/96800046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/6be21b9f020e2fd899712db068f49e9a7326f15d
元コミット内容
このコミットは、misc/vim/readme.txt
ファイルに対して以下の変更を加えています。
filetype off
およびfiletype plugin indent off
コマンドをif exists("g:did_load_filetypes")
という条件文で囲むように変更。set runtimepath+=$GOROOT/misc/vim
の行に、$GOROOT
を実際の値に置き換えるべきであるというコメントヒントを追加。
変更の背景
このコミットには主に二つの背景があります。
-
macOSにバンドルされたVimのバグへの対応: コミットメッセージによると、macOSに標準でバンドルされているVim(
vi
コマンド)には奇妙なバグが存在しました。このバグは、.vimrc
ファイル内でfiletype
オプションが既にオフになっているにもかかわらず、再度filetype off
を実行しようとすると、Vimがエラー(終了コード1)を返して終了するというものです。通常、Vimが正常に終了した場合は終了コード0を返しますが、このバグにより非ゼロの終了コードが返されるため、Vimの終了ステータスをチェックするスクリプトやツール(例えば、Gitのコミットフックやビルドシステムなど)が誤動作する可能性がありました。これは、Go開発者がVimを日常的に使用する際に、予期せぬ問題を引き起こす可能性があったため、修正が必要とされました。 -
$GOROOT
設定の明確化: Go開発環境において、$GOROOT
はGoのインストールディレクトリを示す重要な環境変数です。VimのGoプラグインを使用する際には、この$GOROOT
をVimのruntimepath
に追加する必要があります。しかし、ユーザーが.vimrc
に設定を記述する際に、単に$GOROOT
と記述するだけではVimが正しく解釈できない場合や、ユーザーが環境変数の概念に慣れていない場合に混乱が生じる可能性がありました。そのため、go env GOROOT
コマンドを使って実際のパスを取得し、それを.vimrc
に直接記述するよう促すヒントを追加することで、ユーザーの利便性と設定の正確性を向上させる狙いがありました。
前提知識の解説
このコミットを理解するためには、以下の前提知識が必要です。
- Vim: 高機能なテキストエディタであり、プログラマーに広く利用されています。
.vimrc
という設定ファイルを通じて、ユーザーはVimの挙動を細かくカスタマイズできます。 .vimrc
: Vimのユーザーごとの設定ファイルです。通常、ユーザーのホームディレクトリ($HOME/.vimrc
)に配置され、Vimの起動時に読み込まれます。filetype
オプション: Vimの重要なオプションの一つで、開いているファイルの拡張子や内容に基づいてファイルタイプを自動的に検出し、それに応じた構文ハイライトやインデント、プラグインの読み込みを有効にする機能です。例えば、.go
ファイルを開くとGo言語として認識し、Goの構文ハイライトを適用します。filetype on
: ファイルタイプ検出を有効にします。filetype off
: ファイルタイプ検出を無効にします。filetype plugin on
: ファイルタイプに応じたプラグインの読み込みを有効にします。filetype indent on
: ファイルタイプに応じたインデント設定を有効にします。
runtimepath
オプション: Vimがプラグイン、ドキュメント、構文ファイルなどを検索するディレクトリのリストを定義するオプションです。Vimの機能を拡張するために、このパスにカスタムプラグインのディレクトリを追加することが一般的です。$GOROOT
環境変数: Go言語のインストールルートディレクトリを示す環境変数です。Goのツールチェーンや標準ライブラリがこのディレクトリに配置されています。go env GOROOT
コマンド: Goコマンドラインツールの一つで、現在のGo環境におけるGOROOT
の値を表示します。- VimScript: Vimの内部スクリプト言語です。
.vimrc
ファイルに記述されるコマンドや関数はVimScriptで書かれています。 exists()
関数 (VimScript): VimScriptの関数で、引数で指定された変数、関数、コマンドなどが存在するかどうかをチェックします。exists("g:did_load_filetypes")
は、グローバル変数g:did_load_filetypes
が存在するかどうかを確認します。g:did_load_filetypes
変数: Vimの内部で使われるグローバル変数です。Vimがファイルタイプ検出関連のスクリプト(通常は$VIMRUNTIME/filetype.vim
)を読み込み、ファイルタイプ検出が初期化された後に設定されます。この変数が存在するということは、ファイルタイプ検出機能が既にロードされていることを意味します。
技術的詳細
このコミットの技術的詳細な変更点は、macOSにバンドルされたVimのバグを回避するための条件分岐の導入と、$GOROOT
設定の明確化です。
macOS Vimバグの回避策
従来のmisc/vim/readme.txt
では、GoのVimプラグインを有効にするために、まず既存のファイルタイプ設定をリセットする目的で以下の行が記述されていました。
filetype off
filetype plugin indent off
しかし、macOSにバンドルされているVimの特定のバージョンでは、filetype
が既にオフの状態であるにもかかわらず、これらのコマンドを無条件に実行すると、Vimがエラーを検出し、終了コード1を返してしまうという問題がありました。これは、VimがExモードコマンド(:filetype off
など)の実行中にエラーが発生した場合に非ゼロの終了コードを返すというPOSIX標準に準拠した挙動ですが、この特定のケースでは意図しないエラーと見なされました。
この問題を解決するために、コミットではif exists("g:did_load_filetypes")
という条件文が導入されました。
if exists("g:did_load_filetypes")
filetype off
filetype plugin indent off
endif
この変更により、filetype off
およびfiletype plugin indent off
コマンドは、Vimがファイルタイプ検出機能を既にロードしている場合にのみ実行されるようになります。g:did_load_filetypes
は、Vimの標準ファイルタイプ検出スクリプト(filetype.vim
)が読み込まれた後に設定されるグローバル変数です。したがって、この条件チェックは、ファイルタイプ検出が実際に有効になっている可能性があり、かつ、それを無効にする必要がある場合にのみ、これらのコマンドが実行されることを保証します。これにより、filetype
が既にオフの状態である場合にコマンドが実行され、Vimがエラーを返すという状況が回避されます。
$GOROOT
設定のヒント追加
もう一つの変更は、set runtimepath+=$GOROOT/misc/vim
の行に対するコメントの追加です。
set runtimepath+=$GOROOT/misc/vim " replace $GOROOT with the output of: go env GOROOT
これは技術的な機能変更ではなく、ユーザーに対する設定のガイダンスを改善するためのものです。Vimのruntimepath
にGoのVimプラグインのパスを追加する際、多くのユーザーは環境変数$GOROOT
を使用します。しかし、Vimの環境によっては$GOROOT
が正しく展開されない場合や、ユーザーが$GOROOT
の具体的なパスを知らない場合があります。このコメントは、go env GOROOT
コマンドを実行することで、現在のシステムにおけるGOROOT
の正確なパスを取得し、その値で$GOROOT
を直接置き換えることを推奨しています。これにより、ユーザーはより確実にVimのGoプラグインを設定できるようになります。
コアとなるコードの変更箇所
misc/vim/readme.txt
ファイルにおける変更は以下の通りです。
--- a/misc/vim/readme.txt
+++ b/misc/vim/readme.txt
@@ -5,9 +5,11 @@ To use all the Vim plugins, add these lines to your $HOME/.vimrc.
" Some Linux distributions set filetype in /etc/vimrc.
" Clear filetype flags before changing runtimepath to force Vim to reload them.
- filetype off
- filetype plugin indent off
- set runtimepath+=$GOROOT/misc/vim
+ if exists("g:did_load_filetypes")
+ filetype off
+ filetype plugin indent off
+ endif
+ set runtimepath+=$GOROOT/misc/vim " replace $GOROOT with the output of: go env GOROOT
filetype plugin indent on
syntax on
具体的には、以下の変更が行われました。
- filetype off
- filetype plugin indent off
上記の2行が削除され、以下のブロックに置き換えられました。+ if exists("g:did_load_filetypes")
+ filetype off
+ filetype plugin indent off
+ endif
set runtimepath+=$GOROOT/misc/vim
の行の末尾に、以下のコメントが追加されました。+ " replace $GOROOT with the output of: go env GOROOT
コアとなるコードの解説
if exists("g:did_load_filetypes")
ブロック
この変更の核心は、macOSにバンドルされたVimのバグを回避することにあります。
Vimの起動プロセスでは、まずシステム全体のVim設定ファイル(例: /etc/vimrc
)が読み込まれ、その後ユーザーの.vimrc
が読み込まれます。一部のLinuxディストリビューションや、Vimのデフォルト設定では、システム設定ファイルで既にfiletype on
が設定されている場合があります。しかし、macOSの特定のVimバージョンでは、filetype
が既にオフの状態であるにもかかわらず、.vimrc
で再度filetype off
を実行しようとすると、Vimがエラーを発生させ、終了コード1を返してしまうという問題がありました。
g:did_load_filetypes
は、Vimがファイルタイプ検出関連のスクリプトを読み込み、ファイルタイプ検出機能が初期化された後に設定される内部変数です。この変数が存在するということは、Vimがファイルタイプ検出の準備を終えていることを意味します。
したがって、if exists("g:did_load_filetypes")
という条件を追加することで、以下の挙動が保証されます。
- ファイルタイプ検出がまだロードされていない場合:
g:did_load_filetypes
が存在しないため、filetype off
とfiletype plugin indent off
のコマンドは実行されません。これにより、Vimが不必要にfiletype off
を試みてエラーを発生させることを防ぎます。 - ファイルタイプ検出が既にロードされている場合:
g:did_load_filetypes
が存在するため、filetype off
とfiletype plugin indent off
のコマンドが実行されます。これは、Goプラグインのruntimepath
を追加する前に、既存のファイルタイプ設定を確実にリセットし、Goプラグインのファイルタイプ設定が正しく適用されるようにするための意図された動作です。
この条件分岐により、Vimの起動時の安定性が向上し、特にmacOSユーザーがGoのVimプラグインを導入する際の予期せぬエラーが回避されます。
$GOROOT
ヒントの追加
set runtimepath+=$GOROOT/misc/vim " replace $GOROOT with the output of: go env GOROOT
この変更は、Vimのruntimepath
にGoのVimプラグインのパスを追加する際のユーザーエクスペリエンスを向上させるためのものです。
Vimはシェル環境変数(例: $GOROOT
)を直接解釈してパスを構築できますが、Vimの起動方法や環境によっては、これらの環境変数がVimのプロセスに正しく引き継がれない場合があります。また、Goのインストール方法によっては$GOROOT
が設定されていない場合や、ユーザーがその正確なパスを知らない場合もあります。
追加されたコメントは、ユーザーに対してgo env GOROOT
コマンドを実行し、その出力結果(Goのインストールパスの絶対パス)を直接.vimrc
に記述することを推奨しています。例えば、go env GOROOT
が/usr/local/go
を返した場合、ユーザーは.vimrc
の該当行をset runtimepath+=/usr/local/go/misc/vim
のように変更することになります。
これにより、環境変数の解釈に依存せず、Vimが常にGoのVimプラグインの正確なパスを見つけられるようになり、設定の信頼性が向上します。
関連リンク
- Go Issue #7865: https://github.com/golang/go/issues/7865
- Go Gerrit Code Review (CL 96800046): https://golang.org/cl/96800046
参考にした情報源リンク
- Vim documentation:
filetype.txt
(:help filetype
) - Vim documentation:
options.txt
(:help 'runtimepath'
) - Vim documentation:
eval.txt
(:help exists()
) - Go documentation:
go env
(Goコマンドリファレンス) - Stack Exchange, Stack OverflowなどのVim関連のQ&Aサイト(Vimの終了コードや
.vimrc
の設定に関する一般的な情報) - https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH8EjEn2eaBkxR4gkl-YWg6X78V6YwXk-sPmxEldtJM4aJDbQO3XLOLzY7PtozjxuqBFXiJg8yb57PJSXlauCX2Xk8c60F5Kl_VrTND5bu4rd4jyFlyLLrL_U734DbDGOF4TNx0Ji6sPtCD_bB1urZ99k35WAKsvoUoFgcAazONsi40TkYjyqUs-73l82tCnE_tUHACrt7ztE_WlY5QDR2UaRAxYA==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQESWH8RtC8mm4ja_ci9TsWcIkPww6nfvVqREWXe5MT2AnPSxHXfWUabEFbrHX0oVpXB8VkV5je9YeJ2_jV_vGzU8teptQ0T1xteP2IVByLwQttrKjJ7fKG9Pr1HZucFVtzZFJh2Tehtcc8hJFUUsBe9sCSyGhZP5g4BPjGrT7yrUIbysTbAafzCQa6eCBlvkWMh924ZPQ==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQF4ItQDL3nrMwMJ9tIesZcDwm4xprZsoWoyXT17vVS83FBUFOdL3WEy6aTY0TCsVcJlF9DOW4vWesNdg1UrZtiUboiCTNs8S8K4-A54liFzcDG4xm38civhAx79L-WvijPLSwVX9UVCn5fSd996oClVe-yaW9qzSFNERFyeELrxivNPAA==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH99CelDSVxblYfjZP0VbYJscaWXHQx66kqonYARMBCfrsBt1cQJl5GXTZSDJzpps2PQA6s_u71XdkiU_iQ70zsuGCJhyqM8gxvzzzUa4tWskQ22yJVVgcTUc8fEXQ5pXZv69E1doxs7Y6gBlsykNAtqGfCVq8jegO6JtVsztBQMrgq1w_tQG-a
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGj5L5Z3yryuXSyRiVG5zjbHuWSuwkVS8_m3CAcib1wLZhxEzKHTbgLvThlIJmnv6eyBAlZ-S89nSXcctr04DSALcTahktn2MpwwdHNJ6yq4YUeMKei5b3nYhQ6daJ8r5WMSng=