[備忘録] Neovim 初期化処理 整理
[備忘録] Neovim 初期化処理
Neovimの初期化処理について、公式ドキュメント(英語)の内容を日本語で整理する。
初期化処理 (Initialization)
shell
オプションの設定
1. 環境変数 SHELL
が存在する場合、 shell
オプションに設定する。
:set shell
で確認可能。
※ Win32バージョンの挙動は割愛。
2. 引数の処理
Neovim起動時のコマンドで渡された引数を処理する。
渡されたすべてのファイルに対してバッファが作成される。(まだファイルのロードはされない)
-V
オプションで何が起きているのか出力することができるため、初期化処理のデバッグにも使える。
3. UIへの接続を待機する
--embed
オプションが指定されているとき、ユーザー設定読み込みの前にUIへの接続を待機する。
UIについては別途確認。
default-mappings
と defaut-autocmds
を設定し、 popup-menu
を作成する。
4.
filetype
と `indent` のプラグインを有効化する
5. 以下のコマンドと同様の処理がされる。
:runtime! ftplugin.vim indent.vim
runtimepath
で指定されているすべてのディレクトリから、ftplugin.vim
と indent.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
が存在する場合、システム設定ファイルとして読み込まれる。
設定ファイルが探索される順序としては以下。
-
$VIMINIT
環境変数 (Exコマンド) - ユーザー設定
$XDG_CONFIG_HOME/nvim/init.vim (or init.lua)
- その他ユーザー設定
{dir}/nvim/init.vim
({dir}
は$XDG_CONFIG_HOME
に含まれるディレクトリ) -
$EXINIT
環境変数 (Exコマンド)
$MYVIMRC
が最初の探索場所として設定される。(すでに設定されている、もしくは$VIMINIT
が使用されている場合を除く)
exrc
オプションがオンである場合、以下の2つのアイルをカレントディクトリから検索する。(最初に存在するほうが優先される)
.nvimrc
.exrc
7. ファイルタイプの検出を有効化する
以下のコマンドと同様の処理がされる。
:runtime! filetype.lua filetype.vim
runtimepath
で指定されているすべてのディレクトリから、 filetype.lua
と filetype.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つ以上のプラグインを含むディレクトリ)
shellpipe
と shellredir
の設定
10. [1. shell
オプションの設定」(###1. shell
オプションの設定)で設定された shell
オプションに基づいて、 shellpipe
と shellredir
のオプションが設定される。(すでに設定されている場合はスキップ)
updatecount
を0に設定する
11. -n
が引数に指定されている場合。
12. バイナリオプションを設定する
-b
が引数に指定されている場合。
shada-file
を読み込む
13. 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