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

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

このコミットは、Go言語のVimエディタ用ファイルタイププラグインである misc/vim/ftplugin/go.vim に対する変更です。このファイルは、VimでGo言語のファイルを開いた際に、Go言語特有の編集体験を向上させるための設定を提供します。具体的には、コメントの書式設定や、このコミットで修正される自動改行の挙動などが含まれます。

コミット

misc/vim: Disable automatic line wrapping by textwidth.

If someone configures a 'textwidth' in go files, vim will by default insert
newlines into long lines as you type, which breaks syntax and doesn't really
make sense for go code. This fixes the default.

LGTM=dsymonds
R=golang-codereviews, gobot, dsymonds
CC=golang-codereviews
https://golang.org/cl/76890046

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

https://github.com/golang/go/commit/3eb591ff76c9edb8a9ed6466712be425269f8739

元コミット内容

misc/vim: Disable automatic line wrapping by textwidth.

If someone configures a 'textwidth' in go files, vim will by default insert
newlines into long lines as you type, which breaks syntax and doesn't really
make sense for go code. This fixes the default.

変更の背景

この変更の背景には、Vimエディタの textwidth オプションと formatoptions オプションの相互作用があります。Vimでは、textwidth オプションを設定すると、入力中の行が指定された文字数を超えた場合に自動的に改行を挿入する機能があります。これは、通常のテキストファイルやドキュメントを作成する際には便利な機能ですが、プログラミング言語のソースコード、特にGo言語のような厳格な構文を持つ言語においては問題を引き起こす可能性がありました。

Go言語のコードでは、改行の位置が構文的に意味を持つ場合があります(例: セミコロンの自動挿入)。Vimが自動的に改行を挿入してしまうと、意図しない構文エラーを引き起こしたり、コードの可読性を損なったりする可能性がありました。特に、Go言語の慣習では、gofmt などのツールによってコードのフォーマットが自動的に行われることが一般的であり、エディタ側での自動改行はむしろ邪魔になることが多かったため、この挙動を無効にすることが望まれました。

このコミットは、Go言語のファイルタイププラグインにおいて、textwidth が設定されている場合でも、Vimが自動的に改行を挿入しないようにデフォルトの挙動を修正することを目的としています。

前提知識の解説

Vimのファイルタイププラグイン (ftplugin)

Vimには、特定の種類のファイルを開いたときに自動的にロードされる「ファイルタイププラグイン」という仕組みがあります。これらのプラグインは、~/.vim/ftplugin/ やVimのランタイムパス内の ftplugin/ ディレクトリに配置され、ファイルタイプ(例: gopythonmarkdown)に対応する名前のファイル(例: go.vim)として存在します。これらのファイルには、そのファイルタイプに特化したVimの設定やマッピングが記述されており、エディタの挙動をカスタマイズするために使用されます。

Vimの textwidth オプション

textwidth はVimのオプションの一つで、自動改行が行われる行の最大幅を指定します。このオプションが0でない値に設定されている場合、入力中の行がこの幅を超えると、Vimは自動的に改行を挿入しようとします。

Vimの formatoptions オプション

formatoptions (略して fo) は、Vimがテキストをフォーマットする際の挙動を制御するオプションです。このオプションは、様々なフラグの組み合わせで構成されており、それぞれのフラグが特定のフォーマット挙動を有効または無効にします。

このコミットで特に重要なフラグは t です。

  • t: textwidth オプションに基づいてテキストを自動的に折り返します。つまり、textwidth が設定されていて formatoptionst フラグが含まれている場合、Vimは自動改行を行います。

setlocal コマンド

setlocal はVimのコマンドで、現在のバッファ(開いているファイル)にのみ適用されるオプションを設定するために使用されます。これにより、特定のファイルタイプの設定が他のファイルに影響を与えることなく適用されます。

b:undo_ftplugin 変数

b:undo_ftplugin は、ファイルタイププラグインがロードされた際に設定されたオプションを、そのバッファが閉じられたり、ファイルタイプが変更されたりしたときに元に戻すためのVimスクリプトの変数です。この変数に設定解除コマンドを記述しておくことで、プラグインが設定したオプションが永続的に残ることを防ぎ、Vimのクリーンな状態を保つことができます。

技術的詳細

このコミットの技術的な核心は、Vimの formatoptions オプションから t フラグを削除することによって、Go言語ファイルにおける自動改行の挙動を無効にすることです。

  1. setlocal formatoptions-=t:

    • setlocal: この設定が現在のバッファにのみ適用されることを保証します。
    • formatoptions-=t: formatoptions オプションから t フラグを削除します。t フラグは textwidth に基づく自動改行を有効にするものです。このフラグを削除することで、textwidth が設定されていてもVimは自動的に改行を挿入しなくなります。これにより、Goコードの構文が意図せず壊れることを防ぎます。
  2. let b:undo_ftplugin = "setl fo< com< cms<":

    • b:undo_ftplugin 変数は、ファイルタイププラグインによって設定されたオプションを元に戻すためのコマンドを保持します。
    • 変更前は "setl com< cms<" でした。これは commentscommentstring オプションを元の値に戻すことを意味します。
    • 変更後は "setl fo< com< cms<" となっています。ここに fo< が追加されました。fo<formatoptions オプションを元の値に戻すことを意味します。これにより、go.vim プラグインが formatoptions を変更した場合でも、ファイルが閉じられたりファイルタイプが変更されたりしたときに、その変更が適切に元に戻されるようになります。これは、Vimの設定の整合性を保つ上で非常に重要です。

この変更により、Go言語のファイルを開いた際に、ユーザーが textwidth を設定していても、Vimが自動的にコードを改行する挙動が抑制され、Go言語のコーディングスタイルやツール(gofmtなど)との整合性が向上します。

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

--- a/misc/vim/ftplugin/go.vim
+++ b/misc/vim/ftplugin/go.vim
@@ -9,9 +9,11 @@ if exists("b:did_ftplugin")
 endif
 let b:did_ftplugin = 1
 
+setlocal formatoptions-=t
+
 setlocal comments=s1:/*,mb:*,ex:*/,://
 setlocal commentstring=//\ %s
 
-let b:undo_ftplugin = "setl com< cms<"
+let b:undo_ftplugin = "setl fo< com< cms<"
 
 " vim:ts=4:sw=4:et

コアとなるコードの解説

  • --- a/misc/vim/ftplugin/go.vim
    • 変更前のファイルパスを示しています。
  • +++ b/misc/vim/ftplugin/go.vim
    • 変更後のファイルパスを示しています。
  • @@ -9,9 +9,11 @@
    • 変更がファイルの9行目から始まり、元の9行が変更後11行になったことを示しています。
  • +setlocal formatoptions-=t
    • この行が新しく追加されました。現在のバッファの formatoptions から t フラグを削除し、textwidth に基づく自動改行を無効にします。
  • -let b:undo_ftplugin = "setl com< cms<"
    • この行が削除されました。これは、以前の b:undo_ftplugin の設定です。
  • +let b:undo_ftplugin = "setl fo< com< cms<"
    • この行が新しく追加されました。b:undo_ftplugin の設定を更新し、formatoptions (fo<) も元の値に戻すように変更されました。これにより、プラグインが設定した formatoptions の変更が、バッファが閉じられたときに適切にクリーンアップされます。

関連リンク

参考にした情報源リンク

  • Vim documentation (:help textwidth, :help formatoptions, :help ftplugin, :help undo_ftplugin, :help setlocal)
  • Go言語のコーディング規約と gofmt の役割に関する一般的な知識。