Buscadores personalizados con Mini.Pick
Tags: nvim, mini, lua, neovim
Published: 2024-05-18 00:13:48

Mini.Pick, parte del paquete de plugins [Mini.Nvim](https://github.com/echasnovski/mini.nvim) desarrollados por el gran [Evgeni Chasnovski](https://github.com/echasnovski), es una gran alternativa a Telescope. Con este módulo, podemos buscar rápidamente entre nuestros archivos, buffers abiertos, símbolos del servidor del lenguaje de nuestro proyecto, etc.

El plugin incluye un conjunto de buscadores por defecto, a los cuales también podemos agregar una gran lista adicional usando el módulo Mini.Extra. Sin embargo, también podemos crear nuestros propios buscadores y su configuración.

Aquí tenemos dos ejemplos.

## Selector de temas (colorschemes)
Este es una modificación al selector de temas de colores desarrollado por el proyecto [MVIM](https://gitlab.com/domsch1988/mvim/-/blob/main/lua/keybinds.lua?ref_type=heads), una distribución de Neovim basada en los módulos Mini.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fmcrdedpxmakj77pbqmk.png)

Este selector nos permite rápidamente buscar entre los temas de colores que tenemos instalados, mostrar un previo del tema usando la tecla `<Tab>` y al seleccionarlos, genera una transición entre el tema anterior y el nuevo haciendo uso de la función `Colorscheme` provista por `Mini.Colors`. El código es el siguiente:

```lua
require("mini.pick").setup()

-- Define la ventana del selector centrada en la pantalla
local win_config = function()
  local height = math.floor(0.3 * vim.o.lines)
  local width = math.floor(0.3 * vim.o.columns)
  return {
    anchor = "NW",
    height = height,
    width = width,
    row = math.floor(0.5 * (vim.o.lines - height)),
    col = math.floor(0.5 * (vim.o.columns - width)),
  }
end

-- MiniPick Colorscheme Picker
local set_colorscheme = function(name)
  pcall(function()
    vim.cmd("Colorscheme " .. name) -- Usa mini.colors Colorscheme para animar transición
  end)
end
local pick_colorscheme = function()
  local init_scheme = vim.g.colors_name
  local new_scheme = MiniPick.start({
    source = {
      name = "Colorscheme", 
      items = vim.fn.getcompletion("", "color"),
      choose = set_colorscheme,
    },
    mappings = {
      move_down = "<C-n>",
      move_start = "<C-g>",
      move_up = "<C-p>",
      preview = {
        char = "<Tab>",
        func = function()
          local item = MiniPick.get_picker_matches()
          if item and item.current then
            pcall(function()
              vim.cmd("colorscheme " .. item.current)
            end)
          end
        end,
      },
    },
    window = { config = win_config },
  })
  if new_scheme == nil then
    set_colorscheme(init_scheme)
  end
end

```

## Sugerencias otográficas

También podemos usar Mini.Pick para remplazar las sugerencias ortográficas, de forma que se posicionen bajo el cursor, como en un procesador de texto.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eyv97ixu20clpc1aitm6.png)

Aquí el código:

```lua
local spellsuggest = function()
  local local_opts = { n_suggestions = 5 } -- Define el número de sugerencias a mostrar
  local opts = {
    mappings = {
      caret_left = "<Left>",
      caret_right = "<Right>",

      choose = "<CR>",

      delete_char = "<BS>",
      delete_char_right = "<Del>",
      delete_left = "<C-u>",
      delete_word = "<C-w>",

      move_down = "<C-n>",
      move_start = "<C-g>",
      move_up = "<C-p>",

      scroll_down = "<C-f>",
      scroll_left = "<C-h>",
      scroll_right = "<C-l>",
      scroll_up = "<C-b>",

      stop = "<Esc>",
    },
    window = {
      config = {
        relative = "cursor",
        anchor = "NW",
        row = 1,
        col = 0,
        width = 40,
        height = 5,
      },
    },
  }
  MiniExtra.pickers.spellsuggest(local_opts, opts)
end

-- Remplaza el atajo de teclado "z="
vim.keymap.set("n", "z=", spellsuggest, { desc = "Abre las sugerencias ortográficas" })



```