📌

[備忘録] Neovim 初期化処理 整理

2022/10/09に公開

[備忘録] Neovim 初期化処理

Neovimの初期化処理について、公式ドキュメント(英語)の内容を日本語で整理する。

初期化処理 (Initialization)

1. shell オプションの設定

環境変数 SHELL が存在する場合、 shell オプションに設定する。
:set shell で確認可能。
※ Win32バージョンの挙動は割愛。

2. 引数の処理

Neovim起動時のコマンドで渡された引数を処理する。
渡されたすべてのファイルに対してバッファが作成される。(まだファイルのロードはされない)
-V オプションで何が起きているのか出力することができるため、初期化処理のデバッグにも使える。

3. UIへの接続を待機する

--embed オプションが指定されているとき、ユーザー設定読み込みの前にUIへの接続を待機する。
UIについては別途確認。

4. default-mappingsdefaut-autocmds を設定し、 popup-menu を作成する。

5. filetype と `indent` のプラグインを有効化する

以下のコマンドと同様の処理がされる。

:runtime! ftplugin.vim indent.vim

runtimepath で指定されているすべてのディレクトリから、ftplugin.vimindent.vim を検索し読み込む。
-u NONE が指定されている場合、この処理はスキップされる。

6. ユーザー設定を読み込む (Exコマンドをファイルや環境から読み込み実行する)

$VIMINIT 環境変数から、1行のExコマンドを読み込み実行する。(複数コマンド指定する場合は、 <NL> で区切る)

設定ファイル(vimrcとも呼ばれる)から、初期化コマンドを読み込む。
ファイル Vimscript (init.vim)Lua (init.lua)いずれか である必要がある。

設定ファイルの保存場所としては以下。

  • Unixの場合
    • ~/.config/nvim/init.vim (or init.lua)
  • Windowsの場合
    • 今回は割愛
  • $XDG_CONFIG_HOMEが指定されている場合
    • $XDG_CONFIG_HOME/nvim/init.vim (or init.lua)

-u {file} が指定されている場合、 fileで指定したファイルが設定ファイルとされ、ステップ5までの初期化処理がスキップされる。
-u NORC が指定されている場合、ユーザー設定の読み込みがスキップされファイルの読み込みも行われない。
-u NONE が指定されている場合、さらにプラグインに読み込みやシンタックスのハイライトなどもスキップされる。
-es が指定されている場合、ステップ5までのすべての初期化処理がスキップされる。

$XDG_CONFIG_DIRS で指定されているいずれかのディレクトリに nvim/sysinit.vim が存在する場合、システム設定ファイルとして読み込まれる。

設定ファイルが探索される順序としては以下。

  1. $VIMINIT 環境変数 (Exコマンド)
  2. ユーザー設定 $XDG_CONFIG_HOME/nvim/init.vim (or init.lua)
  3. その他ユーザー設定 {dir}/nvim/init.vim ({dir}$XDG_CONFIG_HOME に含まれるディレクトリ)
  4. $EXINIT 環境変数 (Exコマンド)
    $MYVIMRC が最初の探索場所として設定される。(すでに設定されている、もしくは $VIMINIT が使用されている場合を除く)
    exrc オプションがオンである場合、以下の2つのアイルをカレントディクトリから検索する。(最初に存在するほうが優先される)
  • .nvimrc
  • .exrc

7. ファイルタイプの検出を有効化する

以下のコマンドと同様の処理がされる。

:runtime! filetype.lua filetype.vim

runtimepath で指定されているすべてのディレクトリから、 filetype.luafiletype.vim を検索し読み込む。
:filetype off が呼ばれている場合、もしくは -u NONE が指定されている場合この処理はスキップされる。

8. シンタックスハイライトの有効化

以下のコマンドと同様の処理がされる。

:runtime! syntax/syntax.vim

:syntax off が呼ばれている場合、もしくは -u NONE が指定されている場合この処理はスキップされる。

9. プラグインのロード

以下のコマンドと同様の処理がされる。

:runtime! plugin/**/*.vim
:runtime! plugin/**/*.lua

runtimepath で指定されている全てのディレクトリの plugin サブディレクトリから、.vim もしくは .lua で終わるファイルを検索し読み込む。
例外として、 runtimepath 含まれるが after で終了するディレクトリについては、スキップされパッケージの読み込み後にのみロードされる。

以下の場合、プラグインのロードが行われない。

  • loadplugins オプションが設定ファイルでリセットされている。
  • --noplugin が引数に指定されている。
  • --clean が引数に指定されている。
  • -u NONE が引数に指定されている。

packpath に含まれるすべてのディレクトリの start サブディレクトリから、パッケージがロードされる。(パッケージは1つ以上のプラグインを含むディレクトリ)

10. shellpipeshellredir の設定

[1. shell オプションの設定」(###1. shell オプションの設定)で設定された shell オプションに基づいて、 shellpipeshellredir のオプションが設定される。(すでに設定されている場合はスキップ)

11. updatecount を0に設定する

-n が引数に指定されている場合。

12. バイナリオプションを設定する

-b が引数に指定されている場合。

13. shada-file を読み込む

shada-file == Shared data file
別途確認

14. quickfixファイルを読み込む

-q が引数に指定されている場合、もしくは異常終了していた場合。

15. 全てのウィンドウを開く

-o が引数に指定されている場合、全ウィンドウが開かれる。(この時点ではまだ見えない)
-p が引数に指定されている場合、タブページが作成される。(この時点ではまだ見えない)
-q が引数に指定されている場合、エラーが発生した場合最初のエラーにジャンプする。
全ウィンドウに対するバッファが、 BufAdd autocommandの実行無しでロードされる。

16. スタートップコマンドの実行

-t が引数に指定されている場合、タグにジャンプする。
-c+cmd で指定されているコマンドが実行される。
スターティングフラグがリセットされ、 has("vim_starting") が0を返す。
v:vim_did_enter 変数に1がセットされる。
VimEnter autocommandが実行される。

その他

Vimのスタートアップが遅い場合、 --startuptime 引数で何が起きているのか見つけることができる。

Discussion