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. 😀

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.


22 comentarios, deja el tuyo

Deja tu comentario

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

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   ivanovnegro dijo

    !Fantástico!

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

  2.   TheSandman86 dijo

    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.

  3.   anti dijo

    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
    😀

    1.    anti dijo

      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.   Nano dijo

    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

    1.    Nano dijo

      Y sí, ando en la universidad y en esta mierda no tienen Linux xD

      1.    anti dijo

        Gracias nano. Pero, ¿me ayudas con lo de editar los artículos después de publicados? No puedo.

        1.    nano dijo

          Sí, tranquilo, déjalos como mejor te queden que yo los arreglo

  5.   Xykyz dijo

    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! 🙂

  6.   Fernando dijo

    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!

    1.    msx dijo

      Si es Awesome 3 definitivamente me interesa.

  7.   Fernando dijo

    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!

    1.    elav dijo

      Me gustó mucho tu blog… ^^

      1.    Fernando dijo

        Muchas gracias Elav, estamos en contacto!

        La verdad es que en cierto modo DesdeLinux me incitó a crear mi propio blog. Tanto tiempo usando Linux hace que uno se plantee aportar algo a cambio ^^

        Un saludo!

  8.   msx dijo

    «Si se preguntan por qué elegí esas cuatro letras para mis escritorios, acuerdensé de las cuatro bases nucléicas del ADN.»
    Sweet, +1

    1.    anti dijo

      Bueno, me gusta mucho la idea de ponerle el ADN a mis escritorios.

  9.   halonsov dijo

    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

    1.    msx dijo

      Excelente, esperamos ver tus avances convertidos en un post! =)

  10.   Víctor Salmerón dijo

    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

    1.    anti dijo

      El mismo aptitude lo corrige. Además se entiende mejor la orden así.

  11.   tarantonio dijo

    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..

    1.    anti dijo

      Sí, las X ya las tenía puestas. El post mismo explica que empecé con un Debian mínimo ya hecho con Openbox.