LazyVim para C, Rust, Swift y frontend
Activa los Extras de lenguaje de LazyVim para nuestros cuatro stacks y añade Swift a mano. El IDE del Nivel 2, ahora con una tecla por lenguaje.
Todo el trabajo de configuración por lenguaje del Nivel 2 (LSP, formateo, depuración, coordinados) LazyVim lo tiene empaquetado en Extras. Aquí activamos los de nuestros cuatro stacks, miramos qué teclas trae cada uno y resolvemos el único que necesita un empujón manual: Swift.
- Activar los Extras de C, Rust, TypeScript/React y Tailwind.
- Entender qué instala y qué mapea cada Extra.
- Añadir Swift (sourcekit-lsp) sobre LazyVim, por las dos vías posibles.
- Sumar IA sin pelearse con el autocompletado.
Activar los Extras de lenguaje
Abre :LazyExtras y activa (tecla x) los que necesites, o añádelos a mano en lua/config/lazy.lua:
spec = {
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
-- Nuestros stacks
{ import = "lazyvim.plugins.extras.lang.clangd" }, -- C / C++
{ import = "lazyvim.plugins.extras.lang.rust" }, -- Rust (rustaceanvim + crates)
{ import = "lazyvim.plugins.extras.lang.typescript" }, -- TS / JS
{ import = "lazyvim.plugins.extras.lang.tailwind" }, -- Tailwind
{ import = "lazyvim.plugins.extras.lang.json" },
{ import = "lazyvim.plugins.extras.formatting.prettier" },
-- IA
{ import = "lazyvim.plugins.extras.ai.copilot" },
{ import = "plugins" },
},
Cada Extra trae todo coordinado: el servidor LSP con sus banderas, el parser de Treesitter, el adaptador de depuración y los atajos propios del lenguaje.
lang.clangd
clangd con banderas afinadas (--background-index, --clang-tidy), clangd_extensions y el DAP con codelldb para C y C++. Añade <leader>ch para saltar entre cabecera y fuente. Recuerda generar compile_commands.json (lección 2.5).
lang.rust
rustaceanvim con rust-analyzer afinado, crates.nvim para Cargo.toml y codelldb para depurar. Desactiva el rust_analyzer genérico para que no haya dos servidores. El setup de la lección 2.6, en una línea.
lang.typescript
Monta vtsls como servidor por defecto y añade acciones propias: <leader>cM importa lo que falta, <leader>cD arregla todos los diagnósticos del archivo, gD va a la definición de origen.
lang.tailwind
tailwindcss-language-server con completado de clases. :LazyExtras solo te lo recomienda si ve un tailwind.config o un postcss.config en la raíz del proyecto.
Un Extra no solo instala: mapea. Después de activar varios, pasa por :map <leader>c y por <leader> con which-key para ver qué ha aparecido. Es la forma barata de descubrir que dos Extras quieren la misma tecla antes de que te pase en mitad de un trabajo.
Swift: el que va a mano
LazyVim no trae un Extra de Swift, así que lo añadimos nosotros. Y aquí tienes dos vías, las dos válidas.
Vía 1: la nativa de 0.12 (más simple)
Como viste en la lección 2.7, en Neovim 0.12 un servidor de lenguaje es una ficha en la carpeta lsp/ de tu runtimepath más una línea para activarlo. Y ~/.config/nvim/lsp/ está en el runtimepath también dentro de LazyVim, así que esto funciona sin escribir ninguna spec:
return {
cmd = { "xcrun", "sourcekit-lsp" },
filetypes = { "swift" },
root_markers = { "buildServer.json", "Package.swift", ".git" },
}
vim.lsp.enable("sourcekit")
sourcekit-lsp también sabe de C, C++ y Objective-C. Si declaras esos filetypes y tienes activo lang.clangd, los dos servidores se adjuntarán al mismo buffer y verás diagnósticos duplicados. Deja filetypes en swift a secas, o añade objc y objcpp si trabajas con código mixto de Apple.
Vía 2: la de LazyVim (integrada con su capa)
Si prefieres que Swift entre por la misma puerta que el resto —y así herede los keymaps de LSP de la distro y su gestión de formateo— declara el servidor en las opts de LazyVim:
return {
{
"neovim/nvim-lspconfig",
opts = {
servers = {
sourcekit = {
mason = false, -- no está en Mason: viene con la toolchain de Xcode
cmd = { "xcrun", "sourcekit-lsp" },
filetypes = { "swift" },
root_markers = { "buildServer.json", "Package.swift", ".git" },
},
},
},
},
-- formateo con swift-format vía conform (LazyVim ya lo trae)
{
"conform.nvim",
opts = { formatters_by_ft = { swift = { "swift_format" } } },
},
-- el parser, por la opción de la spec de LazyVim
{
"nvim-treesitter/nvim-treesitter",
opts = { ensure_installed = { "swift" } },
},
}
Este archivo es la plantilla universal: una entrada en opts.servers para el servidor, otra en conform para el formateo y otra en ensure_installed para el parser. Sirve para Swift, Zig, Gleam o cualquier lenguaje que la distro no cubra. Fíjate en que mason = false es lo que le dice a LazyVim “de este servidor me encargo yo”: sin esa línea intentaría instalarlo con Mason, y sourcekit-lsp no está ahí porque ya viene con Xcode.
IA sobre LazyVim
El Extra ai.copilot activa copilot.lua con sugerencias en línea. Merece la pena mirar cómo lo configura: deja el “aceptar sugerencia” en manos del motor de completado en lugar de mapearlo él, precisamente para no pelearse por <Tab>. Es exactamente la disciplina que predica este track.
Si prefieres el stack por capas de la lección 3.4 —copilot.lua para la sugerencia en línea, CodeCompanion para conversar y sidekick para los agentes—, añádelos como plugins propios en lua/plugins/ con las specs de esa lección: se integran igual que en tu config a mano.
Ningún plugin de IA debe quedarse con <Tab> ni con <C-Space>: la primera mueve el menú de completado y la segunda lo dispara. Si un tutorial te propone <Tab> para aceptar la sugerencia, muévelo a una combinación con Alt o acepta que tu completado se vuelva impredecible. Compruébalo con :imap <Tab>.
Fíjate en lo que acabas de hacer: la comodidad de los Extras para lo estándar (C, Rust, TS, Tailwind) y tu conocimiento del Nivel 2 para lo que la distro no cubre. Y fíjate sobre todo en la vía 1 de Swift: cinco líneas, ninguna spec, ningún plugin. Neovim 0.12 ha convertido “añadir un lenguaje que la distro no soporta” en un trámite. Un usuario que solo sabe distros se queda parado cuando falta un Extra; tú ya no necesitas ni el Extra. Eso es ser Arquitecto.
- Activa los Extras de clangd, rust, typescript y tailwind.
- Abre un archivo de cada lenguaje y confirma que el LSP responde (
K,gd). - Ejecuta
:lspen cada buffer y comprueba que hay un solo servidor adjunto. - Añade Swift por la vía 1 y prueba un archivo
.swift. - Activa
ai.copiloty verifica con:imap <Tab>que sigue siendo del completado. - Formatea al guardar en los cuatro lenguajes.