Skip to main content
This configuration provides comprehensive language support through LSP (Language Server Protocol), formatters, and linters. All tools are installed globally on your system - no plugin managers for external tools.

Architecture

The language support system consists of three main components:

LSP servers

Provide IntelliSense, diagnostics, go-to-definition, and refactoring capabilities

Formatters

Handled by conform.nvim for code formatting with format-on-save enabled

Linters

Managed by nvim-lint for code analysis, triggered manually with <leader>ll

Supported languages

The configuration includes built-in support for:
  • TypeScript/JavaScript - tsgo LSP, Biome/Prettier formatting, ESLint linting
  • Go - gopls LSP, goimports/gofumpt formatting, golangci-lint linting
  • Lua - lua_ls LSP, stylua formatting, enhanced Neovim development support
  • Markdown - render-markdown.nvim for preview, markdownlint for linting
  • C/C++ - clangd LSP, clang-format formatting, cppcheck linting
  • Shell - bashls LSP, shfmt formatting, shellcheck linting
  • CSS/HTML - cssls/html LSP, Prettier formatting
  • YAML/JSON - yamlls/jsonls LSP, yamlfmt/Prettier formatting
  • Docker - dockerls LSP, dockerfmt formatting, hadolint linting

LSP configuration

Language servers are configured using Neovim 0.11+‘s native LSP support:
-- All servers enabled in lua/plugins/lsp/init.lua:42
vim.lsp.enable({
  "lua_ls",      -- Lua
  "gopls",       -- Go
  "tsgo",        -- TypeScript/JavaScript
  "angularls",   -- Angular
  "biome",       -- Biome (JS/TS/JSON)
  "bashls",      -- Bash/Shell
  "cssls",       -- CSS/SCSS/Less
  "html",        -- HTML
  "jsonls",      -- JSON
  "yamlls",      -- YAML
  "dockerls",    -- Docker
  "clangd",      -- C/C++
  "tailwindcss", -- Tailwind CSS
  "emmet_language_server", -- Emmet
  "harper_ls",   -- Grammar/spell checking
})
Base configurations come from nvim-lspconfig, with custom overrides in after/lsp/*.lua files.

Global capabilities

All language servers share common capabilities:
-- From lua/plugins/lsp/init.lua:21
local capabilities = require("blink.cmp").get_lsp_capabilities({
  textDocument = {
    foldingRange = {
      dynamicRegistration = false,
      lineFoldingOnly = true,
    },
  },
})

vim.lsp.config("*", {
  capabilities = capabilities,
  root_markers = { ".git" },
})

Installation approach

This configuration does NOT use Mason. All language servers, formatters, and linters must be installed globally.
See the installation guide in the source repository for complete installation instructions.

Quick verification

After installation, verify your tools:
# Language servers
lua-language-server --version
gopls version
typescript-language-server --version

# Formatters
stylua --version
prettier --version
biome --version

# Linters
eslint_d --version
golangci-lint --version

Keymaps

Common LSP keymaps (set in lua/plugins/lsp/init.lua:65):
KeymapActionDescription
KHoverShow documentation
<C-k>Signature helpShow function signature
gaCode actionShow available actions
<leader>rnRenameRename symbol
]d / [dNext/prev diagnosticNavigate diagnostics
<leader>cdShow diagnosticShow diagnostic float
<leader>ihToggle inlay hintsToggle type hints
<leader>fbFormat bufferFormat code
<leader>llLintTrigger linting
Navigation keymaps (gd, gr, gi, etc.) are delegated to Snacks pickers for enhanced UX.

Diagnostic configuration

Diagnostics use custom icons and styling:
-- From lua/plugins/lsp/init.lua:163
vim.diagnostic.config({
  severity_sort = true,
  float = { border = "rounded", source = true },
  underline = true,
  update_in_insert = false,
  signs = {
    text = {
      [vim.diagnostic.severity.ERROR] = "󰅚 ",
      [vim.diagnostic.severity.WARN] = "󰀪 ",
      [vim.diagnostic.severity.INFO] = "󰋽 ",
      [vim.diagnostic.severity.HINT] = "󰌶 ",
    },
  },
  virtual_text = false, -- Using tiny-diagnostic plugin
})

Next steps

LSP setup

Detailed LSP configuration and customization

Formatting

Configure code formatters with conform.nvim

Linting

Set up linters with nvim-lint

TypeScript

TypeScript/JavaScript specific setup

Build docs developers (and LLMs) love