##半ばおまじないと化したset nocompatible
.vimrc
を書くときに、僕達初心者は色々なサイトを巡って「これが良さそうだな」とか「これはみんな書いてるから書いとこう」とか考えて、設定をちまちま書いていく。
そのなかで、この設定を書く人も多いだろう。
set nocompatible
このコマンドは、vi互換の動作を無効にするコマンドである。
##vim-jp/issuesの中での言及
さて、この設定について、こんなissueがあった。
compatible について解説したほうが良いか? #471
それに関連する形で、このURLが張られている。(issue内URLはリンク切れのため同等記事掲載)
vim-jp » Hack #179: ‘cpoptions’, ‘compatible’について知る
また、vim-jpによる日本語マニュアルには、こう書いてある。
'compatible' 'cp' 'nocompatible' 'nocp'
'compatible' 'cp' 切替 (既定では オン、ファイル|vimrc|または|gvimrc|が発見されたらオフ)
グローバル
{Vi にはない}
VimをなるべくVi互換にするか、便利な機能を使えるようにするかを決定する。
これは、特別な種類のオプションである。このオプションの値が変更されると、それに伴って他のオプションも変更されるからだ。
*注意: このオプションを変更すると、予期しない効果が数多く現れる。キーマップの解釈は変わり、アンドゥも違った方法で行われる、等々。このオプションをファイル vimrc 内で設定するなら、一番先頭に置くこと。
既定ではオンなので、その他のオプションにはViの既定値が使われる。この既定値は、VimをViと全く同じように使うことを望み、オプション 'compatible'について知りもしない、または知りたいとも思わない人たちのためのものである。
Vimが立ち上がる間にファイル |vimrc| または |gvimrc| が見つかると、このオプションはオフにされ、その他のオプションで変更されていないものは、みなVimの既定値に設定される。要するに、Vimはファイル |vimrc| または|gvimrc| が存在するならVimの既定値を、存在しないならViの既定値を使うのだ ( Note: システム全体用のファイルvimrc や引数|-u|で指定されるファイルは関係ないことに注意)。|compatible-default| と |posix-compliance| も参照。
http://vim-jp.org/vimdoc-ja/options.html#'compatible'より
どうやら、.vimrcが存在するする時点でnocompatibleが成されているのと同じらしい。
ならば、自前の.vimrc
があるのなら、わざわざ先頭でset nocompatible
する必要はないということだ。
NeoVimではどうなのか?
では、NeoVimではどうなのだろう。
調べてみると、そもそも compatible
コマンドが消えており、かわりに cpoptions
にて挙動を指定するようになっている。
https://neovim.io/doc/user/options.html#'cpoptions'
'cpoptions' 'cpo' cpo
'cpoptions' 'cpo' string (Vim default: "aABceFs",
Vi default: all flags)
global
A sequence of single character flags. When a character is present
this indicates Vi-compatible behavior. This is used for things where
not being Vi-compatible is mostly or sometimes preferred.
'cpoptions' stands for "compatible-options".
Commas can be added for readability.
To avoid problems with flags that are added in the future, use the
"+=" and "-=" feature of ":set" |add-option-flags|.
(「かわりに」とは書いたものの、このオプションはVimにも存在している)
また、以下のissueにおいて、「set nocompatible
を導入することでAPIの互換性を維持していくことは難しい」と述べられている。
確証はないが、NeoVimにおいては ~/.vimrc
があろうが無かろうが、Vimにおける set nocompatible
が効いた状態になっているのだろう。