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.82k stars 266 forks source link

Config gets executed when the plugin is not loaded #970

Closed gepbird closed 2 years ago

gepbird commented 2 years ago

Steps to reproduce

  1. Install a plugin, for example nerdcommenter

    require('packer').startup(function()
    use 'preservim/nerdcommenter'
    end)

    save, restart nvim then :PackerSync

  2. Add another plugin before the first plugin with a config that requires itself, for example nvim-cmp

    require('packer').startup(function()
    use {
    'hrsh7th/nvim-cmp',
    config = require 'cmp'
    }
    use 'preservim/nerdcommenter'
    end)

    save, restart nvim then :PackerSync

Actual behaviour

  1. nerdcommenter gets installed which is good
  2. packer tries to uninstall nerdcommenter, because require 'cmd' failed, because nvim-cmp was not loaded, it doesn't install nvim-cmp

Expected behaviour

  1. nerdcommenter should be installed
  2. nvim-cmp should be installed, but the config should not be ran yet, since its not loaded. Config should only run on the next start of nvim

packer files

Plugin specification file(s) require('packer').startup(function() use { 'hrsh7th/nvim-cmp', config = require 'cmp' } use 'preservim/nerdcommenter' end)
packer log file [ERROR 2022. júl. 14., csütörtök, 10:46:26 CEST 2.1060456830603e+14] ...e/nvim/site/pack/packer/start/packer.nvim/lua/packer.lua:982: Failure running setup function: "/home/gep/.config/nvim/init.lua:4: module 'cmp' not found:\n\tno field package.preload['cmp']\n\tno file './cmp.lua'\n\tno file '/usr/share/luajit-2.1.0-beta3/cmp.lua'\n\tno file '/usr/local/share/lua/5.1/cmp.lua'\n\tno file '/usr/local/share/lua/5.1/cmp/init.lua'\n\tno file '/usr/share/lua/5.1/cmp.lua'\n\tno file '/usr/share/lua/5.1/cmp/init.lua'\n\tno file './cmp.so'\n\tno file '/usr/local/lib/lua/5.1/cmp.so'\n\tno file '/usr/lib/lua/5.1/cmp.so'\n\tno file '/usr/local/lib/lua/5.1/loadall.so'" [ERROR 2022. júl. 14., csütörtök, 10:46:32 CEST 2.1061063568062e+14] .../site/pack/packer/start/packer.nvim/lua/packer/async.lua:20: Error in coroutine: ...e/nvim/site/pack/packer/start/packer.nvim/lua/packer.lua:582: attempt to index local 'display_win' (a nil value)
packer compiled file -- 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 time([[Luarocks path setup]], true) local package_path_str = "/home/gep/.cache/nvim/packer_hererocks/2.1.0-beta3/share/lua/5.1/?.lua;/home/gep/.cache/nvim/packer_hererocks/2.1.0-beta3/share/lua/5.1/?/init.lua;/home/gep/.cache/nvim/packer_hererocks/2.1.0-beta3/lib/luarocks/rocks-5.1/?.lua;/home/gep/.cache/nvim/packer_hererocks/2.1.0-beta3/lib/luarocks/rocks-5.1/?/init.lua" local install_cpath_pattern = "/home/gep/.cache/nvim/packer_hererocks/2.1.0-beta3/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 = { nerdcommenter = { loaded = true, path = "/home/gep/.local/share/nvim/site/pack/packer/start/nerdcommenter", url = "https://github.com/preservim/nerdcommenter" } } time([[Defining packer_plugins]], false) if should_profile then save_profiles() end end) if not no_errors then error_msg = error_msg:gsub('"', '\\"') vim.api.nvim_command('echohl ErrorMsg | echom "Error in packer_compiled: '..error_msg..'" | echom "Please check your config for correctness" | echohl None') end
examosa commented 2 years ago

Hey @gutyina70. I think you need to wrap your config argument in a function or a string. The way it's currently written, require 'cmp' is being called inside use, not when the plugin is loaded. Try something like this:

require('packer').startup(function()
  use {
    'hrsh7th/nvim-cmp',
    config = function()
      require 'cmp'
    end
  }
  use 'preservim/nerdcommenter'
end)

Alternatively:

require('packer').startup(function()
  use {
    'hrsh7th/nvim-cmp',
    config = [[require 'cmp']]
  }
  use 'preservim/nerdcommenter'
end)
gepbird commented 2 years ago

@Teomik129 by putting it in a function or a string as you've shown, packer won't execute the config.

gepbird commented 2 years ago

Never mind, it works, thank you! I was getting an error after :PackerSync, so it skipped the config part.