Emacs y Go

Go o Golang es un lenguaje de programación relativamente nuevo creado para ser simple y eficiente. Usado para escribir sistemas backend, tiene un conjunto avanzado de características y se enfoca en la velocidad y efectividad del programador. Go ha ganado mucha popularidad como un lenguaje de programación para crear aplicaciones web y sistemas para la nube, como PaaS, SaaS o IaaS.

Emacs, por otra parte, es un editor de texto muy reconocido, muy potente, pero también muy complicado de configurar. Algo tiene, que una vez que empiezas a usarlo, ya no lo puedes dejar.

El modo go-mode tiene un montón de funciones que facilitan programar en Go y además, la verdad, a veces el Copilot estorba un poco, sobre todo cuando los programas son sencillos.

Esta es mi configuración de Emacs para Go. Se suponía que todo iba dentro del use-package go-mode pero no funcionaba, así que el fly-check y el servidor lsp van fuera de la configuración principal.

(use-package flycheck
  :ensure t)

(use-package go-mode
  :ensure t
  :init
  (column-number-mode 1)
  (global-hl-line-mode 1)
  (global-whitespace-mode 1)
  (setq
   whitespace-style
   '(face
     trailing
     lines-tail
     space-before-tab
     space-after-tab
     newline
     indentation
     empty)
   whitespace-line-column 80
   company-idle-delay 0
   company-minimum-prefix-length 1)
  :mode "\\(\\.go\\|go.mod\\|go.sum\\)\\'"
  :hook (
         (go-mode . (lambda() (setq tab-width 4)))
         (before-save . gofmt-before-save)))

(require 'lsp-mode)
(add-hook 'go-mode-hook #'lsp-deferred)

;; Go - lsp-mode
;; Set up before-save hooks to format buffer and add/delete imports.
(defun lsp-go-install-save-hooks ()
  (add-hook 'before-save-hook #'lsp-format-buffer t t)
  (add-hook 'before-save-hook #'lsp-organize-imports t t))
(add-hook 'go-mode-hook #'lsp-go-install-save-hooks)

;; Start LSP Mode and YASnippet mode
(add-hook 'go-mode-hook #'lsp-deferred)
(add-hook 'go-mode-hook #'yas-minor-mode)

Y se ve bien, la verdad:

Captura de pantalla de go-mode en Emacs

El programa es el algoritmo Bubble Sort, que me quedó muy padre.

package main

import "fmt"

func main() {
    var (
        numbers []int
        cap     int = 10
    )

    fmt.Printf("=== Write 10 integers ===\n")
    for i := 0; i < cap; i++ {
        var number int
        fmt.Printf("Integer #%d: ", i+1)
        fmt.Scanf("%d", &number)
        numbers = append(numbers, number)
    }

    fmt.Printf("Unordered slice\n")
    fmt.Printf("%v\n", numbers)

    bubbleSort(numbers)

    fmt.Printf("Ordered Slice\n")
    fmt.Printf("%v\n", numbers)
}

func swap(slice []int, index int) bool {
    slice[index+1], slice[index] = slice[index], slice[index+1]
    return true
}

func bubbleSort(data []int) {
    var (
        n      = len(data)
        sorted = false
    )

    for !sorted {
        swapped := false
        for i := 0; i < n-1; i++ {
            if data[i] > data[i+1] {
                swapped = swap(data, i)
            }
        }
        if !swapped {
            sorted = true
        }
        n = n - 1
    }
}

Comentarios