aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lua/cmake/actions.lua11
-rw-r--r--lua/cmake/autocmds.lua25
-rw-r--r--lua/cmake/init.lua11
-rw-r--r--lua/cmake/project.lua30
4 files changed, 64 insertions, 13 deletions
diff --git a/lua/cmake/actions.lua b/lua/cmake/actions.lua
index 4008f7c..8c5a300 100644
--- a/lua/cmake/actions.lua
+++ b/lua/cmake/actions.lua
@@ -27,8 +27,17 @@ local default_build_exe_opts = {
},
}
+M.reset_project = function(opts)
+ require("cmake.project").setup(opts)
+end
+
M.generate = function(opts)
- pr.create_fileapi_query({ idx = pr.current_generate_option_idx() }, function()
+ local idx = pr.current_generate_option_idx()
+ if not idx then
+ vim.notify("CMake: no project to generate")
+ return
+ end
+ pr.create_fileapi_query({ idx = idx }, function()
vim.schedule(function()
t.cmake_execute(pr.current_generate_option().generate_command, default_generate_exe_opts)
end)
diff --git a/lua/cmake/autocmds.lua b/lua/cmake/autocmds.lua
index f430cf1..4b5b479 100644
--- a/lua/cmake/autocmds.lua
+++ b/lua/cmake/autocmds.lua
@@ -4,16 +4,20 @@ local constants = require("cmake.constants")
local autocmds = {}
-function autocmds.setup()
- local cmake_nvim_augroup = vim.api.nvim_create_augroup("CMake", {})
+local cmake_nvim_augroup = vim.api.nvim_create_augroup("CMake", {})
+
+function autocmds.set_on_variants()
vim.api.nvim_create_autocmd({ "BufWritePost" }, {
group = cmake_nvim_augroup,
pattern = constants.variants_yaml_filename,
callback = function(args)
- require("cmake.project").setup()
+ actions.reset_project()
end,
desc = "Setup project after saving variants",
})
+end
+
+function autocmds.setup()
if config.generate_after_save then
vim.api.nvim_create_autocmd({ "BufWritePost" }, {
group = cmake_nvim_augroup,
@@ -24,6 +28,21 @@ function autocmds.setup()
desc = "Generate project after saving CMakeLists.txt",
})
end
+ --NOTE: this autocmd was written only to handle very rarely case when inside directory
+ --without CMakeLists.txt neovim starts like `nvim CMakeLists.txt`. In this case initial
+ --setup will not make the affect and to correctry process the file save, we need to create
+ --this autocommand so it reinitializes the project if it has not been done before. IMHO this
+ --is not the best way to do this
+ if config.generate_after_save then
+ vim.api.nvim_create_autocmd({ "BufEnter" }, {
+ group = cmake_nvim_augroup,
+ pattern = constants.cmakelists,
+ callback = function(args)
+ actions.reset_project({ first_time_only = true })
+ end,
+ desc = "Set up project on open CMakeLists.txt if not set before",
+ })
+ end
end
return autocmds
diff --git a/lua/cmake/init.lua b/lua/cmake/init.lua
index febf307..adfa84e 100644
--- a/lua/cmake/init.lua
+++ b/lua/cmake/init.lua
@@ -12,15 +12,14 @@ function M.setup(opts)
opts = opts or {}
config.setup(opts)
if vim.fn.executable(config.cmake.cmake_path) then
+ autocmds.setup()
utils.file_exists(vim.fs.joinpath(uv.cwd(), constants.cmakelists), function(cmake_lists_exists)
if cmake_lists_exists then
- require("cmake.capabilities").setup(function()
- vim.schedule(function()
- autocmds.setup()
- commands.register_commands()
- end)
- require("cmake.project").setup()
+ vim.schedule(function()
+ autocmds.set_on_variants()
+ commands.register_commands()
end)
+ require("cmake.project").setup({ first_time_only = true })
else
end
end)
diff --git a/lua/cmake/project.lua b/lua/cmake/project.lua
index 3b7ed04..6f5a21e 100644
--- a/lua/cmake/project.lua
+++ b/lua/cmake/project.lua
@@ -7,6 +7,8 @@ local uv = vim.uv or vim.loop
local Project = {}
+local initialised = false
+
local configs = {}
local current_config = nil
local fileapis = {}
@@ -15,6 +17,7 @@ local reset_internals = function()
configs = {}
current_config = nil
fileapis = {}
+ initialised = true
end
local append_after_success_actions = function()
@@ -188,9 +191,7 @@ function Project.create_fileapi_query(opts, callback)
end)
end
-function Project.setup(opts)
- opts = opts or {}
- reset_internals()
+local do_setup = function(opts)
local variants_path = vim.fs.joinpath(uv.cwd(), constants.variants_yaml_filename)
utils.file_exists(variants_path, function(variants_exists)
if variants_exists then
@@ -204,4 +205,27 @@ function Project.setup(opts)
end)
end
+function Project.setup(opts)
+ opts = opts or {}
+ vim.notify(
+ "Start setup. " .. vim.inspect(opts.first_time_only) .. " " .. tostring(initialised),
+ vim.log.levels.INFO
+ )
+ if opts.first_time_only and initialised then
+ vim.notify(
+ "Setup abort. " .. vim.inspect(opts.first_time_only) .. " " .. tostring(initialised),
+ vim.log.levels.INFO
+ )
+ return
+ end
+ reset_internals()
+ if not initialised then
+ require("cmake.capabilities").setup(function()
+ do_setup(opts)
+ end)
+ else
+ do_setup(opts)
+ end
+end
+
return Project