create init.lua file inside .config/nvim , but before that, please back up all configuration files and folders first.
-- =========================================
-- NeoVim 0.12+ Native Pack + LSP Config
-- =========================================
-- Bootstrap plugins (native pack)
vim.pack.add({
{ src = "https://github.com/williamboman/mason.nvim.git" },
{ src = "https://github.com/neovim/nvim-lspconfig.git" },
{ src = "https://github.com/nvim-treesitter/nvim-treesitter.git", build = ":TSUpdate" },
{ src = "https://github.com/hrsh7th/nvim-cmp.git" },
{ src = "https://github.com/hrsh7th/cmp-nvim-lsp.git" },
{ src = "https://github.com/hrsh7th/cmp-buffer.git" },
{ src = "https://github.com/L3MON4D3/LuaSnip.git" },
{ src = "https://github.com/saghen/blink.cmp.git" },
{ src = "https://github.com/echasnovski/mini.pairs.git" },
{ src = "https://github.com/echasnovski/mini.icons.git" },
{ src = "https://github.com/nvim-lualine/lualine.nvim.git" },
{ src = "https://github.com/ibhagwan/fzf-lua.git" },
{ src = "https://github.com/nvim-tree/nvim-web-devicons.git" },
{ src = "https://github.com/folke/tokyonight.nvim.git" },
{ src = "https://github.com/akinsho/toggleterm.nvim.git" },
})
-- =========================================
-- Mason setup
-- =========================================
require("mason").setup()
-- =========================================
-- LSP (New Native API)
-- =========================================
local lsp = vim.lsp
local servers = { "lua_ls", "html", "intelephense", "ts_ls", "gopls", "pyright" }
for _, server in ipairs(servers) do
lsp.config(server, {
capabilities = require("cmp_nvim_lsp").default_capabilities(),
settings = {},
})
lsp.enable(server)
end
-- =========================================
-- Autocompletion (nvim-cmp + blink)
-- =========================================
local cmp = require("cmp")
cmp.setup({
mapping = cmp.mapping.preset.insert({
["<CR>"] = cmp.mapping.confirm({ select = true }),
["<Tab>"] = cmp.mapping.select_next_item(),
["<S-Tab>"] = cmp.mapping.select_prev_item(),
}),
sources = {
{ name = "nvim_lsp" },
{ name = "buffer" },
},
experimental = { ghost_text = true },
})
pcall(require, "blink.cmp")
-- =========================================
-- Treesitter (Syntax Highlight)
-- =========================================
require("nvim-treesitter.configs").setup({
ensure_installed = { "lua", "php", "blade", "html", "javascript", "json", "go" },
highlight = { enable = true },
})
-- =========================================
-- UI & Aesthetic
-- =========================================
vim.cmd.colorscheme("tokyonight")
require("lualine").setup({
options = { theme = "tokyonight" },
})
require("mini.pairs").setup()
require("mini.icons").setup()
require("nvim-web-devicons").setup()
require("toggleterm").setup({
size = 15,
open_mapping = [[<c-\>]], -- Default: Ctrl + \
shade_terminals = true,
shading_factor = 2,
direction = "float", -- or 'horizontal' / 'vertical' / 'tab'
float_opts = {
border = "curved",
winblend = 0,
},
})
-- Helper: Toggle lazygit (if installed)
local Terminal = require("toggleterm.terminal").Terminal
local lazygit = Terminal:new({ cmd = "lazygit", hidden = true, direction = "float" })
function _lazygit_toggle()
lazygit:toggle()
end
-- Keymaps for ToggleTerm
-- =========================================
-- Display Settings
-- =========================================
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.cursorline = true
vim.opt.signcolumn = "yes"
vim.opt.termguicolors = true
vim.opt.scrolloff = 8
vim.opt.sidescrolloff = 8
-- Dynamic relative numbers (like LazyVim)
vim.api.nvim_create_autocmd("InsertEnter", {
callback = function()
vim.opt.relativenumber = false
end,
})
vim.api.nvim_create_autocmd("InsertLeave", {
callback = function()
vim.opt.relativenumber = true
end,
})
-- =========================================
-- Clipboard Integration (WSL)
-- =========================================
-- Yank to Windows clipboard (requires `clip.exe` in WSL)
if vim.fn.has("wsl") == 1 then
vim.api.nvim_create_autocmd("TextYankPost", {
callback = function()
vim.fn.system("clip.exe", vim.fn.getreg('"'))
end,
})
vim.opt.clipboard = "unnamedplus"
end
-- =========================================
-- Diagnostics / Auto Lint + Format
-- =========================================
vim.diagnostic.config({
virtual_text = { prefix = "ΓùÅ" },
signs = true,
underline = true,
update_in_insert = false,
severity_sort = true,
})
local lsp_format_group = vim.api.nvim_create_augroup("LspAutoFormat", { clear = true })
vim.api.nvim_create_autocmd("BufWritePre", {
group = lsp_format_group,
callback = function(event)
local client = vim.lsp.get_clients({ bufnr = event.buf })[1]
if client and client.supports_method("textDocument/formatting") then
vim.lsp.buf.format({ async = false })
end
end,
})
-- =========================================
-- Keymaps
-- =========================================
vim.g.mapleader = " "
vim.g.maplocalleader = " "
local keymap = vim.keymap.set
local opts = { noremap = true, silent = true }
-- LazyVim-style FZF bindings
keymap("n", "<leader>ff", function()
require("fzf-lua").files()
end, { desc = "Find files", unpack(opts) })
keymap("n", "<leader>fg", function()
require("fzf-lua").live_grep()
end, { desc = "Live grep", unpack(opts) })
keymap("n", "<leader>fb", function()
require("fzf-lua").buffers()
end, { desc = "Find buffers", unpack(opts) })
keymap("n", "<leader>fh", function()
require("fzf-lua").help_tags()
end, { desc = "Find help", unpack(opts) })
-- Format & Diagnostics
keymap("n", "<leader>lf", function()
vim.lsp.buf.format({ async = true })
end, { desc = "Format file", unpack(opts) })
keymap("n", "<leader>ld", vim.diagnostic.open_float, { desc = "Show diagnostics", unpack(opts) })
keymap("n", "<leader>ln", vim.diagnostic.goto_next, { desc = "Next diagnostic", unpack(opts) })
keymap("n", "<leader>lp", vim.diagnostic.goto_prev, { desc = "Prev diagnostic", unpack(opts) })
-- Quick actions
keymap("n", "<leader>w", "<cmd>w<CR>", { desc = "Save file", unpack(opts) })
keymap("n", "<leader>q", "<cmd>q<CR>", { desc = "Quit Neovim", unpack(opts) })
vim.keymap.set("n", "<leader>ft", "<cmd>ToggleTerm<CR>", { desc = "Toggle terminal" })
vim.keymap.set("n", "<leader>fu", "<cmd>lua _lazygit_toggle()<CR>", { desc = "Toggle Lazygit (if available)" })
vim.keymap.set("t", "<Esc>", [[<C-\><C-n>]], { desc = "Exit terminal mode" })
Top comments (0)