En este artículo voy a tratar de hacer una lista de algunos plugins de Vim que a mi me encantan y que recomiendo mucho su uso.

Antes de empezar hay que aclarar que algunos plugins funcionan para vim y neovim, pero algunos solo funcionan para neovim.

Te recomiendo que te pases por el artículo de Cómo instalar plugins en Vim y Neovim y por el de Temas de color recomendados para Vim 🚧 para que termines de completar tu Vim.

Ya que en el artículo de Configuración básica de Vim no puse nada de config de plugins, voy a tratar de poner aquí la config que uso de cada uno.

Lualine

https://github.com/nvim-lualine/lualine.nvim

Lualine es un plugin que añade una barra de estado en Vim, para saber en qué modo estás, para ver el número de líneas del fichero, la rama de git, etc.

Hace años la gente usaba mucho lightline y el mítico airline, pero los he cambiado por este que es más ligero.

Mi config es la siguiente:

require("lualine").setup {

options = {
 theme = "tokyonight",
},

sections = {
  lualine_a = { "mode" },
  lualine_b = { "filename" },
  lualine_c = { "g:coc_status" },
  lualine_x = { "branch" },
  lualine_y = { "encoding" },
  lualine_z = { "location" }
}

nvim-telescope

https://github.com/nvim-telescope/telescope.nvim

Mi plugin preferido para neovim. Se trata de un popup que se abre en medio de la pantalla y que contiene un buscador. Dependiendo del comando que ejecutes para abrir el popup puedes buscar una cosa o otra.

Yo por ejemplo tengo un comando para abrir buscador de ficheros y otro para hacer una búsqueda de un texto de forma global en todos los ficheros del proyecto.

Funciona incluso mejor que el Control + P de vscode porque tiene una pequeña previsualizaciñón del fichero antes de abrirlo.

Mi config de telescope es la siguiente:

telescope.setup {
   defaults = {
      vimgrep_arguments = {
         "rg",
         "--color=never",
         "--no-heading",
         "--with-filename",
         "--line-number",
         "--column",
         "--smart-case",
      },
      prompt_prefix = "   ",
      selection_caret = "  ",
      entry_prefix = "  ",
      initial_mode = "insert",
      selection_strategy = "reset",
      sorting_strategy = "ascending",
      layout_strategy = "horizontal",
      layout_config = {
         horizontal = {
            prompt_position = "top",
            preview_width = 0.55,
            results_width = 0.8,
         },
         vertical = {
            mirror = false,
         },
         width = 0.87,
         height = 0.80,
         preview_cutoff = 120,
      },
      file_sorter = require("telescope.sorters").get_fuzzy_file,
      file_ignore_patterns = {},
      generic_sorter = require("telescope.sorters").get_generic_fuzzy_sorter,
      path_display = { "absolute" },
      winblend = 0,
      border = {},
      borderchars = { "─", "│", "─", "│", "╭", "╮", "╯", "╰" },
      color_devicons = true,
      use_less = true,
      set_env = { ["COLORTERM"] = "truecolor" }, -- default = nil,
      file_previewer = require("telescope.previewers").vim_buffer_cat.new,
      grep_previewer = require("telescope.previewers").vim_buffer_vimgrep.new,
      qflist_previewer = require("telescope.previewers").vim_buffer_qflist.new,
      -- Developer configurations: Not meant for general override
      buffer_previewer_maker = require("telescope.previewers").buffer_previewer_maker,
   },
   extensions = {
      fzf = {
         fuzzy = true, -- false will only do exact matching
         override_generic_sorter = false, -- override the generic sorter
         override_file_sorter = true, -- override the file sorter
         case_mode = "smart_case", -- or "ignore_case" or "respect_case"
         -- the default case_mode is "smart_case"
      },
      media_files = {
         filetypes = { "png", "webp", "jpg", "jpeg" },
         find_cmd = "rg", -- find command (defaults to `fd`)
      },
   },
}

Y mis keybindings para abrir los popups son los siguientes:

nmap <C-P> :Telescope git_files hidden=true <CR>
nmap <C-T> :Telescope live_grep <CR>

Es decir, con Control P (como en el vscode) abro el popup y puedo escribir el nombre del fichero a buscar en el proyecto. Con Control 'T lo que se abre es un buscador para buscar cualquier texto en los ficheros del proyecto.

Update 2023-04-23: He cambiado Telescope por FZF ya que es la herramienta que estoy usando también en la terminal y me es más familiar y ligera. He escrito el artículo de Por qué me gusta tanto FZF 🚧 por si te interesa el tema.

Bufftabline

https://github.com/ap/vim-buftabline

Esta extensión la llevo usando varios años, se trata de una barra que se añade arriba para tener una lista de los buffers abiertos como si fueran pestañas en un editor de textos moderno.

Hay muchas alternativas a este plugin pero al final siempre vuelvo a este por su sencillez y que funciona perfecto.

Config para este plugin creo que no tengo, debo de estar usando la que viene por defecto.

Update 2023-04-23: He quitado este plugin directamente porque me pasaba lo que en el navegador, abría demasiadas pestañas y me empezaba a agobiar (ahora abro las mismas pero al menos no las veo). Uso un mapeo de FZF que me muestra las pestañas abiertas y además me permite buscar entre ellas mediante fuzzy find.

nvim-treeshitter

https://github.com/nvim-treesitter/nvim-treesitter

Plugin para neovim que lo que hace es parsear el código que estás desarrollando para mejorar el coloreado de la sintaxis y el identado. Este plugin muchas veces es necesario para otros.

En la captura puedes ver cómo el código de la derecha tiene más colores debido al parseo que hace treeshitter del código.

Mi config es esta:

ts_config.setup {
   ensure_installed = {
      "lua",
      "javascript",
      "typescript",
      "html",
      "css",
      "vue",
      "svelte"
   },
   highlight = {
      enable = true,
      use_languagetree = true,
   },
}

vim-coc

https://github.com/neoclide/coc.nvim

Este plugin es el que uso para el autocompletado y la instalación de lenguage servers (un lenguage server es un sistema independiente del editor de textos que permite añadir autocompletado y funciones del lenguaje a cualquier editor).

Es cierto que en neovim ya se puede instalar de forma nativa los language servers (LSP), pero a mi me gusta más usar coc porque funciona también para vim y además es plug & play.

Tras instalar la extensión te tienes que acordar de instalar también los language servers, para ello tienes que ejecutar un comando dentro de vim tal que así:

:CocInstall coc-tsserver

La lista de language servers la puedes encontrar aquí

Mi config es esta:

set updatetime=100
set pumheight=20

inoremap <silent><expr> <TAB>
      \ pumvisible() ? coc#_select_confirm() :
      \ coc#expandableOrJumpable() ?
      \ "\<C-r>=coc#rpc#request('doKeymap', ['snippets-expand-jump',''])\<CR>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()

    function! s:check_back_space() abort
      let col = col('.') - 1
      return !col || getline('.')[col - 1]  =~# '\s'
    endfunction

    let g:coc_snippet_next = '<tab>'

Esto lo que hace es hacer que el plugin se comporte más o menos como el autocompletado del vscode, es decir, según escribes te sale un popup con las opciones, y con la tecla Tab seleccionas la opción que quieres añadir

También tengo estos keybindings para poder navegar mejor por el código:

nmap <leader>gd <Plug>(coc-definition)
nmap <leader>gr <Plug>(coc-references)
nmap <leader>gi <Plug>(coc-implementation)

Es decir, con , g d voy a la definición de la función o de la clase, con , g r voy a todas los sitios en los que use usa la función sobre la que estoy y con , g i a su implementación (lo de la coma es porque tengo definida la tecla coma como tecla leader).

Aparte de esta config, vim-coc también tiene otra que se guarda en un fichero aparte llamado coc-settings.json, que en mi caso es este:

{
  "coc.preferences.hoverTarget": "preview",
  "signature.enable": false,
  "suggest.echodocSupport": true,
  "suggest.enablePreview": false,
  "suggest.floatEnable": false,
  "suggest.triggerCompletionWait": 200,
  "suggest.maxCompleteItemCount": 16,
  "typescript.preferences.quoteStyle": "double",
  "javascript.preferences.quoteStyle": "double",
  "typescript.suggest.completeFunctionCalls": false,
  "javascript.suggest.completeFunctionCalls": false,
  "coc.preferences.formatOnSaveFiletypes": [
    "css",
    "svelte",
    "vue",
    "javascript",
    "typescript"
  ]
}

Tengo desactivado el cuadradito que sale con documentación de la función a autocompletar porque me he dado cuenta de que me ralentiza bastante.

nvim-comment

https://github.com/terrortylor/nvim-comment

Esta extensión básicamente lo que hace es comentar líneas que tengas seleccionadas, en muchos lenguajes de programación.

Mis keybindings son los siguientes:

nmap <Leader>t :CommentToggle<cr>
vmap <Leader>t :CommentToggle<cr>

Lo que hago simplemente es seleccionar el código que quiera comentar y le doy a , t, y lo mismo para descomentar.

NERDTree

https://github.com/preservim/nerdtree

NerdTree también lleva mucho tiempo en mi config. Se trata de un árbol de carpetas y ficheros que se abre a un lado del editor, como en el vscode.

Lo que me mola es que es muy simple, abres el editor y con el enter entras en el fichero que te interesa.

Otra cosa que mola es que desde el propio árbol puedes crear ficheros, moverlos y borrarlos, todo a golpe de teclado.

Mi config es muy simple:

:let g:NERDTreeWinSize=40

Y el keybinding que tengo para abrirlo es el siguiente:

nmap <Leader>nt :NERDTreeToggle<cr>

Aunque tengo también otro para que se abra directamente en el fichero en el que estoy:

map <Leader>nf :NERDTreeFind<CR>

Por cierto, dentro del árbol, con la tecla m activas la opción de crear borrar y modificar ficheros o directorios.

Update 2023-04-23: He cambiado esta extensión por nvim-tree que tiene la misma filosofía pero es más moderna, hecha en lua para neovim.

vim-sneak

https://github.com/justinmk/vim-sneak

Este plugin sirve para moverte más rápido por la pantalla. El funcionamiento es muy simple, le das a la tecla s y escribes dos caracteres a los que te quieras mover, luego en la pantalla te salen letras y puedes escribir una de ellas para saltar rápidamente a esa posición.

Mi config es la siguiente:

let g:sneak#label = 1
map f <Plug>Sneak_f
map F <Plug>Sneak_F

vim-gitgutter

https://github.com/airblade/vim-gitgutter

Este plugin lo que hace es añadir los típicos iconos de otros editores de los cambios de git de los ficheros (los de + para las líneas añadidas y el - para las eliminadas).

Para este no tengo config porque hace tiempo que no lo uso.

Otros plugins que tengo pendiente probar

Nvim DAP

https://github.com/mfussenegger/nvim-dap

Este plugin para neovim al parecer permite hacer debugging de unos cuantos lenguajes de programación desde dentro del propio editor de vim.

Para estas cosas ya existían otros plugins en vim, pero este me ha resultado interesante porque tiene también otro plugin asociado llamado nvim-dap-ui que mejora bastante la interfaz.

Lens.vim

https://github.com/camspiers/lens.vim

Al parecer este plugin lo que hace es redimensionar automáticamente los splits dependiendo de cuál tengas el focus, para así poder ver todo el contenido sin que se corte.

Pone que lo hace de forma inteligente para que se adapte al contenido del split, de tal forma que si ocupa poco el split no sea demasiado grande y viceversa.

nvim-spectre

https://github.com/nvim-pack/nvim-spectre

Plugin que permite reemplazar de forma global en varios ficheros a la vez. Mola porque soporta regex y además puedes especificar glob de ficheros para que se modifiquen solo ciertos tipos de fichero de una ruta.

Sinceramente, hasta ahora usaba la funcionalidad de vscode de buscar y reemplazar porque no encontraba manera de poder hacer esto de forma simple en Vim. Tengo ganas de probarlo a ver si me convence.

sniprun

https://github.com/michaelb/sniprun

Sniprun es una herramienta que permite ejecutar una o varias líenas de código sin salir de Vim. Soporta varios lenguajes y lo que mola es que puedes configurar dónde quieres que te salgal el resultado, si en un popup, al lado de las líneas, etc.

Otros plugins recomendados por la gente

Ya que estoy, voy a publicar también algunos plugins que recomienda la gente y que yo no he probado.

Harpoon

https://github.com/ThePrimeagen/harpoon

Harpoon permite añadir marcas en cualquier parte del código de tal forma que puedes navegar posteriormente entre las marcas sin tener que andar con buffers o buscando los ficheros que has abierto.

Ale

Ale lo que permite es que puedas pasar el linter del código cuando modificas ficheros, lo bueno es que te pinta los errores que saque en el propio código para que puedas moficiarlo.

También permite configurar el fixer para que automáticamente corrija el código si puede hacerlo.

Vim goyo

https://github.com/junegunn/goyo.vim

Goyo es un plugin mítico que lo que hace es quitar elementos de pantalla para que puedas escribir en Vim sin distracciones.

project.nvim

https://github.com/ahmedkhalf/project.nvim

Plugin que premite administrar proyectos, es decir, permite poder cambiar entre proyectos y buscar entre ellos.

Conclusiones

Y esto es un poco la lista de plugins que tengo instalados y recomiendo. Si usas alguno y consideras que es muy interesante mándame un mensaje en Twitter para chekearlo y añadirlo a esta lista.