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

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

このコミットは、Go言語のVimエディタ用ファイルタイププラグインにコメント関連の設定を追加し、それに伴いVimプラグインのインストール手順を説明するreadme.txtを更新するものです。これにより、VimでGo言語のコードを編集する際に、コメントの挿入や整形がより適切に行われるようになります。

コミット

misc/vim: Added filetype settings for comments.

This basic Vim ftplugin sets the 'comments' and 'commentstring'
settings to sensible values. Future filetype settings for Go
would go in the same file.
The ftplugin was added as misc/vim/ftplugin/go/go.vim, this way
the installation instructions in readme.txt remain valid.
Fixes #5715.

R=dsymonds
CC=gobot, golang-dev
https://golang.org/cl/10323043

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

https://github.com/golang/go/commit/c1e780c4e453eef4f8a60a637aea24a8d044a747

元コミット内容

このコミットは、VimエディタにおけるGo言語のファイルタイプ設定に、コメントに関する設定を追加するものです。具体的には、Vimのファイルタイププラグイン(ftplugin)が'comments''commentstring'オプションに適切な値を設定します。将来的にGo言語の他のファイルタイプ設定もこのファイルに追加されることが想定されています。

このftpluginはmisc/vim/ftplugin/go/go.vimとして追加され、これにより既存のreadme.txtに記載されているインストール手順が引き続き有効になるように配慮されています。この変更はIssue #5715を修正するものです。

変更の背景

このコミットの主な背景は、VimエディタでGo言語のコードを編集する際のユーザーエクスペリエンスを向上させることにあります。特に、コメントの自動挿入や整形に関するVimの挙動をGo言語の慣習に合わせることが目的です。

Vimには、特定のファイルタイプ(プログラミング言語など)に応じてエディタの挙動をカスタマイズするための「ファイルタイププラグイン(ftplugin)」という仕組みがあります。Go言語のファイルを開いた際に、VimがGoのコメントスタイル(//による行コメントや/* ... */によるブロックコメント)を正しく認識し、例えばgcg + comment)コマンドでコメントアウト・アンコメントを行う際や、改行時に自動的にコメントプレフィックスを挿入する際に、適切な形式が適用されるようにする必要がありました。

Issue #5715は、おそらくVimにおけるGo言語のコメント処理に関する問題や不便さを指摘していたものと推測されます。このコミットは、その問題を解決し、VimユーザーがGoコードをより効率的に記述できるようにするためのものです。

また、readme.txtの更新は、新しいgo.vimファイルの配置場所が既存のインストール手順と整合するようにするためのものです。これにより、ユーザーが新しい設定を導入する際の混乱を避けることができます。

前提知識の解説

Vimエディタとファイルタイププラグイン (ftplugin)

Vimは、高機能なテキストエディタであり、プログラマーに広く利用されています。Vimの強力な機能の一つに、ファイルタイプに応じたカスタマイズがあります。これは「ファイルタイププラグイン(ftplugin)」によって実現されます。

  • ファイルタイプ (filetype): Vimは開いているファイルの拡張子や内容に基づいて、そのファイルの「ファイルタイプ」を自動的に識別します(例: gopythonjavascriptなど)。
  • ファイルタイププラグイン (ftplugin): 特定のファイルタイプが識別されると、Vimは設定されたディレクトリ(通常は~/.vim/ftplugin/やVimのランタイムパス内のftplugin/)にある、そのファイルタイプに対応するスクリプト(例: go.vimpython.vim)を自動的に読み込み、実行します。これにより、言語固有のインデント設定、シンタックスハイライト、キーマッピング、そして本コミットで扱われるコメント設定などを適用できます。

Vimのコメント関連オプション: 'comments''commentstring'

Vimには、コメントの挙動を制御するための重要なオプションが2つあります。

  1. 'comments'オプション:

    • このオプションは、Vimがコメントを認識し、自動的にコメントを挿入したり、コメントブロックを操作したりする方法を定義します。
    • 値はカンマ区切りの文字列で、各要素はコメントの開始、中間、終了を示すマーカーの組み合わせを定義します。
    • 例: s1:/*,mb:*,ex:*/,://
      • s1:/*: 最初の行のコメント開始マーカーが/*であることを示します。
      • mb:*: 中間行のコメントマーカーが*であることを示します。
      • ex:*/: 最終行のコメント終了マーカーが*/であることを示します。
      • ://: 行コメントの開始マーカーが//であることを示します。
    • この設定により、Vimはgcg + comment)コマンドで選択範囲をコメントアウトしたり、改行時に自動的にコメントプレフィックスを挿入したりする際に、これらのルールを適用します。
  2. 'commentstring'オプション:

    • このオプションは、Vimが新しいコメント行を挿入する際に使用するテンプレートを定義します。
    • %sというプレースホルダーが含まれており、Vimはこの部分にコメントされるテキストを挿入します。
    • 例: // %s
      • これは、Vimが新しいコメント行を作成する際に、行の先頭に// (スラッシュ2つとスペース)を挿入し、その後にユーザーが入力するテキストが続くことを意味します。Go言語の標準的な行コメント形式に合致します。

Go言語のコメント構文

Go言語には2種類のコメント構文があります。

  1. 行コメント: // から行末までがコメントになります。
    // これは行コメントです
    
  2. ブロックコメント: /* から */ までがコメントになります。複数行にわたるコメントや、コードの一部を一時的に無効化する際に使用されます。
    /*
    これは
    ブロックコメントです
    */
    

このコミットは、VimがこれらのGo言語のコメント構文を正しく理解し、操作できるようにするための設定を追加しています。

技術的詳細

このコミットは、VimのGo言語ファイルタイププラグイン(ftplugin/go/go.vim)を新規作成し、Go言語のコメント処理をVimに適切に認識させるための設定を導入しています。

misc/vim/ftplugin/go.vim の新規作成

このファイルは、Go言語のファイル(.go拡張子を持つファイルなど)がVimで開かれた際に自動的に読み込まれるスクリプトです。

  1. 著作権表示とライセンス:

    " Copyright 2013 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.
    "
    " go.vim: Vim filetype plugin for Go.
    

    標準的なGoプロジェクトの著作権とBSDスタイルのライセンス情報が含まれています。

  2. プラグインの多重読み込み防止:

    if exists("b:did_ftplugin")
        finish
    endif
    let b:did_ftplugin = 1
    

    これはVimのファイルタイププラグインにおける標準的な慣習です。b:did_ftpluginというバッファローカル変数(b:プレフィックスは現在のバッファにのみ有効な変数であることを示す)が存在する場合、つまりこのプラグインが既に現在のバッファで読み込まれている場合は、それ以上処理を進めずに終了します。これにより、同じファイルタイププラグインが複数回読み込まれることによる問題を防ぎます。

  3. コメント設定:

    setlocal comments=s1:/*,mb:*,ex:*/,://
    setlocal commentstring=//\ %s
    
    • setlocal: 現在のバッファ(ファイル)にのみ設定を適用することを意味します。
    • comments=s1:/*,mb:*,ex:*/,://:
      • s1:/*,mb:*,ex:*/: これはC言語スタイルのブロックコメント(/* ... */)をVimに認識させます。s1はコメントの開始マーカー、mbは中間行のマーカー、exは終了マーカーを定義します。これにより、Vimはgcコマンドでブロックコメントを操作したり、oOで新しい行を挿入した際に自動的に*を挿入したりする挙動を制御します。
      • ://: これはGo言語の行コメント(//)をVimに認識させます。
    • commentstring=//\ %s:
      • これは、Vimが新しいコメント行を挿入する際に使用するテンプレートを定義します。// (スラッシュ2つとスペース)の後に、コメントされるテキストが挿入されることを示します。%sはプレースホルダーです。バックスラッシュ(\)はスペースをエスケープするために使用されます。これにより、Vimのgcコマンドや自動コメント挿入機能がGo言語の標準的な行コメント形式に準拠するようになります。
  4. プラグインのアンロード設定:

    let b:undo_ftplugin = "setl com< cms<"
    

    これもVimのファイルタイププラグインの標準的な慣習です。b:undo_ftplugin変数には、このプラグインが適用した設定を元に戻すためのコマンドが格納されます。setl com<commentsオプションをローカルなデフォルト値に戻し、setl cms<commentstringオプションをローカルなデフォルト値に戻します。これにより、ファイルタイプが変更されたり、バッファが閉じられたりした際に、Vimの設定がクリーンアップされます。

  5. Vimモデルライン:

    " vim:ts=4:sw=4:et
    

    これはVimのモデルラインと呼ばれるもので、ファイルを開いた際にVimに特定のオプションを適用させるためのコメントです。ここでは、tabstop=4(タブ幅4)、shiftwidth=4(自動インデント幅4)、expandtab(タブをスペースに展開)が設定されています。これはGo言語の標準的なフォーマット(gofmt)に合わせた設定であり、コードの一貫性を保つのに役立ちます。

misc/vim/readme.txt の変更

readme.txtは、Vimプラグインのインストール方法を説明するファイルです。このコミットでは、新しいgo.vimファイルの配置場所に合わせて、インストール手順が更新されています。

変更前:

  2. Copy or link one or more plugins from ftplugin/go/*.vim to the
     Go-specific ftplugin directory underneath your vim runtime directory
     (normally $HOME/.vim/ftplugin/go/*.vim).

変更後:

  2. Copy or link ftplugin/go.vim to the ftplugin directory underneath your vim
     runtime directory (normally $HOME/.vim/ftplugin). Copy or link one or more
     additional plugins from ftplugin/go/*.vim to the Go-specific subdirectory
     in the same place ($HOME/.vim/ftplugin/go/*.vim).

この変更は、go.vimftplugin/go/ディレクトリではなく、直接ftplugin/ディレクトリに配置されるようになったことを反映しています。これは、go.vimがGo言語全般の基本的なファイルタイプ設定を提供するのに対し、ftplugin/go/*.vimはGo言語に特化した追加のプラグイン(例えば、特定のフレームワークやツールとの連携など)を配置するためのサブディレクトリとして機能するという意図を示唆しています。これにより、ユーザーは基本的なGo言語サポートを簡単に有効化しつつ、必要に応じてさらに詳細なプラグインを追加できるようになります。

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

このコミットによるコアとなるコードの変更は以下の2ファイルです。

  1. 新規ファイル追加: misc/vim/ftplugin/go.vim

    • Go言語のVimファイルタイププラグインとして新規作成されました。
    • Go言語のコメント形式をVimに認識させるためのcommentscommentstringオプションが設定されています。
  2. 既存ファイル修正: misc/vim/readme.txt

    • Vimプラグインのインストール手順が更新されました。
    • 特に、go.vimファイルの配置場所に関する説明が修正されています。

コアとなるコードの解説

misc/vim/ftplugin/go.vim

" Copyright 2013 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.
"
" go.vim: Vim filetype plugin for Go.

if exists("b:did_ftplugin")
    finish
endif
let b:did_ftplugin = 1

setlocal comments=s1:/*,mb:*,ex:*/,://
setlocal commentstring=//\ %s

let b:undo_ftplugin = "setl com< cms<"

" vim:ts=4:sw=4:et
  • if exists("b:did_ftplugin") ... finish: このブロックは、Vimのファイルタイププラグインが複数回読み込まれるのを防ぐための標準的なガードです。b:did_ftpluginというバッファローカル変数が既に存在する場合(つまり、このプラグインが既に現在のバッファに適用されている場合)、スクリプトの実行を終了します。
  • setlocal comments=s1:/*,mb:*,ex:*/,://:
    • setlocalは、この設定が現在のバッファにのみ適用されることを意味します。
    • commentsオプションは、Vimがコメントを認識する方法を定義します。
    • s1:/*,mb:*,ex:*/: これはC言語スタイルのブロックコメント(/* ... */)の開始、中間、終了マーカーを定義します。Go言語もこの形式のブロックコメントをサポートしているため、Vimがこれを正しく扱えるようになります。
    • ://: これはGo言語の行コメント(//)の開始マーカーを定義します。これにより、Vimは//で始まる行をコメントとして認識します。
  • setlocal commentstring=//\ %s:
    • commentstringオプションは、Vimが新しいコメント行を挿入する際に使用するテンプレートを定義します。
    • //\ %sは、// (スラッシュ2つとスペース)の後にコメントされるテキストが続く形式を示します。%sはVimがテキストを挿入するプレースホルダーです。これにより、Vimの自動コメント挿入機能やgcコマンドがGo言語の標準的な行コメント形式に準拠します。
  • let b:undo_ftplugin = "setl com< cms<":
    • この行は、このプラグインによって行われた設定変更を元に戻すためのコマンドを定義します。setl com<setl cms<は、それぞれcommentscommentstringオプションをローカルなデフォルト値に戻します。これにより、バッファが閉じられたり、ファイルタイプが変更されたりした際に、Vimの設定がクリーンアップされ、他のファイルタイプに影響を与えないようになります。
  • " vim:ts=4:sw=4:et:
    • これはVimのモデルラインです。このコメント行が存在することで、Vimはこのファイルを開いた際に、tabstop=4(タブ幅を4スペースに設定)、shiftwidth=4(自動インデント幅を4スペースに設定)、expandtab(タブ文字をスペースに展開)というオプションを適用します。これらはGo言語の標準的なコーディングスタイル(gofmt)に合致しており、コードの整形を助けます。

misc/vim/readme.txt

--- a/misc/vim/readme.txt
+++ b/misc/vim/readme.txt
@@ -47,9 +47,10 @@ Vim filetype plugins
 To install one of the available filetype plugins:
  
   1. Same as 1 above.
-  2. Copy or link one or more plugins from ftplugin/go/*.vim to the
-     Go-specific ftplugin directory underneath your vim runtime directory
-     (normally $HOME/.vim/ftplugin/go/*.vim).
+  2. Copy or link ftplugin/go.vim to the ftplugin directory underneath your vim
+     runtime directory (normally $HOME/.vim/ftplugin). Copy or link one or more
+     additional plugins from ftplugin/go/*.vim to the Go-specific subdirectory
+     in the same place ($HOME/.vim/ftplugin/go/*.vim).
   3. Add the following line to your .vimrc file (normally $HOME/.vimrc):
  
      filetype plugin on
  • この差分は、Vimファイルタイププラグインのインストール手順のステップ2を修正しています。
  • 変更前: 以前は、ftplugin/go/*.vimにあるプラグインを$HOME/.vim/ftplugin/go/*.vimにコピーまたはリンクするように指示していました。これは、Go言語関連のすべてのVimプラグインがftplugin/go/サブディレクトリに配置されることを想定していました。
  • 変更後: 新しい手順では、まずftplugin/go.vim(今回追加されたファイル)を直接$HOME/.vim/ftplugin/ディレクトリにコピーまたはリンクするように指示しています。これは、go.vimがGo言語の基本的なファイルタイプ設定を提供する「メイン」プラグインであることを示唆しています。
  • その上で、ftplugin/go/*.vimにある追加のプラグインは、引き続き$HOME/.vim/ftplugin/go/*.vimというGo言語専用のサブディレクトリにコピーまたはリンクするように指示しています。
  • この変更により、ユーザーはgo.vimを適切な場所に配置することで、Go言語の基本的なVimサポートを有効にできるようになり、インストール手順が新しいファイル構造と整合するようになりました。

関連リンク

参考にした情報源リンク