DEV Community

hardyweb
hardyweb

Posted on

Neovim 0.12 autocomplete and native plugin manager for laravel and go

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" })



Enter fullscreen mode Exit fullscreen mode

Top comments (0)