September Emacs Carnival
Nota: Este post tiene una versión en inglés para participar en el Emacs Carnival. La versión en castellano está tras la inglesa.
Games
This month Emacs Carnival theme is about games. I have some posts about games that you can play inside Emacs, but today I just want to share a little function I did to practice doing the Rubik's cube blindfolded.
In order to do the cube without looking you have to memorize the current scramble of the cube, and this is done by memorizing pairs of letters which correspond to the corners and edges of the cube.
You assign each pair of letter a word, and by making a sentence with the words you memorize the whole scramble of the cube. The hardest part for me is to remember the word assigned to each letter pair, so I did an Emacs Lisp function that generates a random pair so I can practice thinking about the word whose pair is generated.
The pairs are hardcoded because I just wanted to make the function quickly and start using it, and this get the job done for me. So it's a very straightforward code:
(defun cpr/bld () (interactive) "Generate a pair of letters." (print(seq-random-elt '(AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE BF BG BH BI BJ BK BL BM BN BO BP BQ BR BS BT BU BV BW BX BY BZ CA CB CC CD CE CF CG CH CI CJ CK CL CM CN CO CP CQ CR CS CT CU CV CW CX CY CZ DA DB DC DD DE DF DG DH DI DJ DK DL DM DN DO DP DQ DR DS DT DU DV DW DX DY DZ EA EB EC ED EE EF EG EH EI EJ EK EL EM EN EO EP EQ ER ES ET EU EV EW EX EY EZ FA FB FC FD FE FF FG FH FI FJ FK FL FM FN FO FP FQ FR FS FT FU FV FW FX FY FZ GA GB GC GD GE GF GG GH GI GJ GK GL GM GN GO GP GQ GR GS GT GU GV GW GX GY GZ HA HB HC HD HE HF HG HH HI HJ HK HL HM HN HO HP HQ HR HS HT HU HV HW HX HY HZ IA IB IC ID IE IF IG IH II IJ IK IL IM IN IO IP IQ IR IS IT IU IV IW IX IY IZ JA JB JC JD JE JF JG JH JI JJ JK JL JM JN JO JP JQ JR JS JT JU JV JW JX JY JZ KA KB KC KD KE KF KG KH KI KJ KK KL KM KN KO KP KQ KR KS KT KU KV KW KX KY KZ LA LB LC LD LE LF LG LH LI LJ LK LL LM LN LO LP LQ LR LS LT LU LV LW LX LY LZ MA MB MC MD ME MF MG MH MI MJ MK ML MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NB NC ND NE NF NG NH NI NJ NK NL NM NN NO NP NQ NR NS NT NU NV NW NX NY NZ OA OB OC OD OE OF OG OH OI OJ OK OL OM ON OO OP OQ OR OS OT OU OV OW OX OY OZ PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PT PU PV PW PX PY PZ QA QB QC QD QE QF QG QH QI QJ QK QL QM QN QO QP QQ QR QS QT QU QV QW QX QY QZ RA RB RC RD RE RF RG RH RI RJ RK RL RM RN RO RP RQ RR RS RT RU RV RW RX RY RZ SA SB SC SD SE SF SG SH SI SJ SK SL SM SN SO SP SQ SR SS ST SU SV SW SX SY SZ TA TB TC TD TE TF TG TH TI TJ TK TL TM TN TO TP TQ TR TS TT TU TV TW TX TY TZ UA UB UC UD UE UF UG UH UI UJ UK UL UM UN UO UP UQ UR US UT UU UV UW UX UY UZ VA VB VC VD VE VF VG VH VI VJ VK VL VM VN VO VP VQ VR VS VT VU VV VW VX VY VZ WA WB WC WD WE WF WG WH WI WJ WK WL WM WN WO WP WQ WR WS WT WU WV WW WX WY WZ XA XB XC XD XE XF XG XH XI XJ XK XL XM XN XO XP XQ XR XS XT XU XV XW XX XY XZ )) ))
Juegos
El tema del Emacs Carnival de este mes es Juegos. Tengo algunos posts sobre juegos que se pueden jugar en Emacs, pero hoy sólo quiero compartir una pequeña función que me he hecho para practicar el cubo de Rubik a ciegas.
Para hacer el cubo a ciegas, tienes que memorizar el estado actual del cubo, y para ello hay que memorizar pares de letras que están asignados a las esquinas y aristas del cubo.
A cada par de letras se le asocia una palabra y juntando las palabras se crea una historia que te dice el estado actual del cubo. La parte más difícilk para mi es memorizar todas las palabras asociadas a los pares de letras, y por eso he hecho una función en Emacs Lisp que me genera un par aleatorio.
Los pares están hechos a mano en la función, así que el código es trivial.
(defun cpr/bld () (interactive) "Generate a pair of letters." (print(seq-random-elt '(AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE BF BG BH BI BJ BK BL BM BN BO BP BQ BR BS BT BU BV BW BX BY BZ CA CB CC CD CE CF CG CH CI CJ CK CL CM CN CO CP CQ CR CS CT CU CV CW CX CY CZ DA DB DC DD DE DF DG DH DI DJ DK DL DM DN DO DP DQ DR DS DT DU DV DW DX DY DZ EA EB EC ED EE EF EG EH EI EJ EK EL EM EN EO EP EQ ER ES ET EU EV EW EX EY EZ FA FB FC FD FE FF FG FH FI FJ FK FL FM FN FO FP FQ FR FS FT FU FV FW FX FY FZ GA GB GC GD GE GF GG GH GI GJ GK GL GM GN GO GP GQ GR GS GT GU GV GW GX GY GZ HA HB HC HD HE HF HG HH HI HJ HK HL HM HN HO HP HQ HR HS HT HU HV HW HX HY HZ IA IB IC ID IE IF IG IH II IJ IK IL IM IN IO IP IQ IR IS IT IU IV IW IX IY IZ JA JB JC JD JE JF JG JH JI JJ JK JL JM JN JO JP JQ JR JS JT JU JV JW JX JY JZ KA KB KC KD KE KF KG KH KI KJ KK KL KM KN KO KP KQ KR KS KT KU KV KW KX KY KZ LA LB LC LD LE LF LG LH LI LJ LK LL LM LN LO LP LQ LR LS LT LU LV LW LX LY LZ MA MB MC MD ME MF MG MH MI MJ MK ML MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NB NC ND NE NF NG NH NI NJ NK NL NM NN NO NP NQ NR NS NT NU NV NW NX NY NZ OA OB OC OD OE OF OG OH OI OJ OK OL OM ON OO OP OQ OR OS OT OU OV OW OX OY OZ PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PT PU PV PW PX PY PZ QA QB QC QD QE QF QG QH QI QJ QK QL QM QN QO QP QQ QR QS QT QU QV QW QX QY QZ RA RB RC RD RE RF RG RH RI RJ RK RL RM RN RO RP RQ RR RS RT RU RV RW RX RY RZ SA SB SC SD SE SF SG SH SI SJ SK SL SM SN SO SP SQ SR SS ST SU SV SW SX SY SZ TA TB TC TD TE TF TG TH TI TJ TK TL TM TN TO TP TQ TR TS TT TU TV TW TX TY TZ UA UB UC UD UE UF UG UH UI UJ UK UL UM UN UO UP UQ UR US UT UU UV UW UX UY UZ VA VB VC VD VE VF VG VH VI VJ VK VL VM VN VO VP VQ VR VS VT VU VV VW VX VY VZ WA WB WC WD WE WF WG WH WI WJ WK WL WM WN WO WP WQ WR WS WT WU WV WW WX WY WZ XA XB XC XD XE XF XG XH XI XJ XK XL XM XN XO XP XQ XR XS XT XU XV XW XX XY XZ )) ))
Org Social
He estado probando Org Social y a la hora de cargar mis datos tenía un problema, ya que parte de la información que se carga es privada y no lo puedo poner en mi archivo público de configuración de Emacs.
Sin embargo sí que tengo esa información en mi nube personal en Nextcloud, y por tanto en una carpeta de mi ordenador. Por eso, y para seguir practicando un poco Elisp, me propuse hacer una función que lea el fichero donde tengo la configuración y evalúe sólo el código que hay dentro.
Como el fichero es un archivo de Denote, lo único que tengo que hacer es ignorar la cabezera del archivo y evaluar el resto.
(let ((archivo "~/Nextcloud2/denote/20260107T165320--org-social__emacs.org")) (if (file-exists-p archivo) (with-temp-file "/tmp/org-social-data.el" (insert-file-contents archivo nil 114 nil nil) (eval-buffer nil nil)) (message "El archivo org-social no existe")) )
Primero asigno el archivo a una variable con un let, luego compruebo si existe el archivo y en caso contrario muestra un mensaje de error. Si el archivo existe simplemente se copian los contenidos del archivo en un archivo temporal y luego se evalúa.
Así puedo tener toda mi configuración de Org Social cargada al inicio de Emacs sin exponer ningún dato privado.
Teclados divididos
Hace un tiempo descubrí que había teclados que estaban "rotos" en dos mitades. Al principio no me fijé mucho en ellos porque parecía una cuestión de ergonomía y yo no paso tanto tiempo escribiendo como para necesitar un teclado mejor, además suelo usar portátiles y ni siquiera me había comprado nunca un teclado mecánico.
Pero tras ver varios vídeos de Protesilaos y gente a mi alrededor que usaba teclados mecánicos decidí probar a usar un teclado mecánico 60%. Tras varios meses usándolo habiendo remapeado algunas teclas (por software, porque el teclado no era programable), el siguiente paso natural era un teclado programable con QMK, así que decidí comprarme el más barato que había, el Silakka54.
Sólo llevo un día y medio usándolo, y todavía tengo que adaptarme y pensar cómo voy a refinar la distribución de teclas pero me está gustando mucho por ahora.
El cambio más importante para mi ha sido poder reprogramar cada tecla con lo que yo quiera, incluso macros si me hacen falta. El software QMK permite total libertad. Se suele usar un modelo de capas, en las que cada tecla del teclado hace algo diferente, y se cambia entre las distintas capas con teclas especiales, o manteniendo pulsada alguna tecla o combinación de ellas.
Además, aunque en lo que más me había fijado al mirar teclados divididos es que prácticamente todos son programables, la mayoría de estos teclados suelen ser orto lineares, es decir, están organizados en una especie de matriz cuadrada en lugar de tener las filas desplazadas como los teclados tradicionales.
Sorprendentemente para mi el hecho de que el teclado esté dividido no me ha supuesto ningún problema de adaptación, pero la distribución orto linear sí que me está resultando difícil de aprender. Por otro lado está el hecho de que la barra espaciadora desaparezca y en su lugar los dedos pulgares tengan 3 teclas cada uno, lo cual obviamente requiere de una adaptación.
Por último, dado que es mi segundo teclado mecánico, todavía no tengo muy clara la diferencia entre los distintos tipos de switches y keycaps, pero de momento me va bien con los switches rojos y las keycaps por defecto que traía el teclado al comprarlo en Aliexpress.
Todavía no sé si conseguiré adaptarme y usaré un teclado dividido en el futuro, pero de momento está resultando una experiencia interesante y muy divertida.
Limpiando Elfeed
Continuando mi camino en el aprendizaje de Emacs Lisp, se me ocurrió hacer una función que marcara como leídos todas las entradas de mi feed de Elfeed que provinieran de una fuente específica.
En concreto, el feed de Richard Stallman tiene un volumen muchísimo mayor que el resto de feeds que sigo, así que quería poder marcar como leídas todas las noticias de RMS sin tener que ir una a una, ya que hay centenares.
Una opción sería usar una macro de teclado, pero para mejorar mi Elisp
decidí pensar en una manera de hacerlo con código. Como me sonaba que
la función re-search-forward hacía justo lo que yo quería, la
combiné con la función que marca un feed como leído (gracias a C-h k
m dentro de Elfeed conseguí saber el nombre de la función) y con dos
líneas ya tenía todo listo.
(while (re-search-forward "Richard") (elfeed-search-untag-all-unread))
Ejecutando el código con M-: solucioné el problema instantáneamente.
May Emacs Carnival
May I recommend… / En mayo recomiendo…
Nota: Este post tiene una versión en inglés para participar en el Emacs Carnival. La versión en castellano está tras la inglesa.
May I recommend
For this month Emacs Carnival I've thought of two types of recommendations. First some amusements inside Emacs, and then some things I liked when skimming through the Emacs 31 NEWS file.
- Amusements
I think nowadays some extra features of Emacs like the games are considered "bloat", but for me these types of things are the ones that make me happy.
I recommend to evaluate
(info "(emacs) Amusements")inside Emacs and take a look at the amusements section. It has a lot of games to play with. I have yet to find out how to finish the text-adventure game Dunnet. There is also the classic Conway's Game of Life, pong, snake…And of course we have
M-x tetris, which being inside Emacs is deeply customizable. In fact, I even implemented a very primitive way of holding pieces the way the modern version of Tetris does. - Emacs 31 NEWS
First of all, I recommend using
C-h nto see the latest news for your Emacs version. It's really incredible the vast amount of improvements each new release brings. I am not a very advanced Emacs user but still I always find a couple of things that help me improve my workflow.In this occasion I have found
(setq elisp-fontify-semantically t), which analyses your Elisp code and highlight some definitions and variables. For example, I can write in the scratch buffer the name of some function of mine, and it would let me see the definition by simply hovering the mouse over the name.
En mayo recomiendo
Para el Emacs Carnival de este mes he pensado en dos tipos de recomendaciones. Primero algunas para pasatiempos dentro de Emacs y luego otras relacionadas con el archivo NEWS de Emacs 31.
- Pasatiempos
Hoy en día quizás se considera un desperdicio de espacio los juegos que trae Emacs integrados, pero a mi me encantan estos detalles que se incluían antiguamente en los programas.
Para empezar, recomiendo evaluar
(info "(emacs) Amusements")dentro de Emacs para leer el manual de los pasatiempos. Ahí vienen detallados todos los juegos que trae Emacs, que son un montón. Todavía no he conseguido pasarme la aventura gráfica Dunnet. Además está el clásico Juego de la vida de Conway, el pong, el snake etc.Y por supuesto tenemos el
M-x tetris, que como todo lo que está dentro de Emacs es altamente personalizable. Yo incluso implementé hace unos años el modo para guardar piezas típico de los tetrises modernos. - Noticias de Emacs 31
Para empezar, recomiendo usar
C-h npara ver las últimas noticias para tu versión de Emacs. Es apabullante la cantidad de mejores que introducen en cada versión. Yo no soy un usuario demasiado avanzado de Emacs, pero aún así siempre encuentro un par de cosas que me ayudan a mejorar mi flujo de trabajo.En esta ocasión he encontrado
(setq elisp-fontify-semantically t), que analiza el código de Elisp que escribes y te resalta funciones o variables. Además, pasando el ratón por encima puedes ver la definición de tus propias funciones, y te dice dónde están definidas por si no te acuerdas.
