A tiny Lua utility module for Neovim to get the project root path, heavily inspired(stolen 😅) from the only and the one Folke.
demo-root-nvim.mp4
Using lazy.nvim:
return {
  "flashios09/root.nvim",
  lazy = true,
}local root = require("root")
print(root.get()) -- `~/.config/nvim/`- With Snacks explorer:
 
vim.keymap.set("n", "<leader>e", function()
  require("snacks").explorer({ cwd = require("root").get() })
end, { desc = "Explorer Snacks (Root dir)" })- With Snacks files picker:
 
vim.keymap.set("n", "<leader><space>", function()
  require("snacks").picker.files({ cwd = require("root").get() })
end, { desc = "Find Files (Root Dir)" })- With NeoTree:
 
vim.keymap.set("n", "<leader>e", function()
  require("neo-tree.command").execute({ toggle = true, require("root").get() })
end, { desc = "Explorer NeoTree (Root Dir)" })- With Telescope:
 
vim.keymap.set("n", "<leader><space>", function()
  require("telescope.builtin").find_files({ cwd = require("root").get() })
end, { desc = "Find Files (Root Dir)" })- With FzfLua:
 
vim.keymap.set("n", "<leader><space>", function()
  require("fzf-lua").files({ cwd = require("root").get() })
end, { desc = "Find Files (Root Dir)" })- With barbecue.nvim(see screenshot):
 
return {
  "flashios09/barbecue.nvim",
  name = "barbecue",
  version = "*",
  dependencies = {
    "SmiteshP/nvim-navic",
    "flashios09/root.nvim",
    "nvim-tree/nvim-web-devicons",
  },
  config = function()
    require("barbecue").setup({
     -- your custom config here
     -- ..
     -- adding the project name to the barbecue lead section
      lead_custom_section = function()
        local project_name = vim.fn.fnamemodify(require("root").get(), ":t")
        local project_section = {
          { "   " .. project_name .. " ", "BarbecueProject" },
          { "", "BarbecueProjectSeparator" },
          { " ", "BarbecueNormal" },
        }
        return project_section
      end,
    })
  end,
}Return the buffer root directory.
Based on:
- lsp workspace folders
 - lsp root_dir
 - root pattern of filename of the current buffer
 - root pattern of cwd
 
root.get() -- `"/Users/flashios09/.config/nvim/"`
root.get({ buffer = 1 }) -- `"/Users/flashios09/.config/nvim/"`Get the git root path if exists.
root.git() -- `"/Users/flashios09/.config/nvim/"`Get the buffer path.
root.bufpath(1) -- `"/Users/flashios09/.config/nvim/"`Normalize the buffer path.
- Replace the 
~with the users home dir. - Normalize the windows path(the directory separator): replace the 
\with/. 
root.norm("~/.config/nvim/") -- `"/Users/flashios09/.config/nvim/"`
root.norm("C:\.config\nvim\") -- `"C:/.config/nvim/"Get all the available root spec(s).
root.detect()
-- output:
{
  {
    paths = { "/Users/flashios09/.config/nvim" },
    spec = "lsp"
  }, {
    paths = { "/Users/flashios09/.config/nvim" },
    spec = { ".git", "lua" }
  }, {
    paths = { "/Users/flashios09/.config/nvim" },
    spec = "cwd"
  }
}