Este es uno de los capítulos del tutorial Polybar. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
En el capítulo anterior del tutorial, viste que era Polybar, como instalarlo en tu equipo, como crear la configuración básica, y por último, lo iniciaste. Llegados a este punto, es posible, que te llevaras una pequeña decepción, porque comparado con lo que puedes encontrar por ahí, la configuración por defecto no es muy llamativa, y lo cierto es que las capturas de pantalla que puedes encontrar en diferentes repositorios, son realmente espectaculares. No te preocupes, porque poco a poco nos vamos a encaminar hacia que consigas tu propia barra de estado espectacular.
En la primera parte de este capítulo, encontrarás como integrar Polybar con tu window manager, ya sea i3
o bspwm
. Mientras que en la segunda parte encontrarás la sintaxis del archivo de configuración. Esto es fundamental, para comprender como funciona y como le puedes sacar el máximo partido.
Primeros pasos con tu propia barra de estado
Configurar Polybar con tu window manager
El primer paso es crear un ejecutable con las opciones que necesitas. Por ejemplo, el siguiente script inicia dos barras de herramientas. Este script la tienes que poner en ~/.config/polybar/launch.sh
,
#!/usr/bin/env bash
# Si quieres depurar cambia a DEBUG=1
DEBUG=0
# Termina todas las instacias de polybar
killall -q polybar
# Si las barras tienen `ipc` habilitado lo puedes utilizar con
# polybar-msg cmd quit
# Inicia las barras de estado `bar1` y `bar2`
if [ $DEBUG -eq 1 ]
then
echo "---" | tee -a /tmp/polybar1.log /tmp/polybar2.log
polybar bar1 2>&1 | tee -a /tmp/polybar1.log & disown
polybar bar2 2>&1 | tee -a /tmp/polybar2.log & disown
else
polybar bar1 >/dev/null 2>&1 & disown
polybar bar2 >/dev/null 2>&1 & disown
fi
echo "Barras de estado iniciadas..."
He añadido la opción de depuración porque no siempre te interesará ver lo que sucede en el log, solo en aquellos casos que tengas algún problema. De esta forma, es tremendamente sencillo, actualizarlo, cambiarlo, modificarlo cuando lo necesites, y depurar hasta que encuentres ese problemilla que no te deja que la barra esté como deseas.
Recuerda, que actualmente el archivo de configuración está tal y como lo trajeron al mundo, y solo existe una barra de herramientas definida en él. Esta barra de herramientas se llama example
, con lo que si lanzas el script anterior no te funcionará, espera a tener una configuración mínima.
El siguiente paso es hacer el script anterior ejecutable, para esto ejecuta la siguiente instrucción,
chmod +x ~/.config/polybar/launch.sh
Por otro lado, si tienes varios monitores, es posible que quieras una barra de herramientas en cada uno de los monitores. En mi caso por ejemplo, solo tengo una barra de herramientas en el monitor principal que utilizo, pero esto puede no ser tu caso. Para conseguir esto, tienes que definir la variable monitor, tal y como te mostraré mas adelante.
Configuración con bspwm
Ahora depende del window manager que estés utilizando. En el caso de que utilices como yo bspwm tienes que añadir la siguiente línea en el archivo de configuración bspwmrc
,
$HOME/.config/polybar/launch.sh
Configuración con i3
En cambio si estás utilizando i3 tienes que añadir la siguiente línea en el archivo de configuración,
exec_always --no-startup-id $HOME/.config/polybar/launch.sh
Además tienes que borrar las siguientes líneas,
bar {
i3bar_commnad i3bar
}
La sintaxis de los archivos de configuración
Antes de que te lances a configurar y personalizar tus barras de estado, es necesario que conozcas la sintaxis del archivo de configuración. Soy consciente de que esta parte, se te puede atragantar, pero es absolutamente necesaria, para entender como tienes que configurar, con todo detalle y exprimiendo al máximo las opciones que te dan los archivos de configuración. No solo esto, también es importante, que tus archivos de configuración queden lo mas claro posible, y si puede ser comentados, para que la próxima vez que tengas que modificar, recuerdes por que lo hiciste. De esta manera te resultará mas sencillo trabajar con él.
Por ejemplo,
[colores]
background = #ff00ff
[general]
width = 100%
weight = 32
radius = 6.0
fixed-center = false
;lista
valor-0 = valor0
valor-1 = valor1
[bar/bar1]
offset-x = 1%
offset-y = 1%
Cada conjunto de valores iniciado por []
es una sección. En el ejemplo anterior tienes tres secciones colores
, general
y bar/bar1
. Tanto los valores numéricos, como los booleanos, como las cadenas de texto, se definen sin necesidad de comillas, ni dobles ni simples, tal y como ves en este ejemplo. En el caso de que quieras definir un texto con espacios antes o después lo tendrás que hacer en ese caso con dobles comillas, como en " esto es un ejemplo "
.
Aunque en general, somos bastante parcos a la hora de comentar indicarte que esto es realmente importante. Un comentario es tan sencillo como iniciar la línea con ;
. Si quieres poner varias líneas consecutivas, cada una de ellas tiene que comenzar, igualmente, por ;
.
Insisto en el tema de los comentario, porque en muchas ocasiones, no pongo comentarios en la configuración, por pura pereza, y luego no recuerdo porque puse eso ahí.
Por otro lado, las listas están definidas como puedes ver en el ejemplo anterior, del tipo valor-0, valor-1
. Todas las listas tienen que empezar en 0
y ser consecutivas, es decir, no pueden existir saltos entre los elementos de la lista.
Referencias
Una vez definidos unos valores, lo interesante es poder utilizarlos en otra parte de la configuración. Un caso típico de esto son los colores. Así, para poder utilizarlos simplemente tienes que utilizar la siguiente sintaxis,
key = ${section.key}
En el ejemplo anterior, si por ejemplo queremos utilizar el color de fondo en otra parte, podemos hacerlo de la siguiente forma,
color = ${colores.backgroud}
En el caso de que te quieras referir a otra variable dentro de la misma sección, tienes que utilizar self
. Por ejemplo, podrías redefinir la sección colores
del ejemplo anterior, de la siguiente forma,
[colores]
background = #ff00ff
foreground = ${self.background}
De la misma forma que para una sección general, para el caso de una sección que define una barra de estado, también puedes utilizar sus parámetros, por ejemplo, para el caso anterior,
espaciado = ${bar/bar1.offset-x}
En el caso de que estés en la sección de la misma barra, también puedes referirte utilizando,
[bar/bar1]
offset-x = 1%
offset-y = ${root.offset-x}
Puedes hacer referencia a las variables de entorno utilizando la siguiente sintaxis,
key = ${env:VAR:defecto}
En este caso, el parámetro key
tomará el valor de la variable de entorno VAR
en caso de que exista, y en otro caso tomará el valor defecto
. Esto es un caso típico para el monitor,
monitor = ${env:MONITOR:HDMI-1}
En el caso de que exista la variable de entorno MONITOR
se asignará ese valor y en otro caso se asignará HDMI-1
.
También puedes utilizar valores definidos en ~/.Xresources
, aunque esto dependerá de que Polybar esté compilado con la dependencia xcb-util-xrm
. Para utilizarlo en este caso, lo puedes hacer de forma similar a lo que has visto anteriormente,
key = ${xrdb:KEY:defecto}
Pero no solo esto, sino que además puedes hacer referencia a parámetros que estén definidos en otros archivos de configuración. Para esto tienes que utilizar la siguiente sintaxis,
key = ${file:/ruta/absoluta:defecto}
Herencia
Te puedes encontrar en la situación de querer tener dos barras de estado exactamente iguales, una en un monitor y la otra en el otro monitor. ¿Es necesario en este caso reescribir toda la configuración?. Sería algo absurdo, tener que escribir toda la configuración para solo cambiar, por ejemplo, el monitor. En este caso, tu aliado es la herencia.
La herencia te permite que una sección herede de otra o de otras. Para esto simplemente tienes que utilizar la palabra clave inherit
y hacer referencia a la sección madre
. Por ejemplo,
[colores1]
color1 = #ff00ff
[colores2]
inherit = colores1
color2 = #ffaaff
inherit = colores1 color2 = #ffa0ff
En el caso de que quieras que una sección herede de varias secciones, tienes que utilizar el formato,
inherit = seccion1 seccion2
Incluyendo otros archivos
Con el objetivo de simplificar el archivo de configuración te interesará que parte de la definición o configuración esté en archivos separados. Esto no es solo por cuestión de simplificar, sino también por poder reutilizar estos parámetros en distintos archivos de configuración, y sobre todo por que la configuración quede lo mas limpia posible.
Para incluir un archivo de configuración en otro lo puedes hacer utilizando la siguiente sintaxis,
[seccion]
include-file = /ruta/absoluta/archivo.ini
Si no solo quieres incluir un archivo, sino que quieres incluir todos los que se encuentran en un mismo directorio, en lugar de hacerlo uno a uno, puedes utilizar include-directory
, como en el ejemplo siguiente,
[seccion]
include-directory = /ruta/absoluta/directorio
Imagen de portada de Chris Leipelt en Unsplash