[インデックス 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/
ディレクトリに配置され、ファイルタイプ(例: go
、python
、markdown
)に対応する名前のファイル(例: go.vim
)として存在します。これらのファイルには、そのファイルタイプに特化したVimの設定やマッピングが記述されており、エディタの挙動をカスタマイズするために使用されます。
Vimの textwidth
オプション
textwidth
はVimのオプションの一つで、自動改行が行われる行の最大幅を指定します。このオプションが0でない値に設定されている場合、入力中の行がこの幅を超えると、Vimは自動的に改行を挿入しようとします。
Vimの formatoptions
オプション
formatoptions
(略して fo
) は、Vimがテキストをフォーマットする際の挙動を制御するオプションです。このオプションは、様々なフラグの組み合わせで構成されており、それぞれのフラグが特定のフォーマット挙動を有効または無効にします。
このコミットで特に重要なフラグは t
です。
t
:textwidth
オプションに基づいてテキストを自動的に折り返します。つまり、textwidth
が設定されていてformatoptions
にt
フラグが含まれている場合、Vimは自動改行を行います。
setlocal
コマンド
setlocal
はVimのコマンドで、現在のバッファ(開いているファイル)にのみ適用されるオプションを設定するために使用されます。これにより、特定のファイルタイプの設定が他のファイルに影響を与えることなく適用されます。
b:undo_ftplugin
変数
b:undo_ftplugin
は、ファイルタイププラグインがロードされた際に設定されたオプションを、そのバッファが閉じられたり、ファイルタイプが変更されたりしたときに元に戻すためのVimスクリプトの変数です。この変数に設定解除コマンドを記述しておくことで、プラグインが設定したオプションが永続的に残ることを防ぎ、Vimのクリーンな状態を保つことができます。
技術的詳細
このコミットの技術的な核心は、Vimの formatoptions
オプションから t
フラグを削除することによって、Go言語ファイルにおける自動改行の挙動を無効にすることです。
-
setlocal formatoptions-=t
:setlocal
: この設定が現在のバッファにのみ適用されることを保証します。formatoptions-=t
:formatoptions
オプションからt
フラグを削除します。t
フラグはtextwidth
に基づく自動改行を有効にするものです。このフラグを削除することで、textwidth
が設定されていてもVimは自動的に改行を挿入しなくなります。これにより、Goコードの構文が意図せず壊れることを防ぎます。
-
let b:undo_ftplugin = "setl fo< com< cms<"
:b:undo_ftplugin
変数は、ファイルタイププラグインによって設定されたオプションを元に戻すためのコマンドを保持します。- 変更前は
"setl com< cms<"
でした。これはcomments
とcommentstring
オプションを元の値に戻すことを意味します。 - 変更後は
"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
の役割に関する一般的な知識。