Au cours du week-end, j'ai récupéré un projet via Reddit impliquant un plugin pour Flow Launcher. J'ai créé une version fzf et rofi pour mon environnement Ubuntu Linux, puis j'ai pensé : à quel point cela peut-il être difficile de la porter sur uLauncher ?

Ici, je documente ce que j'ai fait.
créez un nouveau répertoire. Dans mon cas, j'ai créé ~/.local/share/ulauncher/extensions/com.github.ubuntupunk.ulauncher-vim
├── images │ └── icon.png ├── versions.json ├── manifest.json └── main.py
[
{"required_api_version": "2", "commit": "master"}
]
{
"required_api_version": "2",
"name": "Demo extension",
"description": "Extension Description",
"developer_name": "John Doe",
"icon": "images/icon.png",
"options": {
"query_debounce": 0.1
},
"preferences": [
{
"id": "demo_kw",
"type": "keyword",
"name": "Demo",
"description": "Demo extension",
"default_value": "dm"
}
]
}
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.HideWindowAction import HideWindowAction
class DemoExtension(Extension):
def __init__(self):
super().__init__()
self.subscribe(KeywordQueryEvent, KeywordQueryEventListener())
class KeywordQueryEventListener(EventListener):
def on_event(self, event, extension):
items = []
for i in range(5):
items.append(ExtensionResultItem(icon='images/icon.png',
name='Item %s' % i,
description='Item description %s' % i,
on_enter=HideWindowAction()))
return RenderResultListAction(items)
if __name__ == '__main__':
DemoExtension().run()
{
"required_api_version": "2",
"name": "Vim Prompter",
"description": "Vim cheatsheet helper",
"developer_name": "David Robert Lewis",
"icon": "images/icon.png",
"options": {
"query_debounce": 0.1
},
"preferences": [
{
"id": "vm_kw",
"type": "keyword",
"name": "Vim",
"description": "Search for Vim commands",
"default_value": "vm"
}
]
class VmExtension(Extension):
def load_vim_commands(self):
"""Load Vim commands from JSON file."""
package_dir = os.path.dirname(os.path.abspath(__file__))
full_path = os.path.join(package_dir, 'db', 'commands.json')
with open(full_path, 'r') as file:
return json.load(file)
def __init__(self):
super().__init__()
self.vim_commands = self.load_vim_commands()
self.subscribe(KeywordQueryEvent, KeywordQueryEventListener())
commandes.json
exemple de structure :
{
"categories": {
"navigation": {
"name": "Navigation",
"patterns": [
"scroll",
"jump",
"goto",
"position"
],
"subcategories": {
"cursor": {
"name": "Cursor Movement",
"patterns": [
"move[s]? cursor",
"^[hjkl]$",
"^[HJKL]$",
"^[wWeEbB]$"
]
},
Vous pouvez voir l'intégralité du commands.json ici.
class KeywordQueryEventListener(EventListener):
def on_event(self, event, extension):
query = event.get_argument() or ""
items = []
# If no query, show all commands (limited to first 8)
commands_to_show = extension.vim_commands
# If there's a query, filter commands
if query:
commands_to_show = [
cmd for cmd in extension.vim_commands
if query.lower() in cmd['command'].lower() or
query.lower() in cmd['description'].lower()
]
# Limit results to first 8 matches
for cmd in commands_to_show[:8]:
items.append(ExtensionResultItem(
icon='images/icon.png',
name=cmd['command'],
description=f"{cmd['name']} - {cmd['description']}",
on_enter=HideWindowAction()
))
return RenderResultListAction(items)
from ulauncher.api.shared.action.OpenUrlAction import OpenUrlAction
class KeywordQueryEventListener(EventListener):
def on_event(self, event, extension):
query = event.get_argument() or ""
items = []
commands_to_show = extension.vim_commands
if query:
commands_to_show = [
cmd for cmd in extension.vim_commands
if query.lower() in cmd['command'].lower() or
query.lower() in cmd['description'].lower()
]
for cmd in commands_to_show[:8]:
url = f"https://vim.rtorr.com/#:~:text={cmd['rtorr_description']}"
items.append(ExtensionResultItem(
icon='images/icon.png',
name=cmd['command'],
description=f"{cmd['name']} - {cmd['description']}",
on_enter=OpenUrlAction(url)
))
return RenderResultListAction(items)
dépôt ulauncher-vim
et l'extension ulauncher ici
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
La différence entre passerelle et routeur
Utilisation de la fonction sqrt en Java
Enregistrez-vous dans un emplacement virtuel sur DingTalk
Les moments WeChat ne peuvent pas être actualisés
ASUS x402c
La différence entre les notes de bas de page et les notes de fin
Comment convertir un singe en wav
Quels sont les paramètres du chapiteau ?