
703 - ¿Y si pudieras abrir TODO en Linux con solo unas teclas?
Descubre la forma mas eficiente de abrir aplicaciones y cualquier otra cosa en Linux, utiliza un lanzador de aplicaciones como #ulaucher y déjate de menús
Me gusta la forma de iniciar aplicaciones en GNOME. Es con diferencia la forma mas eficiente. Mucho mas que ir navegando entre menús y menús utilizando el ratón para ello. Con dos o tres teclas habrás iniciado tu aplicación, mientras que con el ratón es muy probable que hayas necesitado una decena de clics. Pero no solo esto, también tienes la ventaja de que no solo abres aplicaciones, si no que tienes el punto de inicio de casi cualquier cosa que puedas imaginar. Y esto es precisamente, algo que también puedes tener con Ulauncher, pero con una ventaja clara, las extensiones, no solo las extensiones que vienen por defecto, ni las que comparte la comunidad, si no que también están las que puedes hacer de forma sencilla. Y es que con Ulauncher puedes abrir todo con solo unas teclas, y es precisamente de lo que te quiero hablar en este episodio.

¿Y si pudieras abrir TODO en Linux con solo unas teclas?
¿Que es un lanzador de aplicaciones?
Antes de hablarte sobre Ulauncher y porque me he decido a utilizar este lanzador de aplicaciones, quiero aclarar, para aquellos que no lo conozcan que es un lanzador de aplicaciones.
Un lanzador de aplicaciones es una herramienta que te permite acceder de forma rápida a tus aplicaciones, archivos, comandos o acciones en el sistema operativo sin tener que navegar por menús o escritorios.
En lugar de hacer clic por menús tradicionales, simplemente escribes parte del nombre de lo que necesitas y el lanzador lo encuentra y lo ejecuta por ti. Piensa en ello como una búsqueda súper rápida combinada con un acceso directo inteligente.
Los lanzadores son especialmente populares entre quienes buscan velocidad, productividad y un flujo de trabajo más eficiente, ya que minimizan el uso del ratón y mejoran el acceso a funciones avanzadas del sistema.
🚀 ¿Qué es Ulauncher?
Una vez aclarado qué es un lanzador de aplicaciones, ahora toca centrarme en este episodio, y en concreto en esta herramienta por la que me decantado en mi uso de Niri, el tiling del que te hablé en el episodio 701 titulado Niri, un gestor de ventanas diferente.
Ulauncher es un lanzador de aplicaciones moderno, rápido y altamente extensible diseñado específicamente para escritorios Linux. Es comparable a herramientas como Alfred en macOS o Rofi en entornos más técnicos, pero con una experiencia más amigable y enfocada en la productividad diaria.
Está desarrollado en Python y diseñado para ser ligero y veloz, lo que lo convierte en una excelente opción incluso en equipos con recursos limitados.
Por supuesto, y como ya te has imaginado, he estado buscando algún lanzador que esté implementado en Rust, por aquello de que seguro iba a ser más rápido, simplemente por estar compilado. Sin embargo, como en tantas otras situaciones, no solo importa la herramienta si no también el ecosistema de extensiones. Y en este caso, al menos hasta donde yo he llegado, el ecosistema de complementos para Ulauncher supera al resto de calle, y es esta razón la que me ha llevado a quedarme con Ulauncher.
Principales características de Ulauncher:
- Búsqueda inteligente mediante lógica difusa de forma que no necesitas escribir con precisión. Por ejemplo, si escribes
firf
, Ulauncher detectará que probablemente querías decirFirefox
. - Interfaz limpia y personalizable, lo que te permite cambiar temas y colores para adaptarlo a tu estilo o entorno de escritorio.
- Extensiones en Python. Esto es precisamente lo que me ha hecho decantarme por este lanzador, dado que Ulauncher permite instalar o desarrollar extensiones para añadir funcionalidades como calculadora, traductor, buscadores web, control de Git, Docker, etc. Así, yo también implementé mis propias extensiones que te contaré mas adelante.
- Arranque instantáneo, dado que se ejecuta en segundo plano y responde al instante cuando se invoca.
- Atajo de teclado configurable, que por defecto se activa con
Ctrl + Space
, pero puedes cambiarlo fácilmente. - Ulauncher recuerda tus elecciones más frecuentes y te sugiere lo que sueles abrir. De esta forma, siempre eres mas eficiente, dado que lo último que hiciste siempre está en las primeras posiciones.
¿Por qué usar Ulauncher?
Porque ahorra tiempo. Reduce la necesidad de buscar iconos, abrir terminales o navegar por carpetas. Es una herramienta discreta pero poderosa que mejora enormemente la eficiencia del día a día en Linux, especialmente si trabajas con muchas aplicaciones, herramientas o comandos distintos.
Además, gracias a su comunidad, puedes instalar extensiones con un solo clic desde su catálogo online o incluso crear las tuyas propias si tienes conocimientos básicos de Python.
Creo que aquí, es justo, donde reside el gran potencial de este lanzador de aplicaciones, en la extensiones, y en la facilidad de crear tus propias extensiones. Por que lo cierto, es que es relativamente sencillo.
Es todo un acierto por parte del desarrollador de la aplicación, no solo haber facilitado la implementación de extensiones, si no también lo sencillo que es instalarlos desde GitHub, y esto es todo un puntazo.
Mis extensiones
Actualmente tengo instaladas las siguientes extensiones,
- ulauncher-pass-paster
- System
- Emoji
- Terminal Runner
- Better file browser
- Gitmoji
- Calculate Anything
- Unicode extension
- Extension List
- crates
- Fuzzy Finder
- Gemini Direct
- PackSearch
- Niri Windows
- Firefox Launcher
Indicarte que de todas estas, tanto crates como Niri Windows son de implementación propia. Y visto lo sencillo que es, no dudo en implementar mas extensiones.
Como puedes ver de este listado de extensiones, prácticamente se puede hacer casi cualquier cosa. Es mas, casi se podría decir, que lo de menos es lo de lanzar aplicaciones, que tienes muchas mas opciones para hacer.
Como hacer tu propia extensión.
Realmente, hacer una extensión para ULauncher es algo relativamente sencillo. Se trata de una extensión en Python, con un par de archivos adicionales en formato Jason. En concreto,
- ˋversions.jsonˋ donde se indica la versión de ULauncher requerida y que commit o Rama tiene que utilizar.
- ˋ manifest.jsonˋ que indica meta información correspondiente a la extensión que estás implementando. Meta infomración como la descripción, el nombre, el icono, y las preferencias que tiene tu extensión. Así como otros parámetros adicionales para que todo funcione como se espera.
- ˋmain.pyˋ donde se encuentra propiamente el código de la extensión.
Por ejemplo, el código de la extensión que he implementado tiene un aspecto como el que te muestro a continuación,
import requests
import logging
from ulauncher.api.client.Extension import Extension
from ulauncher.api.client.EventListener import EventListener
from ulauncher.api.shared.event import KeywordQueryEvent, ItemEnterEvent
from ulauncher.api.shared.item.ExtensionResultItem import ExtensionResultItem
from ulauncher.api.shared.action.RenderResultListAction import RenderResultListAction
from ulauncher.api.shared.action.OpenUrlAction import OpenUrlAction
logger = logging.getLogger(__name__)
class CratesExtension(Extension):
def __init__(self):
super(NpmjsExtension, self).__init__()
self.subscribe(KeywordQueryEvent, KeywordQueryEventListener())
self.subscribe(ItemEnterEvent, ItemEnterEventListener())
class KeywordQueryEventListener(EventListener):
def on_event(self, event, extension):
searchKeyword = event.get_argument()
searchSize = extension.preferences['npmjs_max_search_result_size']
if not searchKeyword:
return
url = f"https://crates.io/api/v1/crates?search={searchKeyword}&per_page={searchSize}&page=1"
# logger.debug(url)
response = requests.get(url, headers={'User-Agent': 'ulauncher-crates'})
data = response.json()
# logger.debug(data)
items = []
for crate in data['crates']:
# logger.debug(package)
description = f"{crate['description']} ({crate['downloads']})"
items.append(ExtensionResultItem(icon='images/icon.png',
name=crate['name'],
description=description,
on_enter=OpenUrlAction(crate['repository'])))
return RenderResultListAction(items)
class ItemEnterEventListener(EventListener):
def on_event(self, event, extension):
data = event.get_data()
return RenderResultListAction([ExtensionResultItem(icon='images/icon.png',
name=data['name'],
description=data['description'],
on_enter=OpenUrlAction(data['respository']))])
if __name__ == '__main__':
CratesExtension().run()
Como ves es algo relativamente sencillo, y que seguro vas a poder adaptar a tus necesidades.
Tienes todo el código de la aplicación disponible en el repositorio de GiHub
Conclusión
Lo que mas me ha fascinado de este lanzador, es como de costumbre su grado de personalización, y la facilidad de añadir plugins, y por supuesto de crearlos tu mismo.
No hace falta ser un programador de altos vuelos, ni nada por el estilo. Es mas, actualmente con herramientas como ChatGPT o Gemini, en un momento puedes tenerlo adaptado a tus propias necesidades.
Esto es un complento ideal para cualquier escritorio, puede mejorar tu productividad de forma realmente exponencial.
Vamos, lo que viene funcionando en Windows desde al menos Windows 3.0. FDO.: Tu archienemigo.