SGCG

…esto no es un subtítulo…

Ir a: contenido categorías calendario archivo suscripción

Volver arriba

Emacs Lisp en casos prácticos (5): gestor de temporizadores (1)

2015-07-19

GNU Emacs es un editor de textos potentísimo. Por debajo, es un intérprete de Emacs Lisp, un lenguaje de programación de la familia de Lisp. En esta serie de artículos vamos a mostrar algunas formas de adaptar Emacs a nuestras necesidades con algunos casos prácticos.

En el artículo de hoy y el artículo de mañana, crearemos un modo mayor que nos servirá para gestionar temporizadores, algo que es útil si vamos a desarrollar algún código que los use.

El problema

Los temporizadores ofrecen una manera de ejecutar funciones cuando transcurre cierto tiempo, quizá de forma periódica. La última versión publicada de GNU Emacs en el momento de escribir estas líneas dispone de gestores para cosas como búferes y subprocesos, pero no para temporizadores. Estaría bien tener una interfaz similar a la de list-buffers para hacer algunas gestiones mínimas sobre los temporizadores que está manejando Emacs. Como ejemplo y por no complicarnos mucho, vamos a ofrecer dos opciones de gestión:

Anatomía simplificada de un temporizador

Los temporizadores en Emacs son estructuras del tipo timer con varios campos. Uno de ellos, repeat-delay (accesible mediante timer--repeat-delay) es el tiempo de repetición expresado en segundos. Otro campo que podría interesarnos es time (accesible mediante timer--time): el momento de la próxima ejecución del temporizador; ahora bien, con el fin de mantener cierta sencillez, ignoraremos este campo. Lo que sí vamos a mostrar es el campo function (accesible mediante timer--function): la función que se ejecuta cuando el temporizador salta.

Si tenemos un temporizador llamado my-timer, accedemos a su tiempo de repetición mediante
(timer--repeat-time my-timer)
Algo similar puede hacerse para acceder a otros campos; por ejemplo, así podemos ver la función a la que llama el temporizador al saltar:
(timer--function my-timer)

Plan de acción: creación de un modo derivado de tabulated-list-mode

Emacs tiene varias funciones para mostrar tablas con listas de cosas abiertas: la lista de búferes abiertos (que se abre con la función interactiva list-buffers, C-x C-b) y la lista de subprocesos (que se abre con la función interactiva list-processes) son dos de ellas. Estas tablas se muestran con modos mayores derivados de tabulated-list-mode. Nuestra lista de temporizadores también puede aprovechar la funcionalidad ofrecida por tabulated-list-mode.

Lo primero que tenemos que hacer es requerir tabulated-list:

(require 'tabulated-list)

Para definir un modo mayor derivado de tabulated-list-mode, usamos define-derived-mode, que se encarga de hacer todo el trabajo rutinario que habría que hacer siempre para definir de un modo mayor derivado de otro y deja en nuestras manos el trabajo despecífico del modo. En nuestro caso, seguimos las instrucciones que aparecen en la documentación de tabulated-list-mode:

Antes de llegar al último paso, establecemos cómo ordenar la tabla (con la variable tabulated-list-sort-key) y asignamos las combinaciones de teclas (con local-set-key) para poder manejar el menú de temporizadores con el teclado. La definición del modo queda así:

(define-derived-mode timer-menu-mode tabulated-list-mode "Timer Menu" "Major mode for listing the timers managed by Emacs." (setq tabulated-list-format [("" 1 t) ("Repeat delay" 16 t) ("Function" 40 t)]) (setq tabulated-list-sort-key '("Function")) (local-set-key (kbd "\C-k") 'timer-menu-mark-for-deletion) (local-set-key (kbd "k") 'timer-menu-mark-for-deletion) (local-set-key (kbd "\C-d") 'timer-menu-mark-for-deletion) (local-set-key (kbd "d") 'timer-menu-mark-for-deletion) (local-set-key (kbd "u") 'timer-menu-unmark) (local-set-key (kbd "x") 'timer-menu-execute) (local-set-key (kbd "t") 'timer-menu-set-repeat-delay) (add-hook 'tabulated-list-revert-hook 'list-timers--refresh nil t) (tabulated-list-init-header))

Analicemos lo que este código hace:

Mañana veremos qué hacen las funciones asignadas a las combinaciones de teclas y la función que actualiza las entradas de la tabla.


Categorías: Informática

Permalink: http://sgcg.es/articulos/2015/07/19/emacs-lisp-en-casos-practicos-5-gestor-de-temporizadores-1/