 https://www.youtube.com/watch?v=TNRFegMqbWA
https://www.youtube.com/watch?v=TNRFegMqbWA
Backup old nvim config.
mv ~/.config/nvim ~/.config/nvim-oldOr remove old nvim config.
rm -rf ~/.config/nvimRemove local/state and local/share
rm -rf ~/.local/state/nvim
rm -rf ~/.local/share/nvimInstall required packages.
sudo pacman -S --needed neovim unzip luarocks xclip wl-clipboardInstall NvChad config from https://nvchad.com/docs/quickstart/install
git clone https://github.com/NvChad/starter ~/.config/nvim && nvimOr this already configured version
git clone https://github.com/ProgrammingRainbow/NvChad-2.5 ~/.config/nvim && nvimYou can safely remove the .git and image files.
rm -rf ~/.config/nvim/.git
rm ~/.config/nvim/*.pngEdit the file ~/.config/nvim/lua/options.lua to change tabs from 2 to 4 spaces. 
Original config is here https://github.com/NvChad/NvChad/blob/v2.5/lua/nvchad/options.lua
-- local o = vim.oTo this.
local o = vim.o
-- Indenting
o.shiftwidth = 4
o.tabstop = 4
o.softtabstop = 4
Edit ~/.config/nvim/.stylua.toml to change indent width to 4 and to use parentheses.
column_width = 120
line_endings = "Unix"
indent_type = "Spaces"
indent_width = 4
quote_style = "AutoPreferDouble"
# call_parentheses = "None"Edit ~/.config/nvim/lua/plugins/init.lua to load module on save.
    {
        "stevearc/conform.nvim",
        event = "BufWritePre",
        config = function()
            require("configs.conform")
        end,
    },Edit ~/.config/nvim/lua/configs/conform.lua to enable format_on_save.
local options = {
    formatters_by_ft = {
        lua = { "stylua" },
    },
    format_on_save = {
        -- These options will be passed to conform.format()
        timeout_ms = 500,
        lsp_fallback = true,
    },
}
require("conform").setup(options)https://github.com/nvim-treesitter/nvim-treesitter 
Added to the Top of ~/.config/nvim/lua/plugins/init.lua.
    {
        "nvim-treesitter/nvim-treesitter",
        event = { "BufReadPre", "BufNewFile" },
        config = function()
            require("configs.treesitter")
        end,
    },Create file ~/.config/nvim/lua/configs/treesitter.lua. 
Copy from the internal one.
https://github.com/NvChad/NvChad/blob/v2.5/lua/nvchad/configs/treesitter.lua
local options = {
    ensure_installed = {
        "bash",
        "fish",
        "lua",
        "luadoc",
        "markdown",
        "printf",
        "toml",
        "vim",
        "vimdoc",
        "yaml",
    },
    highlight = {
        enable = true,
        use_languagetree = true,
    },
    indent = { enable = true },
}
require("nvim-treesitter.configs").setup(options)List Treesitter installed languages.
:TSInstallInfoInstall fish for treesitter.
:TSInstall fishUpdate fish.
:TSUpdate fishUpdate all.
:TSUpdateDisable treesitter highlighting.
:TSDisable highlightEnable treesitter highlighting.
:TSEnable highlightCheck loaded treesitter language.
:lua print(require"nvim-treesitter.parsers".get_buf_lang())or
:InspectCheck filetype of buffer.
:echo &filetypeor
:set filetype?Set filetype.
:set filetype=fishhttps://github.com/neovim/nvim-lspconfig 
Edit file ~/.config/nvim/lua/plugins/init.lua. 
Under Treesitter add an lspconfig entry.
    {
        "neovim/nvim-lspconfig",
        event = { "BufReadPre", "BufNewFile" },
        config = function()
            require("nvchad.configs.lspconfig").defaults()
            require("configs.lspconfig")
        end,
    },Edit file ~/.config/nvim/lua/configs/lspconfig.lua. 
We will be adding a table that has a list of all servers configured. 
This will be used later in the mason-lspconfig to automate there installation. 
Then we will have a simple default_servers table for looping and setting up default configs. 
Using the NvChad default lua_ls found 
here https://github.com/NvChad/NvChad/blob/v2.5/lua/nvchad/configs/lspconfig.lua 
we will add love2d support "${3rd}/love2d/library", but also disable linting diagnostics.
local on_attach = require("nvchad.configs.lspconfig").on_attach
local on_init = require("nvchad.configs.lspconfig").on_init
local capabilities = require("nvchad.configs.lspconfig").capabilities
-- local lspconfig = require("lspconfig") -- pre nvim 0.11
local lspconfig = require("nvchad.configs.lspconfig") -- nvim 0.11
-- list of all servers configured.
lspconfig.servers = {
    "lua_ls",
}
-- list of servers configured with default config.
local default_servers = {}
-- lsps with default config
for _, lsp in ipairs(default_servers) do
    -- lspconfig[lsp].setup({ -- pre nvim 0.11
    vim.lsp.config(lsp, { -- nvim 0.11
        on_attach = on_attach,
        on_init = on_init,
        capabilities = capabilities,
    })
end
-- lspconfig.lua_ls.setup({ -- pre nvim 0.11
vim.lsp.config("lua_ls", { -- nvim 0.11
    on_attach = on_attach,
    on_init = on_init,
    capabilities = capabilities,
    settings = {
        Lua = {
            diagnostics = {
                enable = false, -- Disable all diagnostics from lua_ls
                -- globals = { "vim" },
            },
            workspace = {
                library = {
                    vim.fn.expand("$VIMRUNTIME/lua"),
                    vim.fn.expand("$VIMRUNTIME/lua/vim/lsp"),
                    vim.fn.stdpath("data") .. "/lazy/ui/nvchad_types",
                    vim.fn.stdpath("data") .. "/lazy/lazy.nvim/lua/lazy",
                    "${3rd}/love2d/library",
                },
                maxPreload = 100000,
                preloadFileSize = 10000,
            },
        },
    },
})https://github.com/mfussenegger/nvim-lint 
Edit file ~/.config/nvim/lua/plugins/init.lua. 
Between LSPConfig and Confom add an entry for Linting.
    {
        "mfussenegger/nvim-lint",
        event = { "BufReadPre", "BufNewFile" },
        config = function()
            require("configs.lint")
        end,
    },Create file ~/.config/nvim/lua/configs/lint.lua. 
lint.linters_by_ft is a key, value table for all linters to be configured. 
lint.linters.laucheck.args = { Will over write the arguments table for luacheck. 
To get the default args before editing use this command 
:lua print(vim.inspect(require('lint').linters.luacheck.args)). 
or unpack the original args into the table and add your new args below it.
Create an auto command to run the linter when opeing a buffer, saving or leaving insert mode.
local lint = require("lint")
lint.linters_by_ft = {
    lua = { "luacheck" },
}
lint.linters.luacheck.args = {
    unpack(lint.linters.luacheck.args),
    "--globals",
    "love",
    "vim",
}
vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave" }, {
    callback = function()
        lint.try_lint()
    end,
})https://github.com/zapling/mason-conform.nvim 
Edit the file ~/.config/nvim/lua/plugins/init.lua. 
Below the conform entry add mason-conform.
    {
        "zapling/mason-conform.nvim",
        event = "VeryLazy",
        dependencies = { "conform.nvim" },
        config = function()
            require("configs.mason-conform")
        end,
    },Create the file ~/.config/nvim/lua/configs/mason-conform.lua. 
Any formatters you don't wish to auto install add to ignore_install table.
require("mason-conform").setup({
    -- List of formatters to ignore during install
    ignore_install = {},
})https://github.com/williamboman/mason-lspconfig.nvim 
Edit the file ~/.config/nvim/lua/plugins/init.lua. 
Below the lspconfig entry add mason-lspconfig.
    {
        "williamboman/mason-lspconfig.nvim",
        event = "VeryLazy",
        dependencies = { "nvim-lspconfig" },
        config = function()
            require("configs.mason-lspconfig")
        end,
    },Create the file ~/.config/nvim/lua/configs/mason-lspconfig.lua. 
This entire file is simply creating a table of servers to pass into ensure_installed. 
There is also a table at the top to add any server that should not be installed.
-- local lspconfig = package.loaded["lspconfig"] -- pre nvim 0.11
local lspconfig = require("nvchad.configs.lspconfig") -- nvim 0.11
-- List of servers to ignore during install
local ignore_install = {}
-- Helper function to find if value is in table.
local function table_contains(table, value)
    for _, v in ipairs(table) do
        if v == value then
            return true
        end
    end
    return false
end
-- Build a list of lsp servers to install minus the ignored list.
local all_servers = {}
for _, s in ipairs(lspconfig.servers) do
    if not table_contains(ignore_install, s) then
        table.insert(all_servers, s)
    end
end
require("mason-lspconfig").setup({
    ensure_installed = all_servers,
    automatic_installation = false,
})https://github.com/rshkarin/mason-nvim-lint 
Edit the file ~/.config/nvim/lua/plugins/init.lua. 
Below the lint entry add mason-lint.
    {
        "rshkarin/mason-nvim-lint",
        event = "VeryLazy",
        dependencies = { "nvim-lint" },
        config = function()
            require("configs.mason-lint")
        end,
    },Create the file ~/.config/nvim/lua/configs/mason-lint.lua. 
This entire file is simply creating a table of linters to pass into ensure_installed. 
There is also a table at the top to add any linter that should not be installed.
local lint = package.loaded["lint"]
-- List of linters to ignore during install
local ignore_install = {}
-- Helper function to find if value is in table.
local function table_contains(table, value)
    for _, v in ipairs(table) do
        if v == value then
            return true
        end
    end
    return false
end
-- Build a list of linters to install minus the ignored list.
local all_linters = {}
for _, v in pairs(lint.linters_by_ft) do
    for _, linter in ipairs(v) do
        if not table_contains(ignore_install, linter) then
            table.insert(all_linters, linter)
        end
    end
end
require("mason-nvim-lint").setup({
    ensure_installed = all_linters,
    automatic_installation = false,
}) https://www.youtube.com/watch?v=upeAH74q0q4
https://www.youtube.com/watch?v=upeAH74q0q4
I have changed the hack that was in place for clang_format since the video. 
Change file ~/.config/nvim/lua/configs/conform.lua.
        c_cpp = { "clang-format" }, -- Hack to force download.
        c = { "clang_format" },
        cpp = { "clang_format" },and
        clang_format = {The a simpler way.
        c = { "clang-format" },
        cpp = { "clang-format" },and
        ["clang-format"] = {In ~/.config/nvim/lua/configs/lspconfig.lua. The on_attach function takes client and bufnr parameters. It has almost no documentations and i have no idea if leaving it off affects anything. But it appears it should be provided.
    on_attach = function(client, bufnr)
        client.server_capabilities.documentFormattingProvider = false
        client.server_capabilities.documentRangeFormattingProvider = false
        on_attach(client, bufnr)Edit file ~/.config/nvim/lua/configs/lspconfig.lua. 
Add "clangd", to lspconfig.servers.
lspconfig.servers = {
    "lua_ls",
    "clangd",
}Add a setup for clangd. This disables formatting.
-- lspconfig.clangd.setup({ -- pre nvim 0.11
vim.lsp.config("clangd", { -- nvim 0.11
    on_attach = function(client, bufnr)
        client.server_capabilities.documentFormattingProvider = false
        client.server_capabilities.documentRangeFormattingProvider = false
        on_attach(client, bufnr)
    end,
    on_init = on_init,
    capabilities = capabilities,
})Edit file ~/.config/nvim/lua/configs/conform.lua. 
Add a C and C++ entry to formatters_by_ft.
        c = { "clang-format" },
        cpp = { "clang-format" },Between formatters_by_ft and format_on_save tables add. This sets tab spacing to 4. The default is 2.
    formatters = {
        ["clang-format"] = {
            prepend_args = {
                "-style={ \
                IndentWidth: 4, \
                TabWidth: 4, \
                UseTab: Never, \
                AccessModifierOffset: 0, \
                IndentAccessModifiers: true, \
                PackConstructorInitializers: Never}",
            },
        },
    },Edit file ~/.config/nvim/lua/configs/treesitter.lua. 
Add syntax highlighting for c, c++, make and cmake.
        "c",
        "cmake",
        "cpp",
        "make", https://www.youtube.com/watch?v=1vK3VCfKEyQ
https://www.youtube.com/watch?v=1vK3VCfKEyQ
Go needs to be installed in order for Mason to install the go packages.
On Archlinux BTW sudo pacman -S --needed go
I think all the formatters for Go only apply to actual .go files. So all non Go filetypes have been removed from conform.lua.
In treesitter.lua gotmpl has been added.
Edit file ~/.config/nvim/lua/configs/lspconfig.lua. 
Add "gopls", to lspconfig.servers.
lspconfig.servers = {
    "lua_ls",
    "gopls",
}Add a setup for gopls. This disables formatting and adds some linting options.
-- lspconfig.gopls.setup({ -- pre nvim 0.11
vim.lsp.config("gopls", { -- nvim 0.11
    on_attach = function(client, bufnr)
        client.server_capabilities.documentFormattingProvider = false
        client.server_capabilities.documentRangeFormattingProvider = false
        on_attach(client, bufnr)
    end,
    on_init = on_init,
    capabilities = capabilities,
    cmd = { "gopls" },
    filetypes = { "go", "gomod", "gotmpl", "gowork" },
    -- root_dir = lspconfig.util.root_pattern("go.work", "go.mod", ".git"), -- pre nvim 0.11
    root_dir = require("lspconfig.util").root_pattern("go.work", "go.mod", ".git"), -- nvim 0.11
    settings = {
        gopls = {
            analyses = {
                unusedparams = true,
            },
            completeUnimported = true,
            usePlaceholders = true,
            staticcheck = true,
        },
    },
})Edit file ~/.config/nvim/lua/configs/conform.lua. 
Add Golang entry to formatters_by_ft.
        go = { "gofumpt", "goimports-reviser", "golines" },Between formatters_by_ft and format_on_save add entries to table formatters.
    formatters = {
        ["goimports-reviser"] = {
            prepend_args = { "-rm-unused" },
        },
        golines = {
            prepend_args = { "--max-len=80" },
        },
    },Edit file ~/.config/nvim/lua/configs/treesitter.lua. 
Add syntax highlighting for Go related filetypes.
        "go",
        "gomod",
        "gosum",
        "gotmpl",
        "gowork", https://www.youtube.com/watch?v=4o6D1W0iW10
https://www.youtube.com/watch?v=4o6D1W0iW10
Npm needs to be installed in order for Mason to install Pyright.
On Archlinux BTW sudo pacman -S --needed npm
Edit file ~/.config/nvim/lua/configs/lspconfig.lua. 
Add "pyright", to lspconfig.servers.
    "pyright",Add "pyright" to default_servers.
    "pyright",Edit file ~/.config/nvim/lua/configs/conform.lua. 
Add python entries to formatters_by_ft for isort and black.
        python = { "isort", "black" },Between formatters_by_ft and format_on_save add entries to table formatters. 
Try to speed up black and to to make isort play better wtih black.
    formatters = {
        -- Python
        black = {
            prepend_args = {
                "--fast",
                "--line-length",
                "80",
            },
        },
        isort = {
            prepend_args = {
                "--profile",
                "black",
            },
        },
    },Edit file ~/.config/nvim/lua/configs/lint.lua. 
Add a python flake8 entry to linters_by_ft table.
    python = { "flake8" },Edit file ~/.config/nvim/lua/configs/treesitter.lua. 
Add syntax highlighting for Python.
        "python", https://www.youtube.com/watch?v=m0OobzFjEKE
https://www.youtube.com/watch?v=m0OobzFjEKE
Npm needs to be installed in order for Mason to install Pyright.
On Archlinux BTW sudo pacman -S --needed npm
Edit file ~/.config/nvim/lua/configs/lspconfig.lua. 
Add "pyright", to lspconfig.servers.
    "pyright",Choose default or choose to disable type checks for pyright. 
(Choice 1) For default add "pyright" to default_servers.
    "pyright",(Choice 2) Or to prevent duplicate linting from pyright and mypy add the following. This will not stop pyright unused variable hits. I was unable to turn this off.
-- lspconfig.pyright.setup({ -- pre nvim 0.11
vim.lsp.config("pyright", { -- nvim 0.11
    on_attach = on_attach,
    on_init = on_init,
    capabilities = capabilities,
    settings = {
        python = {
            analysis = {
                typeCheckingMode = "off", -- Disable type checking diagnostics
            },
        },
    },
})Edit file ~/.config/nvim/lua/configs/conform.lua. 
Add a python entry to formatters_by_ft for isort and black.
        python = { "black" },(Optional) Between formatters_by_ft and format_on_save add entries to table formatters. 
Try to speed up black and to to make isort play better wtih black.
    formatters = {
        -- Python
        black = {
            prepend_args = {
                "--fast",
                "--line-length",
                "80",
            },
        },
    },Edit file ~/.config/nvim/lua/configs/lint.lua. 
Add a python mypy and ruff entries to linters_by_ft table.
    python = { "mypy", "ruff" },Edit file ~/.config/nvim/lua/configs/treesitter.lua. 
Add syntax highlighting for Python.
        "python",Edit file ~/.config/nvim/lua/plugins/init.lua. 
We will add the entry for nvim-dap and also load it's config from configs/dap.lua
    {
        "mfussenegger/nvim-dap",
        config = function()
            require("configs.dap")
        end,
    },Create ~/.config/nvim/lua/configs/dap.lua. 
We are adding a leader + d + b key mapping to set a breakpoint. This key mapping is only set when dap is loaded that's why it's not in mappings.lua
local map = vim.keymap.set
map(
    "n",
    "<leader>db",
    "<cmd> DapToggleBreakpoint <CR>",
    { desc = "Toggle DAP Breakpoint" }
)
map(
    "n",
    "<leader>dr",
    "<cmd> DapContinue <CR>",
    { desc = "Start or continue DAP" }
)Edit file ~/.config/nvim/lua/plugins/init.lua. 
we need an entry for both nvim-nio and nvim-dap-ui. Dap UI depends on both nvim-dap and nvim-nio. We will load it's configuration from configs/dap-ui.lua
    {
        "nvim-neotest/nvim-nio",
    },
    {
        "rcarriga/nvim-dap-ui",
        dependencies = {
            "mfussenegger/nvim-dap",
            "nvim-neotest/nvim-nio",
        },
        config = function()
            require("configs.dap-ui")
        end,
    },Create ~/.config/nvim/lua/configs/dap-ui.lua.
local dap = require("dap")
local dapui = require("dapui")
dapui.setup()
local map = vim.keymap.set
map(
    "n",
    "<leader>du",
    "<cmd>lua require('dapui').toggle()<CR>",
    { desc = "Toggle DAP UI" }
)
dap.listeners.after.attach.dapui_config = function()
    dapui.open()
end
dap.listeners.after.launch.dapui_config = function()
    dapui.open()
end
dap.listeners.before.event_terminated.dapui_config = function()
    dapui.close()
end
dap.listeners.before.event_exited.dapui_config = function()
    dapui.close()
endEdit file ~/.config/nvim/lua/plugins/init.lua. 
We will have this load when python files are loaded. We will load it's configurations from configs/dap-python.lua.
    {
        "mfussenegger/nvim-dap-python",
        ft = "python",
        dependencies = {
            "mfussenegger/nvim-dap",
            "rcarriga/nvim-dap-ui",
        },
        config = function()
            require("configs.dap-python")
        end,
    },Create ~/.config/nvim/lua/configs/dap-python.lua. 
We are setting the path to debugpy and passing that to the dap-python setup. We are also setting up key mappings that will only be loaded when nvim-dap-python is loaded.
local path = "~/.local/share/nvim/mason/packages/debugpy/venv/bin/python"
require("dap-python").setup(path)
local map = vim.keymap.set
map("n", "<leader>dpr", function()
    require("dap-python").test_method()
end, { desc = "Run DAP Python test method" })Edit file ~/.config/nvim/lua/plugins/init.lua. 
We will used mason-nvim-dap to automagicly install debugpy. We will set it's loading to verylazy so it doesn't slowdown nvim startup time. It will also load its config from configs/mason-dap.lua
    {
        "jay-babu/mason-nvim-dap.nvim",
        event = "VeryLazy",
        config = function()
            require("configs.mason-dap")
        end,
    },Create ~/.config/nvim/lua/configs/mason-dap.lua. 
This mason-nvim-dap like other similar packages doesn't actually load it's packages on demand so we will just put the package into the ensured installed. Debugpy is actually refered to as python. Any package that is being installed automatically that you don't want to, can be added into the exclude table.
require("mason-nvim-dap").setup({
    ensure_installed = { "python" },
    automatic_installation = { exclude = {} },
}) https://www.youtube.com/watch?v=-NMYeQGIN20
https://www.youtube.com/watch?v=-NMYeQGIN20
Edit file ~/.config/nvim/lua/configs/lspconfig.lua. 
Add "ols", to lspconfig.servers.
    "ols",Add "ols" to default_servers.
    "ols",Edit file ~/.config/nvim/lua/configs/treesitter.lua. 
Add syntax highlighting for Odin.
        "odin", https://www.youtube.com/watch?v=CcYQULn_M4s
https://www.youtube.com/watch?v=CcYQULn_M4s
Edit file ~/.config/nvim/lua/configs/lspconfig.lua. 
Add the haskell-language-server "hls", to lspconfig.servers. Unless it's installed on your system.
    "hls",Add a setup for hls. This disables formatting.
-- lspconfig.hls.setup({ -- pre nvim 0.11
vim.lsp.config("hls", { -- nvim 0.11
    on_attach = function(client, bufnr)
        client.server_capabilities.documentFormattingProvider = false
        client.server_capabilities.documentRangeFormattingProvider = false
        on_attach(client, bufnr)
    end,
    on_init = on_init,
    capabilities = capabilities,
})Edit file ~/.config/nvim/lua/configs/lint.lua. 
Add a hlint entry to linters_by_ft table.
    haskell = { "hlint" },Edit file ~/.config/nvim/lua/configs/conform.lua. 
Add an entry to formatters_by_ft for ormolu or fourmolu. Also add stylish-haskell.
Four spaces the right choice.
        haskell = { "fourmolu", "stylish-haskell" },Two spaces the wrong choice.
        haskell = { "ormolu", "stylish-haskell" },Edit file ~/.config/nvim/lua/configs/treesitter.lua. 
Add syntax highlighting for Haskell.
        "haskell",