DEV Community

Cover image for Unleash the Neovim Beast: Master Your LazyVim Setup with Real Developer Workflows (Part 3)
Crafts 69 Guy
Crafts 69 Guy

Posted on

Unleash the Neovim Beast: Master Your LazyVim Setup with Real Developer Workflows (Part 3)

Table Of Contents

  1. Welcome Back, LazyVim Warriors!
  2. Your Complete Plugin Arsenal
  3. Step-by-Step: Build Your Dream Setup
  4. Custom Power Tools (The Secret Sauce!)
  5. Pro Developer Workflows
  6. Keep It Fast: Performance Tips
  7. When Things Break: Troubleshooting Guide
  8. Your Next Level Journey

Welcome Back, LazyVim Warriors! 🀠

If you've followed Part 1 (LazyVim installation) and Part 2 (basic customization), you're ready for the REAL power!

What you'll get in this final part:

  • Production-ready plugin configurations (copy-paste friendly!)
  • Custom utilities that solve real developer problems
  • Workflows used by professional full-stack developers
  • A setup that's fast, reliable, and actually fun to use

Let's turn your LazyVim into a development beast! πŸ”₯


Your Complete Plugin Arsenal πŸ›‘οΈ

Coding Superpowers

  • Blink.cmp: Lightning-fast autocompletion with AI assistance (Codeium)
  • Inc-rename: Rename variables with live preview across your entire project
  • Mini.bracketed: Navigate through code like a pro (functions, errors, etc.)
  • Dial.nvim: Smart increment/decrement (numbers, dates, booleans, even const/let!)
  • Symbols Outline: Bird's eye view of your code structure
  • Marks.nvim: Never lose your place in large files

LSP Magic for Web Development

  • TypeScript/JavaScript: Full intellisense with inlay hints
  • CSS/Tailwind: Smart styling assistance
  • HTML: Complete tag and attribute completion
  • Mason: Automatic language server management
  • Perfect Diagnostics: Error handling that doesn't annoy you

UI That Actually Helps

  • Snacks Dashboard: Beautiful startup screen with your recent projects
  • Incline.nvim: Smart filename display with file icons
  • Bufferline: Clean tab management
  • Lualine: Information-rich status line
  • Zen Mode: Distraction-free coding sessions
  • Color Highlights: See your CSS colors in real-time

Editor Ninja Tools

  • Telescope: Find anything, anywhere (files, text, commands)
  • Neo-tree: Project navigation made simple
  • Git Integration: Version control without leaving your editor
  • Close Buffers: Smart buffer cleanup
  • Conform + Biome: Lightning-fast code formatting

Step by Step: Build Your Dream Setup

Perfect Your Solarized Osaka Theme

First, let's get your theme setup perfected from Part 2!

Create: lua/plugins/colorscheme.lua

return {
  {
    "craftzdog/solarized-osaka.nvim",
    lazy = true,
    priority = 1000,
    opts = function()
      return {
        transparent = true, -- Makes your terminal background show through
      }
    end,
  },
}
Enter fullscreen mode Exit fullscreen mode

It's will look like this

Yeahh, I'm a big fan of the solarized-osaka theme, so thanks so much Takuya Matsuyama!

🎨 Advanced Theme Customization:

Want to customize colors for specific plugins? Add this to your theme config:

return {
  {
    "craftzdog/solarized-osaka.nvim",
    lazy = true,
    priority = 1000,
    opts = function()
      return {
        transparent = true,
        on_colors = function(colors)
          -- Customize specific colors
          colors.hint = colors.orange -- Make hints more visible
          colors.error = colors.red    -- Error color
        end,
        on_highlights = function(highlights, colors)
          -- Customize specific highlight groups
          highlights.Comment = { fg = colors.base01, italic = true }
          highlights["@keyword"] = { fg = colors.violet, bold = true }
        end,
      }
    end,
  },
}
Enter fullscreen mode Exit fullscreen mode

πŸ”— Theme Integration with Your UI Plugins:

Notice how your UI plugins use the theme colors:

-- In your incline.nvim config (from ui.lua)
local colors = require("solarized-osaka.colors").setup()
-- This ensures your filename bar matches your theme perfectly!
Enter fullscreen mode Exit fullscreen mode

Why This Setup Rocks:

  • Transparent background: Your terminal's background shows through
  • Consistent colors: All plugins use the same color palette
  • Customizable: Override any color you don't like
  • Performance: Lazy-loaded with high priority for instant theming

Supercharge Your Coding with Smart Plugins

Create: lua/plugins/coding.lua

return {
  -- Lightning-fast completion with AI
  {
    "saghen/blink.cmp",
    dependencies = {
      "codeium.nvim",
      "saghen/blink.compat",
      "rafamadriz/friendly-snippets",
    },
    opts = {
      -- AI-powered completions
      sources = {
        compat = { "codeium" },
        default = { "lsp", "path", "snippets", "buffer" },
        providers = {
          codeium = {
            kind = "Codeium",
            score_offset = 100, -- Prioritize AI suggestions
            async = true,
          },
        },
      },

      keymap = {
        preset = "enter",
        ["<C-y>"] = { "select_and_accept" }, -- Accept with Ctrl+y
      },

      appearance = {
        nerd_font_variant = "mono",
      },
    },
  },

  -- Rename with live preview
  {
    "smjonas/inc-rename.nvim",
    cmd = "IncRename",
    config = true,
  },

  -- Navigate like a pro
  {
    "echasnovski/mini.bracketed",
    event = "BufReadPost",
    config = function()
      require("mini.bracketed").setup({
        file = { suffix = "" },
        window = { suffix = "" },
        quickfix = { suffix = "" },
        yank = { suffix = "" },
        treesitter = { suffix = "n" },
      })
    end,
  },

  -- Smart increment/decrement
  {
    "monaqa/dial.nvim",
    keys = {
      { "<C-a>", function() return require("dial.map").inc_normal() end, expr = true },
      { "<C-x>", function() return require("dial.map").dec_normal() end, expr = true },
    },
    config = function()
      local augend = require("dial.augend")
      require("dial.config").augends:register_group({
        default = {
          augend.integer.alias.decimal,
          augend.integer.alias.hex,
          augend.date.alias["%Y/%m/%d"],
          augend.constant.alias.bool,
          augend.semver.alias.semver,
          augend.constant.new({ elements = { "let", "const" } }), -- Toggle let/const
        },
      })
    end,
  },

  -- Code structure overview
  {
    "simrat39/symbols-outline.nvim",
    keys = { { "<leader>cs", "<cmd>SymbolsOutline<cr>", desc = "Symbols Outline" } },
    cmd = "SymbolsOutline",
    opts = {
      position = "right",
    },
  },

  -- Never lose your place
  {
    "chentoast/marks.nvim",
    event = "VeryLazy",
    opts = {},
  },
}
Enter fullscreen mode Exit fullscreen mode

🎯 Why These Plugins Rock:

  • Blink.cmp: Faster than nvim-cmp with AI suggestions
  • Inc-rename: See all changes before committing
  • Dial: Turn true β†’ false, Monday β†’ Tuesday, let β†’ const
  • Mini.bracketed: Use ]f to jump to next function, ]d for next diagnostic

Master Web Development with Perfect LSP

Create: lua/plugins/lsp.lua

return {
  -- Auto-install LSP servers
  {
    "williamboman/mason.nvim",
    opts = function(_, opts)
      vim.list_extend(opts.ensure_installed, {
        "typescript-language-server",
        "css-lsp",
        "tailwindcss-language-server",
        "biome", -- Fast formatter/linter
      })
    end,
  },

  -- LSP configuration
  {
    "neovim/nvim-lspconfig",
    opts = {
      inlay_hints = { enabled = false }, -- Toggle when needed
      servers = {
        -- TypeScript/JavaScript powerhouse
        tsserver = {
          root_dir = function(...)
            return require("lspconfig.util").root_pattern(".git")(...)
          end,
          settings = {
            typescript = {
              inlayHints = {
                includeInlayParameterNameHints = "literal",
                includeInlayParameterNameHintsWhenArgumentMatchesName = false,
                includeInlayFunctionParameterTypeHints = true,
                includeInlayVariableTypeHints = false,
                includeInlayPropertyDeclarationTypeHints = true,
              },
            },
            javascript = {
              inlayHints = {
                includeInlayParameterNameHints = "all",
                includeInlayParameterNameHintsWhenArgumentMatchesName = false,
                includeInlayFunctionParameterTypeHints = true,
              },
            },
          },
        },

        -- CSS intellisense
        cssls = {},

        -- Tailwind CSS support
        tailwindcss = {
          root_dir = function(...)
            return require("lspconfig.util").root_pattern(".git")(...)
          end,
        },

        -- HTML support
        html = {},
      },
    },
  },
}
Enter fullscreen mode Exit fullscreen mode

πŸ”₯ Pro Tips:

  • Mason auto-installs everything you need
  • Inlay hints show parameter types (toggle with custom keymap later!)
  • Root detection ensures proper project context

Create a Beautiful, Functional Interface

Create: lua/plugins/ui.lua

return {
  -- Beautiful dashboard
  {
    "folke/snacks.nvim",
    opts = {
      dashboard = {
        preset = {
          header = [[
Your custom ASCII art here (keep it simple!)
Welcome back, developer! πŸš€
          ]],
        },
      },
    },
  },

  -- Smart filename display
  {
    "b0o/incline.nvim",
    dependencies = { "craftzdog/solarized-osaka.nvim" },
    event = "BufReadPre",
    config = function()
      local colors = require("solarized-osaka.colors").setup()
      require("incline").setup({
        highlight = {
          groups = {
            InclineNormal = { guibg = colors.magenta500, guifg = colors.base04 },
            InclineNormalNC = { guifg = colors.violet500, guibg = colors.base03 },
          },
        },
        window = { margin = { vertical = 0, horizontal = 1 } },
        render = function(props)
          local filename = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(props.buf), ":t")
          if vim.bo[props.buf].modified then
            filename = "[+] " .. filename
          end
          local icon, color = require("nvim-web-devicons").get_icon_color(filename)
          return { { icon, guifg = color }, { " " }, { filename } }
        end,
      })
    end,
  },

  -- Distraction-free coding
  {
    "folke/zen-mode.nvim",
    cmd = "ZenMode",
    keys = { { "<leader>z", "<cmd>ZenMode<cr>", desc = "Zen Mode" } },
    opts = {
      plugins = {
        gitsigns = true,
        tmux = true,
      },
    },
  },

  -- Clean buffer tabs
  {
    "akinsho/bufferline.nvim",
    opts = {
      options = {
        mode = "tabs",
        show_buffer_close_icons = false,
        show_close_icon = false,
      },
    },
  },
}
Enter fullscreen mode Exit fullscreen mode

Essential Editor Tools for Daily Work

Create: lua/plugins/editor.lua

return {
  -- See colors in your CSS files
  {
    "brenoprata10/nvim-highlight-colors",
    event = "BufReadPre",
    opts = {
      render = "background",
      enable_hex = true,
      enable_short_hex = true,
      enable_rgb = true,
      enable_hsl = true,
      enable_tailwind = true,
    },
  },

  -- Git integration
  {
    "dinhhuy258/git.nvim",
    event = "BufReadPre",
    opts = {
      keymaps = {
        blame = "<Leader>gb", -- See who wrote this code
        browse = "<Leader>go", -- Open on GitHub
      },
    },
  },

  -- Enhanced Telescope
  {
    "nvim-telescope/telescope.nvim",
    dependencies = {
      "nvim-telescope/telescope-fzf-native.nvim",
      "nvim-telescope/telescope-file-browser.nvim",
    },
    keys = {
      -- Your actual keymaps from config
      { ";f", function() require("telescope.builtin").find_files({ hidden = true }) end, desc = "Find Files" },
      { ";r", function() require("telescope.builtin").live_grep({ additional_args = { "--hidden" } }) end, desc = "Live Grep" },
      { "\\\\", function() require("telescope.builtin").buffers() end, desc = "Buffers" },
      { ";;", function() require("telescope.builtin").resume() end, desc = "Resume" },
    },
  },

  -- Smart buffer management
  {
    "kazhala/close-buffers.nvim",
    event = "VeryLazy",
    keys = {
      { "<leader>th", function() require("close_buffers").delete({ type = "hidden" }) end, desc = "Close Hidden Buffers" },
      { "<leader>tu", function() require("close_buffers").delete({ type = "nameless" }) end, desc = "Close Nameless Buffers" },
    },
  },
}
Enter fullscreen mode Exit fullscreen mode

Custom Power Tools (The Secret Sauce!) πŸ₯·

The Cowboy Discipline System

Create: lua/insideee-dev/discipline.lua

local M = {}

function M.cowboy()
  -- Prevent excessive use of hjkl and arrow keys
  for _, key in ipairs({ "h", "j", "k", "l", "+", "-" }) do
    local count = 0
    local timer = assert(vim.uv.new_timer())
    local map = key
    vim.keymap.set("n", key, function()
      if vim.v.count > 0 then
        count = 0
      end
      if count >= 10 and vim.bo.buftype ~= "nofile" then
        vim.notify("Hold it Cowboy! 🀠", vim.log.levels.WARN, {
          icon = "🀠",
          id = "cowboy",
        })
      else
        count = count + 1
        timer:start(2000, 0, function()
          count = 0
        end)
        return map
      end
    end, { expr = true, silent = true })
  end
end

return M
Enter fullscreen mode Exit fullscreen mode

🀠 What This Does:

  • Prevents you from spamming hjkl keys (builds better habits!)
  • Encourages using proper Vim motions like w, b, f, t
  • Shows a fun cowboy notification when you need to slow down

Smart File & Path Utilities

Create: lua/insideee-dev/utils.lua

local M = {}

-- Copy relative path of current file to clipboard
function M.copy_to_clipboard(has_current_line)
  local current_file_name = vim.fn.expand("%")
  local relative_path = vim.fn.fnamemodify(current_file_name, ":.")

  if has_current_line then
    relative_path = relative_path .. ":" .. vim.fn.line(".")
  end

  vim.fn.setreg("+", relative_path)

  local message = has_current_line and "Copied with line: " or "Copied path: "
  vim.notify(message .. relative_path, vim.log.levels.INFO)
end

-- Helper functions for table manipulation
function M.shallow_copy(t)
  local copy = {}
  for k, v in pairs(t) do
    copy[k] = v
  end
  return copy
end

function M.shallow_merge(table_1st, table_2nd)
  local result = M.shallow_copy(table_1st)
  for k, v in pairs(table_2nd) do
    result[k] = v
  end
  return result
end

return M
Enter fullscreen mode Exit fullscreen mode

Color Conversion Magic

Add to your utils.lua:

-- Convert hex colors to HSL (great for CSS work!)
function M.hex_to_HSL(hex)
  -- Your existing color conversion functions here
  local rgb = M.hex_to_rgb(hex)
  local h, s, l = M.rgb_to_hsl(rgb[1], rgb[2], rgb[3])
  return string.format("hsl(%d, %d%%, %d%%)", math.floor(h + 0.5), math.floor(s + 0.5), math.floor(l + 0.5))
end

function M.replace_hex_with_HSL()
  local line_number = vim.api.nvim_win_get_cursor(0)[1]
  local line_content = vim.api.nvim_buf_get_lines(0, line_number - 1, line_number, false)[1]

  -- Find and replace hex codes
  for hex in line_content:gmatch("#[0-9a-fA-F]+") do
    local hsl = M.hex_to_HSL(hex)
    line_content = line_content:gsub(hex, hsl)
  end

  vim.api.nvim_buf_set_lines(0, line_number - 1, line_number, false, { line_content })
end
Enter fullscreen mode Exit fullscreen mode

🎨 Real-world use: Convert #3b82f6 to hsl(217, 91%, 60%) instantly!

LSP Enhancement Helpers

Create: lua/insideee-dev/lsp.lua

local M = {}

function M.toggleInlayHints()
  vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled())
end

return M
Enter fullscreen mode Exit fullscreen mode

Wire Everything Up in Keymaps {#wire-up-keymaps}

Add to your lua/config/keymaps.lua:

local discipline = require("insideee-dev.discipline")
local utils = require("insideee-dev.utils")

-- Enable cowboy discipline
discipline.cowboy()

-- File path utilities
keymap.set("n", "<Leader>yr", function()
  utils.copy_to_clipboard()
end, { desc = "Copy relative path" })

keymap.set("n", "<Leader>yR", function()
  utils.copy_to_clipboard(true)
end, { desc = "Copy path with line number" })

-- Color conversion magic
keymap.set("n", "<leader>r", function()
  utils.replace_hex_with_HSL()
end, { desc = "Replace hex with HSL" })

-- LSP helpers
keymap.set("n", "<leader>i", function()
  require("insideee-dev.lsp").toggleInlayHints()
end, { desc = "Toggle inlay hints" })
Enter fullscreen mode Exit fullscreen mode

Pro Developer Workflows πŸ’ͺ

Morning Setup Routine

Your daily startup sequence:

  1. Open project: nvim (see your custom dashboard!)
  2. Recent files: ;f β†’ type project name
  3. Search TODOs: ;r β†’ type "TODO"
  4. Check git status: <leader>gg (if you have lazygit)
  5. Review diagnostics: <leader>xx

Debugging Like a Boss

When code breaks:

  1. Jump to error: <C-j> (next diagnostic)
  2. Show details: <leader>cd (line diagnostics)
  3. Quick fix: <leader>ca (code actions)
  4. Restart LSP: :LspRestart if needed
  5. Format code: <leader>cf (with Biome)

File Navigation Mastery

Become a navigation ninja:

  • ]n / [n - Next/previous treesitter node (function, class, etc.)
  • ]d / [d - Next/previous diagnostic
  • <C-j> - Jump to next diagnostic (your custom keymap)
  • <leader>1-6 - Jump to specific buffer
  • sf - Browse files in current directory
  • ;; - Resume last telescope search

Keep It Fast: Performance Tips ⚑

Your setup is already optimized, but here's why:

  1. Lazy Loading: Plugins load only when needed
  2. Event-based Loading: BufReadPre, VeryLazy, etc.
  3. Minimal Startup: Essential plugins only
  4. Smart Defaults: Pre-configured for speed

Check your startup time:

nvim --startuptime startup.log
Enter fullscreen mode Exit fullscreen mode

Profile plugins:

:Lazy profile
Enter fullscreen mode Exit fullscreen mode

When Things Break: Troubleshooting Guide πŸ”§

LSP Not Working?

  1. :Mason - Check installed servers
  2. :LspInfo - See attached servers
  3. :LspRestart - Restart language server
  4. Check project has package.json or .git

Completion Not Showing?

  1. :Lazy sync - Update plugins
  2. Check Codeium is working: :Codeium Auth
  3. Restart nvim completely

Telescope Errors?

  1. Install dependencies: brew install ripgrep fd
  2. :checkhealth telescope - Check setup
  3. Clear cache: rm -rf ~/.local/share/nvim

Performance Issues?

  1. :Lazy profile - Find slow plugins
  2. Disable unused TreeSitter parsers
  3. Check for plugin conflicts

Your Next Level Journey πŸš€

Congratulations! You're now a LazyVim Beast! 🦁

You've mastered:

  • βœ… Production-ready plugin configuration
  • βœ… Custom utilities that save time daily
  • βœ… Professional developer workflows
  • βœ… Performance optimization
  • βœ… Troubleshooting skills

Keep growing:

  • Explore language-specific plugins
  • Create custom snippets for your projects
  • Contribute to the LazyVim community
  • Share your setup with other developers

Advanced topics to explore later:

  • Custom plugin development
  • Advanced Lua scripting
  • Integration with external tools (Docker, databases)
  • Team configuration management

You're ready to code like a superhero! Your LazyVim beast mode is fully activated! πŸš€πŸ”₯

Happy coding, and may your bugs be few and your commits be clean! 🀠

My dotfiles configurations:

GitHub logo crafts69guy / .dotfiles

This repo leverages GNU Stow to simplify symlink management, making it easy to install and update configurations across different machines.

fish screenshot nvim screenshot

Warning: Don’t blindly use my settings unless you know what that entails. Use at your own risk!

πŸ“Œ Contents

  • Neovim – Custom plugins, keybindings, and themes
  • Tmux – Optimized terminal workflow
  • Git – Configuration for efficient version control
  • Karabiner – Custom key mappings for Vim efficiency
  • Fish Shell – Enhanced terminal experience
  • GNU Stow – Simple dotfiles management

πŸš€ Setting Up a New Machine with This Repo

This repository uses GNU Stow to manage dotfiles efficiently with symlinks. Follow these steps to set up your new machine:

1. Install Required Packages

Install Stow & Essential Tools

macOS:

brew install stow git fish tmux neovim
Enter fullscreen mode Exit fullscreen mode

Linux (Debian/Ubuntu):

sudo apt update && sudo apt install stow git fish tmux neovim
Enter fullscreen mode Exit fullscreen mode

Linux (Arch):

sudo pacman -S stow git fish tmux neovim
Enter fullscreen mode Exit fullscreen mode

Install Fisher

A plugin manager for Fish
macOS:

curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
Enter fullscreen mode Exit fullscreen mode

Install Tide after installed

…

πŸš€ Follow me on X(Twitter)

πŸš€ Connect with me on Linkedin

πŸš€ Checkout my GitHub

Top comments (0)