[インデックス 14230] ファイルの概要
このコミットは、Go言語のVimプラグインにおけるいくつかの修正と改善を目的としています。具体的には、ファイルタイププラグインの再読み込みガードの修正と、既存のK
キーマッピングの削除が行われています。
コミット
commit c8fe9c7606cd00e2b68d0b619d81edc92e4e7ec7
Author: Andrew Radev <andrey.radev@gmail.com>
Date: Mon Oct 29 22:10:59 2012 +1100
misc/vim: fix reimport guard and remove K mapping.
The "did_ftplugin" lines were ineffective and the "K" mapping was too
invasive, which is why it was removed.
R=golang-dev, dsymonds, minux.ma
CC=golang-dev
https://golang.org/cl/6823044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c8fe9c7606cd00e2b68d0b619d81edc92e4e7ec7
元コミット内容
このコミットの元の内容は以下の通りです。
misc/vim: fix reimport guard and remove K mapping.
The "did_ftplugin" lines were ineffective and the "K" mapping was too invasive, which is why it was removed.
これは、VimのGo言語用ファイルタイププラグインにおいて、再読み込み防止のガードが機能していなかった問題と、K
キーに割り当てられていたマッピングがユーザーにとって「侵襲的すぎる(既存のVimの挙動を大きく変えすぎる)」という理由で削除されたことを示しています。
変更の背景
この変更の背景には、Vimのファイルタイププラグインの設計と、ユーザー体験への配慮があります。
- 再読み込みガードの不備: Vimのファイルタイププラグインは、特定のファイルタイプ(例:
.go
ファイル)を開いたときに自動的に読み込まれるスクリプトです。しかし、Vimの操作によっては、同じバッファに対してプラグインが複数回読み込まれてしまうことがあります。これを防ぐために、通常はb:did_ftplugin
のようなバッファローカル変数を使って、一度読み込まれたらそれ以上読み込まないようにする「ガード」を設けます。このコミット以前は、このガードの実装が不適切であったため、プラグインが意図せず複数回読み込まれ、予期せぬ動作やエラーを引き起こす可能性がありました。 K
キーマッピングの侵襲性: Vimにおいて、K
キーはデフォルトでカーソル下のキーワードに関するドキュメント(通常はman
ページなど)を表示する機能(keywordprg
)に割り当てられています。Go言語のVimプラグインでは、このK
キーをgodoc
コマンド(Goのドキュメントツール)の実行に再マッピングしていました。しかし、多くのVimユーザーにとってK
キーのデフォルトの挙動は非常に一般的で有用であり、それをGo固有の機能に上書きすることは、Vimの標準的な操作感を損ねる「侵襲的」な変更と見なされました。そのため、ユーザー体験を向上させるために、このマッピングが削除されることになりました。
前提知識の解説
このコミットを理解するためには、以下の前提知識があると役立ちます。
- Vimのファイルタイププラグイン (ftplugin): Vimには、開いているファイルのタイプ(例:
go
,python
,javascript
など)に応じて、特定のスクリプトを自動的に読み込む機能があります。これらのスクリプトは「ファイルタイププラグイン」と呼ばれ、ファイルタイプ固有のオプション設定、コマンド、キーマッピングなどを定義します。通常、~/.vim/ftplugin/<filetype>/
ディレクトリに配置されます。 - Vimのバッファローカル変数 (
b:
): Vimには、グローバル変数、ウィンドウローカル変数、バッファローカル変数など、様々なスコープの変数が存在します。b:
プレフィックスを持つ変数はバッファローカル変数であり、特定のバッファ(開いているファイル)にのみ有効です。これにより、異なるファイルを開いているときに設定が衝突するのを防ぐことができます。b:did_ftplugin
のような変数は、ファイルタイププラグインがそのバッファに対して既に読み込まれたかどうかを追跡するために慣習的に使用されます。 - Vimのキーマッピング: Vimでは、特定のキーシーケンスにコマンドや別のキーシーケンスを割り当てることができます。これを「マッピング」と呼びます。
nmap
はノーマルモードでのマッピングを定義し、<buffer>
はマッピングを現在のバッファに限定します。<silent>
はマッピング実行時にコマンドラインに表示されるメッセージを抑制します。<Plug>
は、プラグイン内部で使用される特殊なマッピングで、ユーザーが直接呼び出すことを意図しないが、他のマッピングから参照される可能性があります。 godoc
コマンド: Go言語に付属するツールの一つで、Goのソースコードからドキュメントを生成・表示します。コマンドラインでgodoc <package_path>
やgodoc <symbol_name>
のように使用することで、パッケージや関数のドキュメントを参照できます。- Gerrit: Goプロジェクトがコードレビューに利用しているシステムです。
https://golang.org/cl/6823044
のようなURLは、Gerrit上の特定の変更リスト(Change-ID)を指します。
技術的詳細
このコミットは、Vimスクリプトの基本的な慣習と、Go開発におけるツール連携の考慮事項に焦点を当てています。
-
再読み込みガードの修正:
- 従来の
if exists("b:did_ftplugin")
というガードは、一般的なdid_ftplugin
変数を使用しており、これは他のファイルタイププラグインによっても設定される可能性があります。このため、Goの特定のプラグイン(fmt.vim
やimport.vim
)が、Goファイルを開いたときに複数回読み込まれるのを完全に防ぐことができませんでした。 - 修正後は、
fmt.vim
ではb:did_ftplugin_go_fmt
を、import.vim
ではb:did_ftplugin_go_import
というように、プラグイン固有のバッファローカル変数を使用するように変更されました。これにより、各プラグインが自身の読み込み状態を正確に管理できるようになり、再読み込みによる問題が解消されます。 - ガードのパターンは以下のようになります。
if exists("b:did_ftplugin_go_fmt") finish endif " ... プラグインの処理 ... let b:did_ftplugin_go_fmt = 1
finish
は、スクリプトのそれ以降の処理を中断し、読み込みを終了させるVimスクリプトのコマンドです。
- 従来の
-
K
マッピングの削除とgodoc.vim
の廃止:misc/vim/ftplugin/go/godoc.vim
ファイル自体が削除されました。このファイルは、K
キーをgodoc
機能にマッピングする役割を担っていました。K
マッピングが削除された理由は、Vimの標準的なK
キーの挙動(keywordprg
の実行)を上書きすることが、多くのVimユーザーにとって不便であり、「侵襲的」であると判断されたためです。Vimのキーマッピングは強力ですが、標準的な挙動を変更する際には、その影響を慎重に考慮する必要があります。この変更は、GoのVimプラグインがVimの既存の慣習とより調和するようにするためのものです。misc/vim/readme.txt
からも、godoc.vim
のインストールに関する記述が削除され、変更がドキュメントにも反映されています。
コアとなるコードの変更箇所
このコミットにおける主要なコード変更は以下のファイルに集中しています。
misc/vim/ftplugin/go/fmt.vim
misc/vim/ftplugin/go/godoc.vim
(削除)misc/vim/ftplugin/go/import.vim
misc/vim/readme.txt
misc/vim/ftplugin/go/fmt.vim
の変更
--- a/misc/vim/ftplugin/go/fmt.vim
+++ b/misc/vim/ftplugin/go/fmt.vim
@@ -12,6 +12,9 @@
" It tries to preserve cursor position and avoids
" replacing the buffer with stderr output.
"
+if exists("b:did_ftplugin_go_fmt")
+ finish
+endif
command! -buffer Fmt call s:GoFormat()
@@ -41,4 +44,6 @@ function! s:GoFormat()\
call winrestview(view)
endfunction
+let b:did_ftplugin_go_fmt = 1
+
" vim:ts=4:sw=4:et
misc/vim/ftplugin/go/godoc.vim
の変更
このファイルは完全に削除されました。
--- a/misc/vim/ftplugin/go/godoc.vim
+++ /dev/null
@@ -1,13 +0,0 @@
-" Copyright 2011 The Go Authors. All rights reserved.
-" Use of this source code is governed by a BSD-style
-" license that can be found in the LICENSE file.
-"
-" godoc.vim: Vim command to see godoc.
-"
-if exists("b:did_ftplugin")
- finish
-endif
-
-silent! nmap <buffer> <silent> K <Plug>(godoc-keyword)
-
-" vim:ts=4:sw=4:et
misc/vim/ftplugin/go/import.vim
の変更
--- a/misc/vim/ftplugin/go/import.vim
+++ b/misc/vim/ftplugin/go/import.vim
@@ -32,7 +32,7 @@
" The backslash is the default maplocalleader, so it is possible that
" your vim is set to use a different character (:help maplocalleader).
"
-if exists("b:did_ftplugin")
+if exists("b:did_ftplugin_go_import")
finish
endif
@@ -228,4 +228,6 @@ function! s:Error(s)\
echohl Error | echo a:s | echohl None
endfunction
+let b:did_ftplugin_go_import = 1
+
" vim:ts=4:sw=4:et
misc/vim/readme.txt
の変更
--- a/misc/vim/readme.txt
+++ b/misc/vim/readme.txt
@@ -72,5 +72,4 @@ To install godoc plugin:
1. Same as 1 above.
2. Copy or link plugin/godoc.vim to $HOME/.vim/plugin/godoc,
syntax/godoc.vim to $HOME/.vim/syntax/godoc.vim,
-- ftplugin/go/godoc.vim to $HOME/.vim/ftplugin/go/godoc.vim.\
and autoload/go/complete.vim to $HOME/.vim/autoload/go/complete.vim.\
コアとなるコードの解説
-
fmt.vim
とimport.vim
の再読み込みガード修正:- これらのファイルでは、スクリプトの冒頭に
if exists("b:did_ftplugin_go_fmt")
(または_go_import
)とfinish
が追加され、末尾にlet b:did_ftplugin_go_fmt = 1
(または_go_import
)が追加されました。 - これはVimのファイルタイププラグインにおける標準的なイディオムであり、バッファが既にこのプラグインによって初期化されている場合、スクリプトの残りの部分が実行されないようにします。これにより、マッピングやコマンドの重複定義、あるいはその他の副作用を防ぎます。以前の
b:did_ftplugin
は汎用的な変数名であったため、他のプラグインとの衝突や意図しない挙動を引き起こす可能性がありましたが、b:did_ftplugin_go_fmt
のようにプラグイン固有の名前にすることで、この問題が解決されました。
- これらのファイルでは、スクリプトの冒頭に
-
godoc.vim
の削除:- このファイルは、
K
キーにgodoc
機能をマッピングしていました。ファイル自体が削除されたことで、GoのVimプラグインはK
キーのデフォルトの挙動を上書きしなくなりました。 - これにより、Vimユーザーは
K
キーを他の用途(例えば、man
ページ参照や、他のプラグインによるドキュメント参照)に自由に利用できるようになり、Vimの標準的な操作性が維持されます。Goのドキュメントを参照したい場合は、別のコマンドやマッピングを使用するか、godoc
コマンドを直接実行する必要があります。
- このファイルは、
-
readme.txt
の更新:godoc.vim
が削除されたことに伴い、readme.txt
内のgodoc
プラグインのインストール手順から、ftplugin/go/godoc.vim
に関する記述が削除されました。これは、コードベースの変更がドキュメントにも適切に反映されていることを示しています。
これらの変更は、Go言語のVimプラグインの堅牢性とユーザーフレンドリーさを向上させるための重要なステップです。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- Vimの公式ウェブサイト: https://www.vim.org/
- Gerrit Code Review: https://www.gerritcodereview.com/
- このコミットのGerrit変更リスト: https://golang.org/cl/6823044
参考にした情報源リンク
- Vim documentation (
:help ftplugin
,:help b:
,:help map
,:help K
): Vimの組み込みヘルプは、Vimスクリプトや機能に関する最も信頼できる情報源です。 - Go documentation (
godoc
):godoc
コマンド自体のドキュメントや、Go言語の公式ドキュメント。 - 一般的なVimプラグイン開発の慣習に関する記事やチュートリアル。