El lado oscuro del mosaico (III): XMonad

Parece que me he hecho mucho del rogar y es que hasta hoy no me puesto ni un milímetro de configuraciones. Como vengo prometiendo desde hace un rato hoy despedazaré mi xmonad.hs que preparé especialmente para esta ocasión. Este y otros archivos de configuración están en el Paste, específicamente los colores de la consola, las configuraciones de las ventanas y la barra superior.

Puedes descargarlas desde ahí y abrirlas en tu editor de texto favorito.

Antes

Por si se lo preguntaban, mi escritorio era un pequeño Openbox sobre Debian estable. Obviando por el momento el proceso de instalación de la distribución, debes verificar que los paquetes necesarios estén en los repositorios. Hagámos esto (recordando que estoy en Debian):

sudo aptitude install ghc xmonad xmobar gmrun dmenu

Y listo. Acabamos de instalar, en orden de aparición; el Glasgow Haskell Compiler que se encarga de compilar e interpretar Haskell; XMonad, el gestor de ventanas, XMobar es una barra que nos presenta información del sitema y unos lanzadores de programas, dmenu y gmrun; que amablemente ya vienen configurados para que XMonad los lanze con Mod+P y Mod+Shift+P.

Y así es como se veía mi escritorio. Lo pongo para que tengamos un punto de comparación y emulemos algunas de las cosas que ya tenía configuradas en un ambiente más minimalista.

Nada del otro mundo

Pero sorpresa. XMonad nos recibe así. En la captura ya he abierto gmrun, para que se vea que no está descompuesto:

Nada espectacular

Y nosotros queremos que se vea así, ya configurado y todo:

Así sí

La captura muestra una terminal corriendo ncmpcpp, un cliente de MPD para la terminal; y una sesión de GVim, ambas con los colores de la paleta SolarizedLight. Conseguir esto no fue realmente difícil e incluso Vim y urxvt ya estaban listas en mi sistema.

El xmonad.hs, ¡uy que miedo!

Para nada. La configuración que están a punto de ver es sumamente sencilla y básica. Debería funcionar en todos los sistemas que dispongan de XMonad 0.9.1, aunque ya esté disponible la 0.10. Pues tengan miedo, mucho miedo:

-- Configuración de Xmonad
-- Como ven, es bastante simple

import XMonad
import XMonad.Util.EZConfig
import XMonad.Util.Run

wrk = ["A","C","G","T"]

main = do
  xmproc <- spawnPipe "xmobar"
  spawn "nitrogen --restore"
  spawn "urxvtd"
  spawn "mpd"
  spawn "xfce4-volumed"
  xmonad $ defaultConfig
           { modMask = mod4Mask
           , terminal = "urxvtc"
           , borderWidth = 2
           , normalBorderColor = "#fdf6e3"
           , focusedBorderColor = "#002b26"
           , workspaces = wrk
           }`additionalKeys`
           [(( mod4Mask, xK_v), spawn "gvim")
           ,(( mod4Mask, xK_c), spawn "mpc toggle")
           ,(( mod4Mask, xK_a), spawn "mpc prev")
           ,(( mod4Mask, xK_s), spawn "mpc next")
           ]

-- Fin de la configuración. Simple, fácil y limpio.

¿Qué pasó aquí?

Si ya se recuperaron del susto, podemos observar que nuestra configuración apenas y alcanza las 30 líneas de código. Voy a explicar parte por parte, por qué si copiaste y pegaste esto, XMonad va a compilar el programa que acabamos de escribir. ¿Listo?

La sección de dependencias

Casi al principio del archivo hay tres líneas que empiezan con la palabra clave import. Como en otros lenguajes de programación, manda al compilador a buscar el módulo que quiere y este le entrega las funciones del afortunado módulo. Veámoslo de nuevo:

import XMonad
import XMonad.Util.EZConfig
import XMonad.Util.Run

Nuestro programa usa tres dependencias. La primera nos trae las funciones propias de XMonad, la segunda y la tercera nos ayudarán más adelante a definir atajos de teclado y a correr programas. Sigamos.

Las variables

Que cosa es wrk y para que sirve. Apreciemos el código más de cerca:

wrk = ["A","C","G","T"]

wrk es una variable, que equivale a una lista de cuatro elementos, todos cadenas; por que las listas de Haskell sólo aceptan un tipo de elemento. Si se preguntan por qué elegí esas cuatro letras para mis escritorios, acuerdensé de las cuatro bases nucléicas del ADN.
El nombre es sólo una abreviatura, y pudimos ponerle myWorkspaces, pepitoRojo o lo que sea, mientras empiece con minúscula y lo especifiquemos en la siguiente sección.
Aquí empieza lo bueno de tener un lenguaje de programación completo a nuestra disposición, por que podríamos definir el color de la ventana desde una variable:

colorVentana = "#FFFFFF"

O incluso crear una función que devuelva un color respecto a nuestro estado de ánimo:

moodColor m
  | m == "Triste" = "#b0c4f6" -- Algo como azul
  | m == "Enojado" = "#ba3f3f" -- Algo como rojo
  | m == "Feliz" = "#8bff7e" --Algo como verde
  | otherwise = "#FFFFFF" -- Blanco, para los días neutrales

Y muchas cosas más. ¿Ya sienten el poder sobre sus dedos? Una cosa. Si no entienden que paso, piensen que esto es una estructura propia de Haskell a la que le llamamos guarda y básicamente es cómo un árbol if-then-else, pero más organizado y bonito. Y no se preocupen, el código lo escribí yo y funciona bien.

La sección principal

A partir del renglón que dice main=do comenzamos a específicar el comportamiento de XMonad. Veámoslo con calma.

Arrancando las cosas al principio

Esto se puede lograr de muchas maneras, pero para quedarnos cortos de dependencias y hacer un código más limpio, aunque claramente más cavernario, opté por esto:

xmproc <- spawnPipe "xmobar"
  spawn "nitrogen --restore"
  spawn "urxvtd"
  spawn "mpd"
  spawn "xfce4-volumed"

La primera línea arranca el XMobar, cuyo archivo de configuración veremos más tarde.
Después arrancamos algunas cosas indispensables para mí, un fondo de pantalla agradable (el mismo que el de la primera captura), un demonio que hace a urxvt correr como el viento, el demonio de mpd -que pone mi música desde el principio y jamás cierro- y un control de volumen. Ya, eso es todo. La sintáxis es la misma si quieren arrancar lo que ustedes necesitan.

Los ajustes finales

Aquí definimos algunas cosas que normalmente son solo preferencias personales. Por ejemplo, me gusta usar a la normalmente inútil tecla Super (efectivamente, la de las ventanas) en vez de Alt, pero esa es mi preferencia. Si quieren volver a Super, quiten la primera línea.

-- ...
 xmonad $ defaultConfig
           { modMask = mod4Mask
           , terminal = "urxvtc"
           , borderWidth = 2
           , normalBorderColor = "#fdf6e3"
           , focusedBorderColor = "#002b26"
           , workspaces = wrk
           } -- ...

Luego definimos nuestra terminal, urxvtc, por que así llamamos a un cliente del demonio que corrimos anteriormente. Otras cosas más, como la lista de espacios de trabajo, que bien podríamos haber puesto en cosas como:

, workspaces = ["H","O","L","A"]
, workspaces = ["A","R","C","H","L","I","N","U","X"]
, workspaces = ["1:web","2:musica","3:espacioInutil", "4:Ufff"]

Y otras cosas que nos permite el procesado de listas de cadenas de Haskell.
El grueso del borde es sólo un número entero y si queremos cambiar el color de la ventana enfocada por la función moodColor que acabamos de crear, pues dejamos la variable así:

--...
, focusedBorderColor = moodColor "Feliz"
-- ...

El $ en la linea xmonad … es sólo una aplicación de funciones asociativa a derechas, o sea, nos ahorramos unos paréntesis. :D

Los atajos de teclado

El final del archivo tenemos una lista de tuplas que contienen algunos atajos, en este caso, lanzan GVim, pausan o reproducen la música, y la adelantan o la atrasan. Eso es todo. La función additionalKeys viene en el segundo módulo que importamos y los acentos inversos hace que se ejecute al estilo de la función div (/) como 1/2 y no div 1 2, haciendolo más fácil de leer. Así está:

-- ...
}`additionalKeys`
           [(( mod4Mask, xK_v), spawn "gvim")
           ,(( mod4Mask, xK_c), spawn "mpc toggle")
           ,(( mod4Mask, xK_a), spawn "mpc prev")
           ,(( mod4Mask, xK_s), spawn "mpc next")
           ]

El .xmobarrc

Config { font = "-*-monospace-9-*-*-*-*-*-*-*-*-*-*"
       , bgColor = "#fdf6e3"
       , fgColor = "#657b83"
       , position = Top
       , lowerOnStart = False
       , commands = [ Run Com "echo" ["$USER"] "username" 864000
       , Run Com "hostname" ["-s"] "hostname" 864000
       , Run Com "mpc current" [""] "mpd" 10
       , Run Date "%a %b %d" "date" 36000
       , Run Date "%H:%M" "time" 10
       , Run StdinReader
       ]
       , sepChar = "'"
       , alignSep = "}{"
       , template = "'username'@'hostname' }{ 'mpd' | 'date' - 'time'"

Esto debería de funcionar, y de hecho lo hace. La sintáxis es un poco más compleja y lo mejor es que la analizes tú mismo para entenderla. Así que sólo me limitaré a decirte que estamos describiendo los comandos, sus opciones y algunas configuraciones extra, que serán mostrados en XMobar.
La línea template tiene toda la acción y me inventé un truco para que muestre la canción que estoy escuchando. Este truco y el de cambiar la canción por atajos de teclado requieren de mpc, un cliente de mpd ejecutable desde la terminal.

Conclusiones

Eso es todo, creo. Ya revisamos el archivo principal de XMonad y comenzamos a aprender Haskell lo queramos o no. Si quieres seguir hay una guía muy buena con la que empezar.
En la próxima entrega exploraremos a los gestores no programables, específicamente Spectrwm/Scrotwm. Nos vemos.


anti

anti: Distro-hopper rehabilitado. A parte de eso no tengo mucho que decir.


24 comentarios en “El lado oscuro del mosaico (III): XMonad

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Current ye@r *

  1. !Fantástico!

    La próxima vez Spectrwm? !Sí señor!

    1/22
  2. Muy buena guía, se ve muy interesante, me están entrando las ganas de darle un vistazo, a pesar de que estoy mas que cómodo con mi Openbox.

    2/22
  3. Ups, se me pasó específicar dónde es que van estos archivos, pero cuando le doy a editar el post, me manda un mensaje de error:
    Fatal error: Call to undefined function get_header() in /home/desdelin/public_html/blog/wp-content/themes/dlinux/index.php on line
    Si alguien lo puede editar, van así:

    Archivo de configuración principal: ~/.xmonad/xmonad.hs
    Archivo de xmobarrc: ~/.xmobarrc
    Archivo de configuración de la consola: ~/.Xdefaults
    :D

    3/22
    • Parece que no puedo editar mis propios posts. No encuentro la opción por ninguna parte en el escritorio tampoco. Tengo un par de errores, es todo, correcciones mínimas.

      4/22
  4. Pues me parece super interesante puesto que es mas productivo cuando se trata de programar. Yo quiero meterme con Awesome porque la verdad quiero aprender LUA.

    Existe para los que programamos en Python Qtile, pero la verdad es que no lo logro hacer correr, ando usando Ubuntu y lo instale via PPA y tambien desde fuentes pero el muy desgraciado no quiere funcionar xD

    De todos modos LUA es algo que DEBO aprender y nada mejor que verse las caras con este tipo de tiles.

    Sigue así anti, vas en camino a convertirte en Autor dentro de DesdeLinux

    5/22
  5. Gracias anti, definitivamente voy a probar XMonad. Veo que usa cosas básicas de Haskell sin necesidad de mucha complejidad como las guardas, el operador aplicación y evidentemente el uso de listas (sino no sería Haskell xD).

    A ver que tal me queda! :)

    8/22
  6. Llevo tiempo usando un tiling windows manager, Awesome. Cuando tenga tiempo haré un tutorial en el que espero poder explicar todo el proceso, desde instalar awesome hasta configurar un set de programas ligeros y crear nuestro propio theme.

    Si os parece bien, cuando lo tenga os puedo avisar para que lo publiquéis aquí.

    De paso y con vuestro permiso, hago un poco de publicidad a mi pequeña web, si queréis podéis echarle un vistazo, por si os interesase alguna publicación:

    http://niferniware.sytes.net

    Un saludo!

    9/22
  7. Un detalle, la sección de la web donde tengo alojado el blog es:
    http://niferniware.sytes.net/blog/

    Lamento el error.

    Un saludín!

    10/22
  8. “Si se preguntan por qué elegí esas cuatro letras para mis escritorios, acuerdensé de las cuatro bases nucléicas del ADN.”
    Sweet, +1

    13/22
  9. Exelente guia, gracias a ella apenas estoy probando xmonad, y solo puedo decir una cosa de el, me enamore de xmonad, aun no le meto mano y aun asi me parece exelente, muchas gracias

    15/22
  10. Una pequeña observación al tuto, en este momento uso Debian estable (Squeeze), y para instalar el dmenu, no se hace con un aptitude install dmenu, sino con el paquete suckless-tools, por lo demás, excelente tuto

    19/22
  11. Esta guía presupone que tienes las x instaladas.
    En mi caso, parto de una debian solo consola, con lo cual tuve que instalar xorg. Estaría bien, ya que lo que buscamos es un entorno minimalista, partir de una debian sin entornos gráficos, instalar xmonad en modo simple y añadir herramientas y programas de consola, tipo mutt, irssi, etc..

    21/22

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Current ye@r *