Daniel Rodríguez
{ "tags" : [ "english" , "linux" , "opensource" , "technology" , "tmux" , "vim" , "xmacro" ] , "title" : "Tasks Automation with XMacro" }

So it's time to make a more technical post.

If you're looking for tmux macros and you use Xorg, you will need this tip.


Install xmacro, record some commonly made actions, edit the recorded file to polish times and actions, make a script to reproduce them again and voilà, macros for any window manager using Xorg, easy to use from vim or tmux.

The story

I've been playing with linux for many years now. Like any typical user, I started with user friendly distributions, first Mandriva, then Ubuntu, then Mandriva again, then OpenSUSE, CentOS, Fedora, Arch Linux and now Manjaro, which is built on top of Arch and has a ready to use Net Edition. Just what I was looking for (check it out here).

So, while you're in Linux and you get all excited about being able to be very exquisit with which applications you are going to use (in matter of performance and low consumption), you'll end up using the terminal a lot. That's what I did, first using alsamixer to control the sound, then nano to edit files, then vim, as well as music players like mocp, IRC clients like irssi, email clients like mutt, then you might begin using xterm instead of any other fancy gtk terms, also you might switch from Gnome to OpenBox, and later to DWM, which could end up being your favorite one, because nothing is going to be so fast and simple. Then maybe you're too lazy to set up a background image each time you're setting up a machine, or like me, you get so uncomfortable selecting an image that you prefer to have none, and finally you end just using conky to give it a fancy style, but keeping things minimal, etc etc... well, the point is that you start to use the terminal a lot. Fine.

My current desktop.

Now, every time you open your computer to start working with a project, you open several terminals, maybe using TMUX, in some of them you run several applications, like databases, web servers, or your editor; you load your vim sessions to open all your needed files and then you start working, you do this some days and you feel fine, but eventually you begin to think that maybe you could be doing that automatically, because it's tedious to be opening the same stuff again and again and again and again...

For many years, I've encountered persons that asked me if I knew a way of scripting tmux to open several terminals and load your programs, or if there was a way of making macros with tmux, but I was unable to answer properly, I said: well, yes, in principle you can start tmux's server and tell it to load several applications, but it's not an automatic process, I mean, you can't just record your actions to play them again, you have to make the script and change it as you want new things to happen. I never explored the possibilities of that approach, but it looks so cumbersome that everyone I know ended up just doing things by hand and that's it.

Until now, ladies and gentlemen I present you: xmacro.


For Arch Linux users, xmacro is available in the AUR:

Essentially, xmacro records your pressed keys and saves them to a file. To run it, see the line below:

xmacrorec2 > myrecording

Once you call it, first you'll have to pick a quit-key (<Esc> is fine), then whatever you do will be recorded: moving your mouse, clicking, pressing any key, etc. Do some stuff, then press the quit-key, and you'll be able to replicate that behavior with the following command:

xmacroplay "$DISPLAY" < myrecording

Let's check myrecording file to see what we've got. As you'll see below, it looks very much like the output of xbindkeys -mk (after you click some keys there):

MotionNotify 949 749
KeyStrPress Alt_L
Delay 147
KeyStrPress 2
KeyStrRelease 2
KeyStrRelease Alt_L
Delay 783
KeyStrPress Alt_L
Delay 110
KeyStrPress 1
KeyStrRelease 1
KeyStrRelease Alt_L
Delay 2351
MotionNotify 918 536
ButtonPress 1
Delay 100
ButtonRelease 1
Delay 2396
MotionNotify 628 378
ButtonPress 1
Delay 100
ButtonRelease 1
Delay 1593
KeyStrPress Control_L
Delay 79
KeyStrPress c

In the previous code, first you see MotionNotify, which indicates the position of the cursor, then you can see that I pressed Alt_L, waited 147 milliseconds, then pressed 2, then released 2, then released Alt_L (Alt_L+2 sends you to the second desktop in DWM). The rest of the file consists of the same type of actions. It's fairly easy to edit (just remember to keep it clean of empty lines, empty lines produce errors). If you want to reproduce that again, but going to the third desktop instead, yo could change KeyStrPress 2 and KeyStrRelease 2 for KeyStrPress 3 and KeyStrRelease 3 respectively.

Fair enough, now you know a way of recording and replaying macros in X, and it's also very easy to customize. Now let's make it more practical.

An use-case

Let's define an use-case:

I, as an user, want to be able to open a new tab in tmux, and to cd to the directory in which my current active file in vim is located.

To follow the process with me, you'll need to have changed the behavior of tmux to work like vim, so please add the following lines to your .tmux.conf:

# vim keys
set-window-option -g mode-keys vi
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection
bind-key h select-pane -L
bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R

I'm also using the default <Ctrl+b> behavior of tmux, so make sure you DON'T have lines like the followings in your ~/.tmux.conf:

unbind C-b
set -g prefix C-a
bind C-a send-prefix

So, how would you answer the use-case we stated? you could, for example, expand your current path with vim, typing :!# %:p:h and then pressing tab:

:!# %:p:h
:!# /home/youruser/your/path/

Then, as the use-case states, we're in tmux, so we can select that text pressing <Ctrl+b>[, it will stop rendering the terminal, and it will let you move over or select the rendered text, but starting from the point your cursor was before pressing those keys. So, as we set it to work like vim, now we can press 0 to go to the beginning of the line, then press 4l to move to the beginning of the path, then press v to start the selection, then press $ to go to the end of the line and now press y to copy the text to tmux's buffer. Finally press <Ctrl+c> to get out of tmux's special behavior.

Now, we press <Ctrl+b>c to open a new tab, in which we write cd and we paste tmux's buffer with <Ctrl+]>. That way we complete the use-case.

Manually opening a new tab in tmux, and changing to the directory in which my current active file in vim is located.

As you see, it's a complex process, even if you have done it so many times you can do it without thinking, it requires lots of key presses and it's error-prone, because you can miss keys and end up doing something else.

So let's automate it!

Automating the use-case

First, let's make a directory at home to store our macros, let's call it ~/.xmacros.

An easy (but wrong) way of doing this automation is to call xmacrorec2 > ~/.xmacros/vim_tmux_cd_newtab.macro (you can change the file name if you want) from another window (or terminal), then to switch to the one where you have tmux and vim, then to do the process above, and end the recording pressing the quit-key. Now, each time you want to do it, you'll have to switch to another window/terminal and run xmacroplay on it. This is not the preferred way, right? what if we make it possible from vim directly? Let's try it.

Let's edit vim_tmux_cd_newtab.macro to remove the window switching, just remove some of the first lines, they look like this:

KeyStrPress Alt_L
KeyStrPress 1
KeyStrRelease 1
KeyStrRelease Alt_L

(That was how I switch desktops).

You can also eliminate all the lines with Delay. Make sure it is exactly what you want before going to the next steps. The one that I'm using is the following:

If you try calling xmacroplay from vim, make sure to call it as follows:

:exec "!xmacroplay \"$DISPLAY\" < ~/.xmacros/vim_tmux_cd_newtab.macro &"

(the key points are "$DISPLAY" and the last &).

That's a way to do it. You'll probably prefer to set it in a mapping, but as the command is in double quotes, imagine trying to call another of your macros, you'll need to write it manually instead of being able to press tab until you reach your preferred.

An alternative could be to make a bash script and add it to your $PATH, that way you'll be able to call it from vim and complete the paths with <Tab>, just like we completed %:p:h.

This bash script is very simple, here's my approach, I call it run_xmacro:

(cd ~/; xmacroplay "$DISPLAY" < $1 > /dev/null 2>&1 &)

To use this script, be sure you give it execution rights with: chmod +x, then you can make a mapping to call it, put this in your .vimrc or in the file where you put the mappings (I use ~/.vim/plugin/mappings.vim);

nmap <Tab>m :!run_xmacro ~/.xmacros/

(I use <Tab> a lot, so <Tab>m is the first thing that came to mind, change it to fit your needs.)

Ok, so we're done! Now just press <Tab>m, the command will appear in vim, then you'll be able to press tab again and loop over all your xmacros! Click on one and it will run flawlessly.

Automatically opening a new tab in tmux, and changing to the directory in which my current active file in vim is located.

Done, now it's time to get creative and build your own macros, automate your workflow to speed up your daily life!

If you need any help please ping me @sadasant. (Just request to follow, if I forget to accept, send me an email).

// I made the gifs with tty2gif

by-nc-sa Daniel Rodríguez.
{ "tags" : [ "spanish", "thoughts" ], "title" : "¿Y ahora qué?" }

Recomendación musical:
The River X - Ketil Bjørnstad & David Darling.

Ya van varios meses buscando qué decir.

Hace casi un año preví que me sumergiría, y así hice. No lo noto en el día a día, pero sí en cómo confronto los problemas, en su mayoría.

Por ejemplo, he tenido ciertas vicisitudes por andar pensando en lo mínimo y no querer ver a gran escala; siendo esto, a mi razonamiento, primera vez que ocurre. ¡Me hizo sentir ínfimo!, más que de costumbre. Me hizo sentir escuálido, insuficiente e impresentable, pero también: humilde.

Mi acercamiento anterior había sido explotar las posibilidades, decirme: aquí hay muchas vertientes, voy a analizarlas todas y luego irme por la que vea más conveniente. – Así, atacaba por lo vago y sorprendía.

O por lo menos eso era lo que pensaba, para mi sorpresa, la realidad – en otros contextos – era que atacaba siempre por donde se me hacía más fácil. Y eso no es de sorprender a nadie, las matemáticas daban, es decir, los beneficios superaban los costos y los numeritos se veían verdes. Pero eran verdes chimbos, verdes a penas visibles.

He conocido a personas de previsión admirable. Les observo, tomo nota y les confronto siempre que puedo; para mi fortuna, no se permiten irritarse fácilmente, por lo que eventualmente conseguimos cómo trabajar.

Mis asertividades han cambiado, de ser tácticas punzantes (algunas) han pasado a ser sencillos pasos que iluminan tonos favorables en el horizonte. Dejé de querer intervenir en preferencias de otros, o de hacer calendarios con otros nombres, preparar documentos y presionar por firmas, dejé de querer empujar, aunque, ahora que lo pienso, he firmado bastante más que en otros años.

Mi nuevo juego es pescar, buscando que quien pique, me arrastre, buscando vientos calientes que me suban, y así mismo, buscando cómo subir a otros.

Últimamente, me he entretenido redirigiendo correos a quienes creo que se pueden beneficiar más de ciertas notificaciones y puntualizando con quienes debo proceder para encontrarles, en un futuro indiscreto, convertidos en lo mejor que ellos puedan llegar a ser. Se trata de presentar alternativas bien precisadas, dejarlas en la mesa y partir, sin esperar recibir noticias. ¡Por lo general funciona!

De esa manera he cumplido con varias metas, estoy trabajando en proyectos con los que soñaba hace años, aprendiendo temas que veía con deseo y durmiendo más seguido. Los preparativos para cerrar la etapa universitaria están listos. Ya empezaron a entrar nuevos vientos, corrientes de otras costas que traen consigo mapas de tesoros, escritos en sus idiomas. Me siento en vísperas de aventura.

by-nc-sa Daniel Rodríguez.
{ "tags" : [ "spanish" , "thoughts" , "surrealisms" ] , "title" : "Colores" }

No suelo ser una persona muy colorida, aprendí a apreciar los colores oscuros. Los opacos, esconden cierta calma, como la sombra, por ejemplo, de un árbol. Los más oscuros nublan las conclusiones posibles, como un sonido leve, cual bajo, que en primera instancia nos cuesta distinguir en su entorno. Son colores que se expresan en susurro, y para captarlos hay que acercarse. De día resaltan, mucho menos que un foco de luz en la noche, pero casi indistinguibles entre sí. A oscuras se camuflan, y al mismo tiempo destacan, demostrando sus rubores, más activos que el vacío de fondo. Quizás por ese mismo susurro y gravedad, imponen respeto; no se acercan y mantienen distancia. El negro mantiene absoluta distancia.

Sin embargo, por fortuna nuestra mirada llega más lejos que nuestros pasos, así que bien podemos quedarnos sobre ciertos matices y aún así apreciar paisajes completamente distintos, pudiendo cambiar esa percepción según nuestro alcance.

Por lo mismo, también me gustan los colores vivos.

Los mensajes llenos de furor son inevitablemente atractivos. Buscan decirlo todo, con un carácter sobre el cual es difícil argumentar. Se acercan sin pedirlo y se plantean a sus anchas. En su confianza, superan nuestras dudas, con un abrazo de difícil escapatoria. Son eróticos como el azúcar, tanto así que carecen de intimidad. Los más claros son menos drásticos, pues les falta criterio, siempre llevan el mensaje absorto del blanco (el ídolo por defecto).

Ahora, de hablar de colores particulares, podríamos pasar un buen rato describiendo sus andanzas. Aquellos lugares de donde les caracterizamos. Hay un matiz de marrón nocturno que en mi memoria es típico de carpetas, escritorios y estacionamientos semi-iluminados; suelo recordarle acompañado de un azul mar sumamente discreto y austero, como chaqueta de vestir. Ese marrón tiñe mi memoria eventualmente y sin consideración alguna, simplemente aparece.

Un matiz de durazno, como le dicen (que para mi es un rosado y listo), me hace pensar en la pintura de interiores, en los edificios de Maracay; en sus pasillos estrechos. Va acompañado de un sentimiento médico, como si estuvieses por llegar a un consultorio y vieses en frente unos cuantos metros de cerámica, con paredes haciendo juego, con puertas cubiertas de rejas negras y en el fondo, una ventana, asomando un edificio blanco con amarillo, dentro de un cielo celeste, a pleno día.

El amarillo mostaza es pintura de exteriores, a veces agrietada; es también arena y playa; se lleva bien con olas y con lanchas amarradas.

El verde claro es sala de estar, como también ventana de edificio con rejas blancas, como té, como jardín y como vejez.

Además están los vibrantes amarillos tensos y los rojos explosivos. Se les ve poco porque hierven la mirada. Se desvanecen rápido en negro, dejando auroras a su paso.

Y así, muchos más.

A veces incluso sueño con colores, con cortos mudos monocromados, impregnados de emociones, muchas veces leves. Son perfumes visuales.

En cuanto a mi, no soy un tipo de perfumes, me acomodo en las sombras calladas, compartiendo con olores sutiles, naturales y tenues, sin tantos adornos.

My drum, my drum, my drum
gonna make ya
My drum, my drum, my drum
gonna make ya come.
Me, My Yoke and I, by Damien Rice.

by-nc-sa Daniel Rodríguez.
{ "tags" : [ "analysis" , "english" , "slides" , "society" , "thoughts" ] , "title" : "Geeks and social status" }

Yesterday I had an interesting conversation with a teacher, as it was about geeks in Venezuela, I thought to make it public under his permission. I hope you enjoy it.

by-nc-sa Daniel Rodríguez.
{ "tags" : [ "analysis" , "economy" , "society" , "spanish" , "thoughts" ] , "title" : "Siendo Objetivos" }

Hola de nuevo, un gusto escribirles, no sin dudas, bueno, ¿cómo no dudar si hay tanto que desconozco?

Desde hace un tiempo vengo pensando en el significado de la expresión, o la necesidad de expresarnos, en parte desde que leí un poema del viejo y atrevido Bukowski, llamado “El Genio de la Muchedumbre”, donde apunta que hay que tener cuidado con los predicadores, pues estos son los primeros en hacer lo contrario a lo que profesan. Su publicación me hizo meditar en las muchas ambivalencias que ocurren a diario en el bullicio, incluso me hizo reír, debido a los oxímorones de aquellos cuyas pretensiones contrastaban en su totalidad con sus cargos, es decir, hay pocas cosas tan despreciables como que un millonario a costa de corrupción te hable sobre lo bien que vive el pobre, es tan gracioso. Pero bueno, el asunto es que la expresión en sí misma parte de la necesidad, de hecho su etimología deja ver a simple vista que se trata del resultado de la presión que se ejerce, es decir, es lo que ya no podemos contener y dejamos salir.

La expresión comienza temprano en nuestro desarrollo, hacemos ruido para llamar la atención de nuestros padres, para que nos asistan, y así continúa en adelante, cuando hay algo que no sabemos cómo solucionar lo expresamos, para buscar ayuda, difícilmente decimos lo que ya aceptamos por omisión, es decir ¿qué tantas veces hablamos del aire?, ¿o de que estamos respirando en todo momento? (¡Ajá! Les hice pensar en su respiración :3), tomando un ejemplo personal, dedico mi vida a hacer cosas de computadoras y aquí no publico nada al respecto, ¿por qué?, pues, por dos razones, una: me cansa el tema, y dos: mientras más se, me doy cuenta de que puedo decir menos al respecto.

Les escribo aquí porque quiero comunicarles mi opinión sobre las cosas que no puedo resolver con mis manos.

Para defender el punto de que la expresión surge de una necesidad, primero quiero descartar la enseñanza como justificación de lo contrario: la enseñanza es una forma de expresión para comunicar a otros el resultado de la experiencia y prepararlos para el porvenir, desde este punto se ve provechosa, pero realmente es un desgaste, imagínense, si dedicarnos a estudiar es un fastidio, ¿cómo será enseñar? y digo que es un fastidio porque requiere disciplina y suficiente carácter como para imponer prevenciones a futuros distantes sobre cualquier placer inmediato, es decir es costosa, y para muestra el elevado costo de la educación.

De hecho, no es de extrañar que en un país con tantos problemas económicos (como este, en donde escasean medicinas, alimentos básicos e incluso papel toilet) los sectores educativos financiados por el estado estén en tantos problemas (Busquen en twitter: #SOSunivVE), es demasiado costosa la educación como para preocuparse primero en ella, igual que hay tan pocos nerds en los colegios, sencillamente la mayoría se deja llevar por los beneficios a corto plazo.

Desde hace un tiempo vengo pensando que los que defienden ideologías políticas centrales son los más educados de la población, es más, me atrevería a decir que no sólo tienen suficientes recursos como para pagar todas las necesidades básicas más la educación, sino que tienen como para estudiar más allá de su profesión y pensar en comprender otros mundos, y para esto hace falta mucho más que dinero, se necesitan buenos ejemplos, buenos padres y educadores, es decir bases culturales fuera de lo común.

Se necesita mucha educación para saber respetar, sin ella, cualquier propuesta tiende al totalitarismo, porque ve la incomprensión como un camino más eficiente, porque le parece que pensar en el futuro es demasiado desgaste.

¿Es el humano propenso a desvalorar todo lo que le da bienestar y destruir las bases de la sociedad?, o ¿es el humano violento en sí mismo? Sin duda somos una especie dominante, pero ¿tan malos somos?

Creo que no, considero que es un asunto natural, es decir, todo lo que somos depende del entorno, de lo que constituye nuestro ambiente, de hecho, no hubiésemos podido existir sin él, es más, propongo empezar a pensar que el ser humano es parte de su ambiente, como las pecas en la piel, somos parte de la naturaleza, nunca distintos de ella.

Uno de los conceptos que se han (a)grabado en la percepción popular es el de "adaptación" y "evolución", la gente cree que la vida cambia y evoluciona, tipo pokémon, cuando no es así, los cambios son mínimos, ocurren en su mayoría durante la gestación, durante la multiplicación de células, y sólo se notan porque los que no tienen esos cambios, mueren.

La naturaleza tiene más fácil acabar con la vida que construirla, y para muestra la cantidad de seres vivos que hemos extinto nosotros.

El asunto es que todo tiene su razón de ser en los recursos y menos en lo que nosotros idealizamos como correcto.

Uno puede ser idealista en cuanto a qué es lo mejor a largo plazo, incluso desde un punto de vista matemático, analizando la distribución y el aprovechamiento eficiente de recursos, pudiendo añadir variables sociales, además de los deseos de la población y del individuo, y aún así sería muy difícil entender, en números, cómo desembocará la cultura, porque va más allá de la percepción objetiva de los fenómenos naturales, los asuntos económicos son ampliamente afectados por la percepción de valor de los agentes, podría decirse que depende más de cómo cada quien entiende que son las reglas del juego que de planificación.

Y esta es la explicación a prácticamente todo (porque lo demás no es práctico).

La población se acumula entorno a los recursos, dependiendo qué tan fácil los puedan obtener, habrán más conflictos, para muestra la capacidad de orden de los Japoneses, que se la pasan sobreviviendo problemas naturales, o bueno, la estabilidad en las sociedades nórdicas, es decir, la adversidad crea cultura de respeto y colaboración, y por el contrario, la plena disposición de recursos desvirtúa esos valores (para muestra, el caribe, los países petroleros y La India).

Alguien alguna vez tuvo el coraje de decirme que en sociedades con recursos a plenitud, el ser humano buscaba la manera de generar adversidades para establecer orden, y me parece razonable, aunque no es que se busque, más bien así somos.

Podríamos decir que el motivo del surgimiento de los movimientos opresivos es la escasez, o bueno, en los países desarrollados, una versión más ligera de control serían los movimientos republicanos, que quizás tienen su motivo en: la recesión y la guerra, entender que se deben tomar medidas de austeridad para afrontar el futuro, va más allá del complacer a la sociedad. O bueno, en donde hay más recursos que conflictos, se ve como injusto no utilizarlos para garantizar el beneficio de todos y surgen los movimientos sociales moderados, y en donde hay demasiados recursos, ocurre la anarquía, que toma rostros temporales de personajes populares, pero que en esencia es, realmente, oclocracia.

Es así como se constituye la humanidad, donde hay oportunidad, nos colamos, como hielo que se derrite, y donde hay adversidad, nos estructuramos, como agua que se hace hielo.

Entonces, cada región tiene el gobierno que se merece, y los cambios habrán a través del tiempo, por cómo se someta la sustancia a su recipiente y por el grado de desorden que caracteriza a esta realidad.

Teniendo las cosas un poco más objetivas, nosotros, los intelectuales, los estudiosos, debemos analizar de qué manera sobrevivir y usar nuestro aprendizaje para ver lo más adelante posible, ¿dónde hay oportunidad para nosotros?, ¿cómo aprovecharlas?, ¿cómo ser de utilidad?, saquemos el ruido de nuestro análisis, entendamos que todo discurso tiene raíz en necesidades desbordantes y en oportunidades sabidas, despersonalicemos los conflictos y participemos en donde podamos tener garantía de que nuestras acciones serán lo más profesionales posibles.

Después de todo, se dice que el conocimiento es poder no porque sea un lujo, sino por su capacidad de resolver conflictos, incluso mucho antes de que ocurran.

No veo sentido en perder tiempo en términos idealistas cuando hay tanto práctico por hacer.

Los "malos" de la historia son los que obtienen resultados negativos. Porque nadie se expresa o se manifiesta sin pretender que eso resultará en algún beneficio, ¿no es así?.

Muchas gracias. Algunas conversaciones interesantes:

by-nc-sa Daniel Rodríguez.