Blog sobre software libre

Posts tagged "elisp":

09 sep 2023

Configuración de Emacs con macros

Este verano tuve un par de sesiones de "coaching" con Protesilaos (https://www.protesilaos.com/). Aprendí varias cosas sobre elisp, y además creé mi propia macro para configurar Emacs.

El problema que estaba teniendo es que siempre que intentaba instalar Emacs desde cero en otro ordenador, la gestión de paquetes me daba problemas, y tenía que reiniciar Emacs varias veces para completar la instalación.

Mi objetivo es que con mi archivo de configuración pueda coger un ordenador cualquiera, iniciar Emacs y tenerlo todo configurado y listo, como si estuviera en mi propio ordenador (excepto en lo referente a archivos personales, claro).

Así que la solución a la que llegué con Prot fue hacerme mi propia macro, para gestionar así todo lo que tenga que ver con los paquetes, y saber qué está pasando en cada momento. La macro a la que he llegado es:

(defmacro my-package-install (package &rest body)
  "Installs PACKAGE.
If the package cannot be installed, remind the user to add the package-archives. Then, the user can configure the PACKAGE."
  `(progn
     ;;First stage; package installation
     (unless (package-installed-p ,package)
       (unless package-archive-contents
  (package-refresh-contents))
       (or (ignore-errors (package-install ,package))
    (message "Did you add MELPA to the `package-archives'")))
     ;;Second stage; package configuration
     (require ,package)
     ,@body
     )
  )

Básicamente lo que hace es comprobar si un paquete está instalado, y si lo está, lo configura con los argumentos que se le pasen. Además para evitar el error que tenía anteriormente, la macro te da una posible solución al error.

Con todo esto listo, ahora sólo tengo que implementar la macro con los paquetes de mi configuración. Una vez lo tenga todo hecho, debería poder usar Emacs en cualquier ordenador con sólo pulsar un botón.

Tags: emacs, macros, elisp
12 ene 2023

Creando un modo menor en Emacs

Aprovechando la versatilidad de Emacs he decidido crear un "modo menor" para poder jugar de forma más cómoda al tetris dentro del propio Emacs. Seguramente haya formas menos complicadas de hacer lo mismo, pero haciendo esto se aprende un poco mejor cómo funcionan los modos menores.

He adaptado el código de System Crafters (https://systemcrafters.cc/learning-emacs-lisp/creating-minor-modes), y he creado sendas funciones para asignar el movimiento de las piezas del tetris a las teclas "j" y "k". El modo se llama "tetritecla-basic-mode" y básicamente sólo sirve para añadir esos atajos de teclas, junto a "k" para rotar piezas y "h" para bajarlas.

Si ahora activo el modo "tetritecla-basic-mode" con un hook al iniciar el programa "tetris", ya obtengo las nuevas teclas de forma automática cada vez que quiera jugar. ¡Fácil y cómodo!

A continuación dejo el código:

(make-variable-buffer-local
  (defvar tetritecla-basic-mode nil
    "Alterna tetritecla-basic-mode."))

(defvar tetritecla-basic-mode-map (make-sparse-keymap)
  "El keymap para tetritecla-basic-mode")

;; Definición de las teclas para jugar.
(define-key tetritecla-basic-mode-map (kbd "j")
  (lambda ()
    (interactive)
    (tetris-move-left)))

(define-key tetritecla-basic-mode-map (kbd "k")
  (lambda ()
    (interactive)
    (tetris-rotate-prev)))     

(define-key tetritecla-basic-mode-map (kbd "h")
  (lambda ()
    (interactive)
    (tetris-move-down)))

(define-key tetritecla-basic-mode-map (kbd "l")
  (lambda ()
    (interactive)
    (tetris-move-right)))

(add-to-list 'minor-mode-alist '(tetritecla-basic-mode " tetritecla"))
(add-to-list 'minor-mode-map-alist (cons 'tetritecla-basic-mode tetritecla-basic-mode-map))

(defun tetritecla-basic-mode (&optional ARG)
  (interactive (list 'toggle))
  (setq tetritecla-basic-mode
        (if (eq ARG 'toggle)
            (not tetritecla-basic-mode)
          (> ARG 0)))

  ;; Aviso de activación de modo
  (if tetritecla-basic-mode
      (message "tetritecla-basic-mode activado")
    (message "tetritecla-basic-mode desactivado")))
Tags: emacs, elisp
Other posts
Other posts
Creative Commons License
www.finaprosadigital.com by Carlos Pajuelo is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.