如何在不重新启动neovim的情况下获取init.lua源代码?

12

有没有一种简洁的方法可以重新加载neovim init.lua配置及其所有模块(使用require()函数),而无需重新启动neovim?

我在另一篇帖子上读到,:luafile $MYVIMRC应该可以实现这一点,但不幸的是它不能重新加载那些缓存文件。我希望设置一个类似于以前的init.vim配置中的快捷键。类似于:

local opts = { noremap = true, silent = true }

vim.api.nvim_set_keymap("n", "<leader><CR>", ":luafile $MYVIMRC<CR>", opts)

我使用的是nvim版本0.8.0。
6个回答

15

尝试运行此命令:

:luafile %

4
谢谢你的参与。但是,% 不是针对活动缓冲区的吗?我正在尝试为我的 init.lua 文件(包括模块)分配一个按键映射,以便从任何位置获取源代码。 - mduboule

6

我在 这个 Reddit 帖子 上发现了一份来自于 creativenull 的回答,看起来非常有效。最终,我创建了一个名为 reload.lua 的小模块:

function _G.ReloadConfig()
  for name,_ in pairs(package.loaded) do
    if name:match('^user') and not name:match('nvim-tree') then
      package.loaded[name] = nil
    end
  end

  dofile(vim.env.MYVIMRC)
  vim.notify("Nvim configuration reloaded!", vim.log.levels.INFO)
end

这将被导入到 init.lua 中:

require 'user.reload'

我还添加了一个按键映射:

vim.api.nvim_set_keymap("n", "<leader><CR>", "<cmd>lua ReloadConfig()<CR>", { noremap = true, silent = false })

注意1:在上面的示例中,您的lua文件需要包含在一个用户文件夹中:〜/ .config / nvim / lua / user / 。这也是reload.lua所在的位置。
注意2:我认为可以使用not name: match('exclude-me')正则表达式语法来排除有问题的模块。

4
你可以使用:luafile <filename>来实现此功能。 有关更多信息,请参见:h:luafile

我面临的问题是,如果使用require()导入模块,则这些模块将被缓存,而仅执行:luafile命令并不会重新加载这些模块。我会更新我的帖子以澄清这一点。 - mduboule

1

这里有另一种解决方案,它还包括重新加载after/目录中的文件:

我的~/.config/nvim文件夹树:

.
├── after
│  ├── ftplugin
│  └── plugin
│     ├── telescope.lua
│     └── treesitter.lua
├── init.lua
├── lua
│  └── user
│     ├── init.lua
│     ├── maps.lua
│     ├── options.lua
│     └── plugins.lua
└── plugin
   └── packer_compiled.lua

我的~/.config/nvim.init.lua文件:

require('user')


--- Reload the entire configuration
function reload_config()
    for name,_ in pairs(package.loaded) do
        if name:match('^user') then
            package.loaded[name] = nil
        end
    end

    require('user')

    -- Reload after/ directory
    local glob = vim.fn.stdpath('config') .. '/after/**/*.lua'
    local after_lua_filepaths = vim.fn.glob(glob, true, true)

    for _, filepath in ipairs(after_lua_filepaths) do
        dofile(filepath)
    end

    vim.notify("Nvim configuration reloaded!", vim.log.levels.INFO)
end
vim.keymap.set('n', '<leader><leader><leader>x', reload_config)

0

我还不确定。我正在使用映射 :w | 所以 % 来源于当前文件 源文件键位映射

--更新-- 这仅适用于配置文件

像这样希望能有所帮助


3
目前您的回答不太清楚。请编辑并添加更多细节,帮助他人理解如何解决提出的问题。您可以在帮助中心找到有关如何编写好答案的更多信息。 - Community
当我有一个键映射时,这个答案对我没有用,注释掉并输入 :w | so %<cr>。这似乎适用于修改或添加其他键映射行,但不适用于删除它们或将其注释掉。 - Ryan Hart

0

这个解决方案在我的Neovim v0.7.2上有效。

-- Add modules here
local modules = {
  "user.options",
  "user.keymaps",
}

-- Refresh module cache
for k, v in pairs(modules) do
  package.loaded[v] = nil
  require(v)
end

然后,您可以配置您的键位映射来刷新 $MYVIMRC,方法如下:

vim.api.nvim_set_keymap("n", "<leader><CR>", ":luafile $MYVIMRC<CR>", opts)

告诉我,如果我错了,这不会清除缓存,对吗? - mduboule
@mduboule,你似乎是对的。我刚在我的init.lua中测试了一下,当我注释掉我的按键映射行时,例如然后:source %,我的更改仍然不会生效,但如果我更改按键实际执行的操作,并且:source %,那么我的更改就会生效。 - Ryan Hart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接