wbthomason / packer.nvim

A use-package inspired plugin manager for Neovim. Uses native packages, supports Luarocks dependencies, written in Lua, allows for expressive config
MIT License
7.72k stars 262 forks source link

Dependency of a plugin with an lazy-load keyword is installed in the `start/` folder #803

Open xulongwu4 opened 2 years ago

xulongwu4 commented 2 years ago

Steps to reproduce

This is the minimum setup for packer.nvim:

require('packer').startup(
    function(use)

        use {'wbthomason/packer.nvim'}
        use {
            "b0o/schemastore.nvim",
            ft = {"json"},
            requires = {"vim-test/vim-test"}
        }
    end
)

Here I set the filetype to load schemastore.nvim to be json, so schemastore.nvim is installed in opt. vim-test is a dependency of an optional plugin, so it should also go to opt/ according to the README (the default value of transitive_opt is true.

Actual behaviour

vim-test is installed in pack/packer/start.

Expected behaviour

vim-test should be installed in pack/packer/opt

Post the contents of packer_compiled.vim here

-- Automatically generated packer.nvim plugin loader code

if vim.api.nvim_call_function('has', {'nvim-0.5'}) ~= 1 then
  vim.api.nvim_command('echohl WarningMsg | echom "Invalid Neovim version for packer.nvim! | echohl None"')
  return
end

vim.api.nvim_command('packadd packer.nvim')

local no_errors, error_msg = pcall(function()

  local time
  local profile_info
  local should_profile = false
  if should_profile then
    local hrtime = vim.loop.hrtime
    profile_info = {}
    time = function(chunk, start)
      if start then
        profile_info[chunk] = hrtime()
      else
        profile_info[chunk] = (hrtime() - profile_info[chunk]) / 1e6
      end
    end
  else
    time = function(chunk, start) end
  end

local function save_profiles(threshold)
  local sorted_times = {}
  for chunk_name, time_taken in pairs(profile_info) do
    sorted_times[#sorted_times + 1] = {chunk_name, time_taken}
  end
  table.sort(sorted_times, function(a, b) return a[2] > b[2] end)
  local results = {}
  for i, elem in ipairs(sorted_times) do
    if not threshold or threshold and elem[2] > threshold then
      results[i] = elem[1] .. ' took ' .. elem[2] .. 'ms'
    end
  end

  _G._packer = _G._packer or {}
  _G._packer.profile_output = results
end

ime([[Luarocks path setup]], true)
local package_path_str = "/home/oulongwu/.cache/nvim/packer_hererocks/2.0.5/share/lua/5.1/?.lua;/home/oulongwu/.cache/nvim/packer_hererocks/2.0.5/share/lua/5. 1/?/init.lua;/home/oulongwu/.cache/nvim/packer_hererocks/2.0.5/lib/luarocks/rocks-5.1/?.lua;/home/oulongwu/.cache/nvim/packer_hererocks/2.0.5/lib/luarocks/    rocks-5.1/?/init.lua"
local install_cpath_pattern = "/home/oulongwu/.cache/nvim/packer_hererocks/2.0.5/lib/lua/5.1/?.so"
if not string.find(package.path, package_path_str, 1, true) then
  package.path = package.path .. ';' .. package_path_str
end

if not string.find(package.cpath, install_cpath_pattern, 1, true) then
  package.cpath = package.cpath .. ';' .. install_cpath_pattern
end

time([[Luarocks path setup]], false)
time([[try_loadstring definition]], true)
local function try_loadstring(s, component, name)
  local success, result = pcall(loadstring(s), name, _G.packer_plugins[name])
  if not success then
    vim.schedule(function()
      vim.api.nvim_notify('packer.nvim: Error running ' .. component .. ' for ' .. name .. ': ' .. result, vim.log.levels.ERROR, {})
    end)
  end
  return result
end

time([[try_loadstring definition]], false)
time([[Defining packer_plugins]], true)
_G.packer_plugins = {
  ["packer.nvim"] = {
    loaded = true,
    path = "/home/oulongwu/.local/share/nvim/site/pack/packer/start/packer.nvim",
    url = "https://github.com/wbthomason/packer.nvim"
  },
  ["schemastore.nvim"] = {
    loaded = false,
    needs_bufread = false,
    only_cond = false,
    path = "/home/oulongwu/.local/share/nvim/site/pack/packer/opt/schemastore.nvim",
    url = "https://github.com/b0o/schemastore.nvim"
  },
  ["vim-test"] = {
    loaded = true,
    path = "/home/oulongwu/.local/share/nvim/site/pack/packer/start/vim-test",
    url = "https://github.com/vim-test/vim-test"
  }
}

time([[Defining packer_plugins]], false)
vim.cmd [[augroup packer_load_aucmds]]
vim.cmd [[au!]]
  -- Filetype lazy-loads
time([[Defining lazy-load filetype autocommands]], true)
vim.cmd [[au FileType json ++once lua require("packer.load")({'schemastore.nvim'}, { ft = "json" }, _G.packer_plugins)]]
time([[Defining lazy-load filetype autocommands]], false)
vim.cmd("augroup END")
if should_profile then save_profiles() end

end)

if not no_errors then
  vim.api.nvim_command('echohl ErrorMsg | echom "Error in packer_compiled: '..error_msg..'" | echom "Please check your config for correctness" | echohl None')
end
Bekaboo commented 2 years ago

Can confirm this bug

wbthomason commented 2 years ago

Thanks for your report! I think this is a README bug - requires does not currently affect load order, just ensures that dependencies get installed. transitive_opt applies if you manually mark a plugin opt, but I forget why we didn't make this apply to all opt plugins...

wbthomason commented 2 years ago

I changed the behavior from all opt to just manual here: https://github.com/wbthomason/packer.nvim/commit/a542f34fa050ab56515cbb513393cd03d961bb85

We can investigate reverting that change and fixing the bugs it may cause, or I can fix the docs.

Bekaboo commented 2 years ago

Thanks for your report! I think this is a README bug - requires does not currently affect load order, just ensures that dependencies get installed. transitive_opt applies if you manually mark a plugin opt, but I forget why we didn't make this apply to all opt plugins...

Thanks for your explanation! It will be helpful if you can include the condition where transitive_opt is applied in README.

tbsmark86 commented 1 year ago

May or may not fit here: I have the kind of opposite problem - likely caused by this transitivie_opt option.

  require('packer').startup({function(use)
    use 'wbthomason/packer.nvim'
    use { 'nvim-telescope/telescope.nvim', opt = true, cmd = 'Telescope',  requires = { 'nvim-lua/plenary.nvim' } }
    use { 'lewis6991/gitsigns.nvim', requires = { 'nvim-lua/plenary.nvim' } }
end})

Here plenary is inside opt/ but should be inside start/. However - when reversing the order of use statements it works as expected.