Skip to content

Ejemplos de plugins ​

Para ayudar a los desarrolladores a comprender cómo interactúan las interfaces de Lertaro.PluginSdk, este capítulo analiza cuatro plugins representativos incluidos en el repositorio de Lertaro.

1. CoreExtensions —— Acciones, menús Shell y Panel rápido ​

El plugin CoreExtensions constituye el paquete de extensiones principal de Lertaro e implementa IPlugin, IActionProvider, IConfigurable y varios proveedores secundarios.

Puntos clave de implementación ​

  • Acciones estáticas (IActionProvider.GetActions()): Registra acciones esenciales sobre archivos, como abrir y ubicar elementos, copiar rutas y archivos, añadir a Favoritos, cambiar nombres, usar la consola, eliminar y ejecutar como Administrador.
  • Integración con menús Shell de Windows (IDynamicActionProvider): Se comunica con las interfaces COM del Shell mediante ShellMenuActionProvider, renderizando menús contextuales completos (con submenús como "Enviar a", 7-Zip, VS Code) dentro del menú Ctrl+O.
  • Formularios de configuración por esquemas (IConfigurable): Define esquemas con grupos anidados (Group), listas de cadenas (StringList) y asignación de atajos (Hotkey), generando formularios nativos en Configuración sin escribir XAML.
  • Pestañas para el Panel rápido (IQuickPanelTabProvider):
    • FavoritesTabProvider / HistoryTabProvider: sirven los favoritos y el historial que el anfitrión ya tiene cargados, en lugar de volver a leerlos del disco; la consulta del historial se despacha fuera del hilo de interfaz (Task.Run), así que invocar el panel nunca espera por ella.
    • WindowsRecentTabProvider: Recorre la carpeta Recent en segundo plano, resuelve accesos directos COM y añade Metadata.Modified para su ordenación.
    • LastDirectoryTabProvider / RecentFilesTabProvider: Consulta directamente ExplorerPathService y RecentFilesService del anfitrión.

2. PinyinAlias —— Motor de transliteración para caracteres no ASCII ​

PinyinAlias proporciona búsqueda por pinyin completo y siglas para nombres de archivos en chino, implementando IAliasLiveMatcherProvider (una IAliasProvider) e ITranslationProvider.

Puntos clave de implementación ​

  • Límites de alfabetos (InputRanges / OutputRanges): Declara un único rango ideográfico CJK (U+3007–U+9FFD) como límite de entrada y a–z en minúsculas como salida, permitiendo dividir consultas mixtas en segmentos literales y de alias.
  • Comprobación previa rápida (CanHandle(text)): Detecta si el texto contiene caracteres chinos antes de generar alias, devolviendo false inmediatamente para cadenas en inglés.
  • Coincidencia de lecturas en vivo (IAliasLiveMatcherProvider): las lecturas ya no se escriben en el índice. El plugin construye un comparador bit-paralelo inmutable por término de búsqueda (2–63 letras/dígitos ASCII) y el host lo ejecuta sobre los caracteres del propio candidato: cada carácter consume un prefijo no vacío de una de sus lecturas, así que una coincidencia es siempre un tramo contiguo y un nombre polifónico no ocupa nada extra. GetAliases(text) ya solo emite la escritura simplificada de un nombre tradicional.
  • Localización incrustada y caché segura: Traduce el nombre del plugin mediante ITranslationProvider y almacena los JSON analizados en un diccionario protegido con lock.

3. FlowLauncherBridge —— Compatibilidad entre ecosistemas y entornos aislados ​

El plugin FlowLauncherBridge demuestra la creación de un sistema de puente a gran escala para integrar los ecosistemas externos de la comunidad en Lertaro.

Puntos clave de implementación ​

  • Puente multiproceso y multilenguaje: Ejecuta plugins escritos en C# (.NET), Python 3.12, Node.js v20 LTS y binarios .exe.
  • Entornos autónomos aislados: Despliega los entornos aislados de Python y Node.js bajo el directorio de datos compartido de Lertaro (SharedDataDirectory\FlowData\PythonEmbeded-{arch}), no en la carpeta de datos de cada usuario. Cada plugin habla con su intérprete a través de la entrada/salida estándar redirigida que transporta JSON-RPC: no hay tubería con nombre y nunca se toca la variable PATH del sistema.
  • Formularios dinámicos y vistas previas en WebView2: Asigna formularios SettingsTemplate.yaml/.json a PluginConfigSchema y renderiza tarjetas interactivas (diccionarios, tiempo, etc.) dentro de QuickLook.

4. FileUnlocker —— Acción para liberar la ocupación de archivos ​

FileUnlocker muestra un plugin de acción especializada que consulta la ocupación de archivos mediante Windows Restart Manager y solicita su liberación.

Puntos clave de implementación ​

  • Restricción de selección única: Solo ofrece la acción para un archivo existente seleccionado, evitando solicitudes ambiguas sobre carpetas o selecciones múltiples.
  • Información de procesos: Muestra el nombre, PID y ruta del ejecutable de cada proceso que usa el archivo, con una opción de actualización para los cambios de estado.
  • Liberación mediante solicitud: Solicita a los procesos implicados que liberen el archivo y desactiva el botón si no se detecta ningún proceso o hay una operación en curso.
  • Marco de ventana del anfitrión: Aloja la vista WPF en el diálogo PluginWindow adaptado al tema del SDK, sin duplicar en el plugin la gestión del tema, DPI, barra de tareas o Alt+Tab.