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

[インデックス 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のファイルタイププラグインの設計と、ユーザー体験への配慮があります。

  1. 再読み込みガードの不備: Vimのファイルタイププラグインは、特定のファイルタイプ(例: .goファイル)を開いたときに自動的に読み込まれるスクリプトです。しかし、Vimの操作によっては、同じバッファに対してプラグインが複数回読み込まれてしまうことがあります。これを防ぐために、通常はb:did_ftpluginのようなバッファローカル変数を使って、一度読み込まれたらそれ以上読み込まないようにする「ガード」を設けます。このコミット以前は、このガードの実装が不適切であったため、プラグインが意図せず複数回読み込まれ、予期せぬ動作やエラーを引き起こす可能性がありました。
  2. 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開発におけるツール連携の考慮事項に焦点を当てています。

  1. 再読み込みガードの修正:

    • 従来のif exists("b:did_ftplugin")というガードは、一般的なdid_ftplugin変数を使用しており、これは他のファイルタイププラグインによっても設定される可能性があります。このため、Goの特定のプラグイン(fmt.vimimport.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スクリプトのコマンドです。
  2. 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.vimimport.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プラグインの堅牢性とユーザーフレンドリーさを向上させるための重要なステップです。

関連リンク

参考にした情報源リンク

  • Vim documentation (:help ftplugin, :help b:, :help map, :help K): Vimの組み込みヘルプは、Vimスクリプトや機能に関する最も信頼できる情報源です。
  • Go documentation (godoc): godocコマンド自体のドキュメントや、Go言語の公式ドキュメント。
  • 一般的なVimプラグイン開発の慣習に関する記事やチュートリアル。