Abrir la documentación de Terraform desde NeoVim

Como ya he comentado varias veces, trato de usar NeoVim como mi editor de texto principal cuando estoy trabajando.

Como en mi día a día, trabajo con Terraform, me gusta tener la documentación de los resources y data sources lo más a mano posible (algo que hace el plugin de Terraform para todos los productos IntelliJ) para poder consultarlos frecuentemente.

Por desgracia no he encontrado un plugin para NeoVim que me permita hacer esto de forma sencilla, así que he decidido hacerlo yo mismo. En mi primer lugar pensé en mirar como hacerlo con terraform-ls, el LSP oficial de Terraform, pero enseguida lo descarté, ya que el código era bastante complejo y tenía cientos de issues abiertos.

Una vez descartada esta opción, recordé que estaba usando un plugin para NeoVim que permitía abrir links de formar sencilla. El plugin se llama URL Open y por defecto habilita la apertura de URLs (http, hhtps, ftp, etc.) en el navegador colocando el cursor sobre una URL y presionando las teclas gx.

Mirando su documentación descubrí que era posible configurarlo para detectar ciertos patrones en los ficheros para todo aquello que no fueran URLs al uso utilizando una propiedad llamada extra_patterns.

Solución

Mirando el código existente en él plugin, es fácil encontrar como esta configurado para detectar otro tipo de urls no convencionales (npm, Docker, Gemfile, etc.).

Así que ya tenemos todos los ingredientes para intentarlo. Vamos a extender los patterns por defecto de plugin para poder leer la documentación de AWS, para ello necesitamos:

  • Detectar líneas que contengan el patrón data "aws_.
  • Las URLs para estas líneas tendrán el prefijo:
    • https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/.
  • Solo se detectarán en ficheros con extensión .tf de Terraform.

La configuración final quedaría así:

return {
    "sontungexpt/url-open",
    branch = "main",
    event = "VeryLazy",
    cmd = "URLOpenUnderCursor",
    config = function()
        local status_ok, url_open = pcall(require, "url-open")
        if not status_ok then
            return
        end
        url_open.setup ({
          extra_patterns = {
            {
              pattern = "data [\"]aws_([^%s]*)[\"]",
              prefix = "https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/",
              file_patterns = { ".*.tf" },
            }
          }
      })
    end,
}

Si ahora nos vamos a un fichero Terraform que contenga un resource dentro, colocamos el cursor sobre el mismo y pulsamos gx se debería abrir la documentación del recurso.

IAM Policy

Resources

De igual forma podemos hacer lo mismo con los resources de Terraform. Para ello, solo tenemos conseguir los siguientes puntos:

  • Detectar líneas que contengan el patrón resource "aws_.
  • Las URLs para estas líneas tendrán el prefijo:
    • https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/.
  • Solo se detectarán en ficheros con extensión .tf de Terraform.

La configuración final quedaría así:

    {
      pattern = "resource [\"]aws_([^%s]*)[\"]",
      prefix = "https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/",
      file_patterns = { ".*.tf" },
    }

Si ahora nos vamos a un fichero Terraform que contenga un resource dentro, colocamos el cursor sobre el mismo y pulsamos gx se debería abrir la documentación del recurso.

IAM Policy Attachment

Os dejo por aquí mi configuración para algún provider más como DataDog.