Verano de Emacs: modal o no modal
Modal o no modal, esa es la cuestión. Aunque Emacs dispone de "modos", lo cierto es que cae dentro de los editores de texto no modales. ¿Cuál es la diferencia y por qué es importante? Un editor modal es aquel en el que lo que puedes hacer queda restringido al modo en concreto donde estés. El editor modal más famoso es Vi, donde tenemos un modo para movernos y hacer ciertas ediciones, un modo de inserción donde escribimos, un modo visual para seleccionar regiones de texto,... Es habitual mientras se usa dentro de un mismo fichero ir cambiando el modo
Por resumir, para editar un fichero, lo abres, vas hasta el sitio que quieras ir, cambias de modo, escribes, cambias de modo, buscas la siguiente zona a modificar, aplicas ediciones con una sola letra, cambias de modo, escribes, ...
En Emacs sin embargo los atajos de teclado principales están disponibles siempre, y casi siempre son combinaciones de varias teclas usando al menos un modificador. Los modos, tanto mayores como menores, solamente añaden funcionalidad concreta y son mayormente fijos para cada fichero, sin que los vayamos cambiando.
Si se mira el mundo del software interactivo se podría pensar que el software no modal es bastante popular. Los navegadores webs o las suites ofimáticas entran dentro de la definición de no modal. Pero con el software más creativo tipo Photoshop o AutoCAD, la cosa ya no es tan clara y podríamos pensar que estos programas tienen diversos modos, a los que se accede a través de las herramientas.
El caso es que Emacs no es modal pero esto tampoco convence a mucha gente, así que hay paquetes que convierten a Emacs en un editor modal. Puede haber varios motivos para así quererlo, desde compatiblidad con editores modales, comodidad o motivos de salud. Ciertas personas reportan que el uso excesivo de modificadores en Emacs (Ctrl y Alt principalmente), presentes en todos los atajos, generan problemas en las articulaciones. Y es que estas teclas ciertamente están en posiciones alejadas y de acceso no tan cómodo como las letras.
Para los primeros existen paquetes como Evil o como Hel, que emulan Vim y Helix respectivamente. Existen otros paquetes que agregan modalidad a Emacs sin inspirarse fuera, como Meow o Boon. En su momento probé Meow y no estaba tan mal, pero tampoco le vi demasiado la gracia.
God Mode
Dentro de las opciones de añadir modalidad, God Mode para mí destaca por su simpleza. Es un modo al que se accede con una tecla, normalmente Escape y mientras estamos en él, todas las teclas comienzan prefijadas con Ctrl. Es decir para hacer C-x C-s (save-file), solo debemos escribir "xs".
Las combinaciones de teclas que no necesitan modificador pulsado se deben prefijar con un espacio. Así, C-x b, sería "x b". El tema es que si vamos a usar mucho una combinación que requiera espacio según las reglas de God Mode, puede sernos conveniente crear un nuevo atajo que llame por debajo a la misma función de Emacs pero que sí use Ctrl para que God Mode lo inserte por nosotros. Para usar Alt, se usa la letra g. Efectivamente, C-g no puede marcarse con God Mode, pero esto es intencional. C-g se tiene que seguir haciento con Ctrl y la letra g.
Esto resalta una de las características de God Mode y es que apenas modifica el comportamiento de Emacs. Todos los atajos que funcionan en Emacs, funcionan con God Mode, solo que podrían hacerse con menos pulsaciones. Y también toda la memoria de atajos de Emacs sigue sirviendo.
Cuando he usado God Mode he usado esta configuración:
;; God mode
(defun my-god-mode-update-cursor-type ()
(setq cursor-type (if (or god-local-mode buffer-read-only) 'box 'bar)))
(use-package god-mode
:ensure t
:config
(global-set-key (kbd "") #'god-local-mode)
(setq god-exempt-major-modes nil)
(setq god-exempt-predicates nil)
(add-hook 'post-command-hook #'my-god-mode-update-cursor-type)
(define-key god-local-mode-map (kbd "[") #'backward-paragraph)
(define-key god-local-mode-map (kbd "]") #'forward-paragraph)
(define-key god-local-mode-map (kbd ".") #'repeat))
(global-set-key (kbd "C-x C-1") #'delete-other-windows)
(global-set-key (kbd "C-x C-2") #'vsplit-last-buffer)
(global-set-key (kbd "C-x C-3") #'hsplit-last-buffer)
(global-set-key (kbd "C-x C-0") #'delete-window)
(global-set-key (kbd "C-x C-5 C-0") #'delete-frame)
(global-set-key (kbd "C-x C-5 C-1") #'delete-other-frames)
(global-set-key (kbd "C-x C-5 C-2") #'make-frame-command)
Una función para según el estilo del cursor saber en qué modo estamos, Escape para entrar y salir del modo, algunos comandos para God Mode y algunos atajos de teclado nuevos usando Ctrl para evitar tener que introducir espacios.
Devil Mode
Pero y si nos gusta la no modalidad de Emacs. Personalmente soy bastante fan de la no modalidad, el poder llamar cualquier comando sin saber si estoy en uno u otro modo. El problema (o no, ya digo que esto depende de cada uno), es el uso excesivo de modificadores. Modificadores que se sitúan en zonas malas del teclado y que tenemos que pulsar a la vez junto con otra (a veces dos) teclas. Devil Mode actúa de forma diferente. Escoge una tecla de fácil acceso, por defecto la coma y la convierte en el iniciador de la secuencia.
La secuencia empezada por la coma espera a una tecla, pero ya ha introducido un Ctrl "pegajoso" o sticky. Una de las características de Devil Mode es que nunca hay que pulsar dos teclas a la vez, la secuencia se puede ir construyendo tecla a tecla. Cada coma adicional es un Ctrl adicional esperando una letra. Así para escribir C-x C-s (save file), es tan sencillo como coma, x, coma, s. Y C-x b es coma, x, b. Existen algunas excepciones. Coma seguido de espacio es el uso más común de la coma, y no hace nada, solo inserta coma y espacio. Lo mismo con coma y Enter. Coma y coma inserta coma también. Coma y m, cambia el modificador de Ctrl a Alt y coma con dos m, es Ctrl y Alt pulsado a la vez.
Una característica extra de Devil Mode es que admite ciertas repeticiones en los comandos sin tener que usar la coma. Por ejemplo en los movimientos, coma p p p n n, es el equivalente a C-p C-p C-p C-n C-n. Esto por defecto solo está activado en algunos comandos concretos como estos que he mencionado y que son comandos que sin Devil se harían rápidamente y sin levantar el dedo de Ctrl.
Del mismo modo que God Mode, en Devil no hay problema en introducir los atajos grandes normales. Todos ellos siguen funcionando.
En general Devil me gusta más porque precisamente preserva la no modalidad de Emacs. Lo único que cambia es que algunos comandos se alargan secuencialmente pero nunca tendremos que pulsar más de una tecla a la vez.
La configuración de Devil, en mi caso, es bastante simple.
(use-package devil
:ensure t
:config
(global-devil-mode)
(devil-set-key (kbd ","))
(global-set-key (kbd "C-,") 'global-devil-mode))