Rumah > pembangunan bahagian belakang > Tutorial Python > Membangunkan sambungan ulauncher dengan pangkalan data arahan

Membangunkan sambungan ulauncher dengan pangkalan data arahan

Susan Sarandon
Lepaskan: 2025-01-06 20:19:41
asal
735 orang telah melayarinya

Pada hujung minggu, saya mengambil projek melalui Reddit yang melibatkan pemalam untuk Flow Launcher. Saya mencipta versi fzf dan rofi untuk persekitaran Linux Ubuntu saya, dan kemudian berfikir, betapa sukarnya untuk memindahkannya ke uLauncher?

Develop a ulauncher extension with a command database

Di sini saya mendokumentasikan perkara yang saya lakukan.

1. Di dalam ~/.local/share/ulauncher/extensions/

buat dir baharu. Dalam kes saya, saya mencipta ~/.local/share/ulauncher/extensions/com.github.ubuntupunk.ulauncher-vim

2. Sentuh fail berikut:

├── images
│   └── icon.png
├── versions.json
├── manifest.json
└── main.py
Salin selepas log masuk

3. Dalam versions.json letakkan boilerplate berikut:

[
  {"required_api_version": "2", "commit": "master"}
]
Salin selepas log masuk

4. Dalam manifest.json

{
  "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"
    }
  ]
}
Salin selepas log masuk

5. Dalam main.py

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()
Salin selepas log masuk

6. Sekarang edit manifest.json

{
  "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"
    }
  ]
Salin selepas log masuk

7. Tambahkan fungsi pemuatan arahan ke main.py

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())
Salin selepas log masuk

8. Cipta folder db dengan yang berikut:

commands.json

contoh struktur:

{
  "categories": {
    "navigation": {
      "name": "Navigation",
      "patterns": [
        "scroll",
        "jump",
        "goto",
        "position"
      ],
      "subcategories": {
        "cursor": {
          "name": "Cursor Movement",
          "patterns": [
            "move[s]? cursor",
            "^[hjkl]$",
            "^[HJKL]$",
            "^[wWeEbB]$"
          ]
        },
Salin selepas log masuk

Anda boleh melihat keseluruhan commands.json di sini.

9. Ubah suai KeywordQueryEventListener untuk melaksanakan fungsi carian.

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)
Salin selepas log masuk

10. Tambah fungsi pembukaan URL. Kami perlu mengimport penyemak imbas web dan mengubah suai tindakan on_enter untuk membuka URL arahan Vim

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)
Salin selepas log masuk

11. Perubahan utama ialah:

  • Menambah import OpenUrlAction
  • Menggantikan HideWindowAction dengan OpenUrlAction
  • Membina URL menggunakan rtirr_description arahan

12. Kod projek penuh boleh dilihat di sini:

ulauncher-vim repo

dan sambungan ulauncher di sini

Rujukan

  1. https://dev.to/brpaz/an-introduction-to-ulauncher-extension-development-1m69
  2. https://ext.ulauncher.io/-/github-ubuntupunk-ulauncher-vim

Atas ialah kandungan terperinci Membangunkan sambungan ulauncher dengan pangkalan data arahan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan