Emacs y Go

Emacs y Go
Photo by Markus Spiske / Unsplash

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  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
	}
}