Nvim-runtimepath-解析

runtimepathrtp 是 Vim/Nvim 中的一个全局选项, 本质是一个 string 类型, 用于记录 Vim/Nvim 查找 vim/lua 文件的路径, 多个路径用 , 分隔. 其默认值为:

"$XDG_CONFIG_HOME/nvim,
$XDG_CONFIG_DIRS[1]/nvim,
$XDG_CONFIG_DIRS[2]/nvim,
…
$XDG_DATA_HOME/nvim[-data]/site,
$XDG_DATA_DIRS[1]/nvim/site,
$XDG_DATA_DIRS[2]/nvim/site,
…
$VIMRUNTIME,
…
$XDG_DATA_DIRS[2]/nvim/site/after,
$XDG_DATA_DIRS[1]/nvim/site/after,
$XDG_DATA_HOME/nvim[-data]/site/after,
…
$XDG_CONFIG_DIRS[2]/nvim/after,
$XDG_CONFIG_DIRS[1]/nvim/after,
$XDG_CONFIG_HOME/nvim/after")

Vim/Nvim 会自动查找这些目录下的一些子目录, 分别对应不同的加载行为:

  filetype.lua	filetypes |new-filetype|
  autoload/	automatically loaded scripts |autoload-functions|
  colors/	color scheme files |:colorscheme|
  compiler/	compiler files |:compiler|
  doc/		documentation |write-local-help|
  ftplugin/	filetype plugins |write-filetype-plugin|
  indent/	indent scripts |indent-expression|
  keymap/	key mapping files |mbyte-keymap|
  lang/		menu translations |:menutrans|
  lua/		|Lua| plugins
  menu.vim	GUI menus |menu.vim|
  pack/		packages |:packadd|
  parser/	|treesitter| syntax parsers
  plugin/	plugin scripts |write-plugin|
  queries/	|treesitter| queries
  rplugin/	|remote-plugin| scripts
  spell/	spell checking files |spell|
  syntax/	syntax files |mysyntaxfile|
  tutor/	tutorial files |:Tutor|

似乎在自己添加一个目录到 runtimepath 之后, 其也会搜寻新添加目录下的这些子目录. 注意这些子目录对脚本的处理大都不相同:

  • plugin, 放置在该目录下的脚本都会被自动读取并运行
  • ftplugin, 和 plugin 类似, 但会先检查文件扩展名, 如果有 ftplugin/lua.lua 文件, 那么该文件会在编辑 lua 文件时被自动读取
  • syntaxftplugin 一样
  • ftdetectftplugin 一样
  • lua, nvim 会在这个目录下寻找要加载的脚本, 但是不会自动运行, 需要在 init.luarequire, 如 lua/hello.lua, 则需要 require("hello")
  • compiler, 用于 :compiler 指令查找文件并运行
  • colors, 用于 :colorscheme 指令查找文件并运行
  • tutor, 用于 :Tutor 指令查找文件并运行, 但是文件扩展名需要为 .tutor

需要注意的是, 只有 runtimepath 中指定的目录, 其对应的子目录才会有效, 而不会自动嵌套其作用.

可以用:

1
:echo stdpath("config")

来查看 $XDG_CONFIG_HOME 设置的值.

用:

1
:echo stdpath("data")

来查看 $XDG_DATA_HOME 的值.

用:

1
:echo stdpath("state")

来查看 $XDG_STATE_HOME 的值.

查看当前 runtimepath 值

使用 vimscript 查看, 可以在 normal 模式下运行:

1
:set runtimepath?

使用 lua api 的查看方法, 这里同样是 normal 模式下运行:

1
:lua print(vim.opt.rtp['_value'])

向 runtimepath 添加目录

用 vimscript 如:

1
let &runtimepath .= ","."/new/path/"

Lua API 如:

1
2
3
vim.cmd [[
let &runtimepath .= ","."/new/path/"
]]

lua 目录的好处

假如 ~/.config/nvim 下的目录结构为:

1
2
3
4
5
6
7
8
9
.
├── after
│   └── world.lua
├── ftplugin
├── init.lua
├── lua
│   └── hello.lua
├── plugin
└── syntax

若想加载 lua/hello.lua 文件, 则需要在 init.lua 文件中加上:

1
require("hello")

Nvim-runtimepath-解析
http://example.com/2024/03/27/Nvim-runtimepath-解析/
作者
Jie
发布于
2024年3月27日
许可协议