aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2022-03-06 13:13:10 +0100
committerbfredl <bjorn.linse@gmail.com>2022-03-07 09:59:22 +0100
commitf39a12d629500bdbacb389ed593adac34d058fcb (patch)
treeac980373621461b12b503beb573d4dff9b85c0eb
parent8e7446b3cbc5c82706f41d701239fa18ab5b2808 (diff)
downloadrneovim-f39a12d629500bdbacb389ed593adac34d058fcb.tar.gz
rneovim-f39a12d629500bdbacb389ed593adac34d058fcb.tar.bz2
rneovim-f39a12d629500bdbacb389ed593adac34d058fcb.zip
refactor(lua): make vim submodule lazy loading declarative
This will allow us to also use the same logic for lua threads and processes, later.
-rw-r--r--runtime/lua/vim/_editor.lua52
-rw-r--r--runtime/lua/vim/_init_packages.lua20
-rw-r--r--runtime/lua/vim/shared.lua8
-rw-r--r--src/nvim/CMakeLists.txt1
4 files changed, 40 insertions, 41 deletions
diff --git a/runtime/lua/vim/_editor.lua b/runtime/lua/vim/_editor.lua
index ddd1147468..2251aca004 100644
--- a/runtime/lua/vim/_editor.lua
+++ b/runtime/lua/vim/_editor.lua
@@ -3,9 +3,11 @@
-- Lua code lives in one of three places:
-- 1. runtime/lua/vim/ (the runtime): For "nice to have" features, e.g. the
-- `inspect` and `lpeg` modules.
--- 2. runtime/lua/vim/shared.lua: Code shared between Nvim and tests.
--- (This will go away if we migrate to nvim as the test-runner.)
--- 3. runtime/lua/vim/_editor.lua: Compiled-into Nvim itself.
+-- 2. runtime/lua/vim/shared.lua: pure lua functions which always
+-- are available. Used in the test runner, as well as worker threads
+-- and processes launched from Nvim.
+-- 3. runtime/lua/vim/_editor.lua: Code which directly interacts with
+-- the Nvim editor state. Only available in the main thread.
--
-- Guideline: "If in doubt, put it in the runtime".
--
@@ -35,43 +37,19 @@
-- - https://github.com/howl-editor/howl/tree/master/lib/howl/util
local vim = assert(vim)
-assert(vim.inspect)
-- These are for loading runtime modules lazily since they aren't available in
-- the nvim binary as specified in executor.c
-setmetatable(vim, {
- __index = function(t, key)
- if key == 'treesitter' then
- t.treesitter = require('vim.treesitter')
- return t.treesitter
- elseif key == 'filetype' then
- t.filetype = require('vim.filetype')
- return t.filetype
- elseif key == 'F' then
- t.F = require('vim.F')
- return t.F
- elseif require('vim.uri')[key] ~= nil then
- -- Expose all `vim.uri` functions on the `vim` module.
- t[key] = require('vim.uri')[key]
- return t[key]
- elseif key == 'lsp' then
- t.lsp = require('vim.lsp')
- return t.lsp
- elseif key == 'highlight' then
- t.highlight = require('vim.highlight')
- return t.highlight
- elseif key == 'diagnostic' then
- t.diagnostic = require('vim.diagnostic')
- return t.diagnostic
- elseif key == 'keymap' then
- t.keymap = require('vim.keymap')
- return t.keymap
- elseif key == 'ui' then
- t.ui = require('vim.ui')
- return t.ui
- end
- end
-})
+for k,v in pairs {
+ treesitter=true;
+ filetype = true;
+ F=true;
+ lsp=true;
+ highlight=true;
+ diagnostic=true;
+ keymap=true;
+ ui=true;
+} do vim._submodules[k] = v end
vim.log = {
levels = {
diff --git a/runtime/lua/vim/_init_packages.lua b/runtime/lua/vim/_init_packages.lua
index dcb402287c..7d27741f1b 100644
--- a/runtime/lua/vim/_init_packages.lua
+++ b/runtime/lua/vim/_init_packages.lua
@@ -50,7 +50,25 @@ table.insert(package.loaders, 2, vim._load_package)
-- builtin functions which always should be available
require'vim.shared'
-vim.inspect = require'vim.inspect'
+
+vim._submodules = {inspect=true}
+
+-- These are for loading runtime modules in the vim namespace lazily.
+setmetatable(vim, {
+ __index = function(t, key)
+ if vim._submodules[key] then
+ t[key] = require('vim.'..key)
+ return t[key]
+ elseif vim.startswith(key, 'uri_') then
+ local val = require('vim.uri')[key]
+ if val ~= nil then
+ -- Expose all `vim.uri` functions on the `vim` module.
+ t[key] = val
+ return t[key]
+ end
+ end
+ end
+})
--- <Docs described in |vim.empty_dict()| >
---@private
diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua
index 48d0bd3672..8124b23eb1 100644
--- a/runtime/lua/vim/shared.lua
+++ b/runtime/lua/vim/shared.lua
@@ -1,8 +1,10 @@
-- Functions shared by Nvim and its test-suite.
--
--- The singular purpose of this module is to share code with the Nvim
--- test-suite. If, in the future, Nvim itself is used to run the test-suite
--- instead of "vanilla Lua", these functions could move to runtime/lua/vim/_editor.lua
+-- These are "pure" lua functions not depending of the state of the editor.
+-- Thus they should always be available whenever nvim-related lua code is run,
+-- regardless if it is code in the editor itself, or in worker threads/processes,
+-- or the test suite. (Eventually the test suite will be run in a worker process,
+-- so this wouldn't be a separate case to consider)
local vim = vim or {}
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index 9abefbe02a..9f29cae29d 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -342,6 +342,7 @@ add_custom_command(
${LUA_KEYMAP_MODULE_SOURCE} "vim.keymap"
DEPENDS
${CHAR_BLOB_GENERATOR}
+ ${LUA_INIT_PACKAGES_MODULE_SOURCE}
${LUA_EDITOR_MODULE_SOURCE}
${LUA_SHARED_MODULE_SOURCE}
${LUA_INSPECT_MODULE_SOURCE}