ホームページ > バックエンド開発 > Python チュートリアル > コマンド データベースを使用してランチャー拡張機能を開発する

コマンド データベースを使用してランチャー拡張機能を開発する

Susan Sarandon
リリース: 2025-01-06 20:19:41
オリジナル
721 人が閲覧しました

週末、私は Reddit 経由で Flow Launcher のプラグインを含むプロジェクトを見つけました。 Ubuntu Linux 環境用に fzf および rofi バージョンを作成しましたが、それを uLauncher に移植するのはどれほど難しいだろうかと考えました。

Develop a ulauncher extension with a command database

ここに私がやったことを記録します。

1. ~/.local/share/ulauncher/extensions/ 内

新しいディレクトリを作成します。私の場合、 ~/.local/share/ulauncher/extensions/com.github.ubuntupunk.ulauncher-vim

を作成しました。

2. 次のファイルをタッチします。

├── images
│   └── icon.png
├── versions.json
├── manifest.json
└── main.py
ログイン後にコピー

3.versions.json に次のボイラープレートを配置します。

[
  {"required_api_version": "2", "commit": "master"}
]
ログイン後にコピー

4.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"
    }
  ]
}
ログイン後にコピー

5. 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()
ログイン後にコピー

6. 次に、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"
    }
  ]
ログイン後にコピー

7. 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())
ログイン後にコピー

8. 次の内容で db フォルダーを作成します。

commands.json

構造例:

{
  "categories": {
    "navigation": {
      "name": "Navigation",
      "patterns": [
        "scroll",
        "jump",
        "goto",
        "position"
      ],
      "subcategories": {
        "cursor": {
          "name": "Cursor Movement",
          "patterns": [
            "move[s]? cursor",
            "^[hjkl]$",
            "^[HJKL]$",
            "^[wWeEbB]$"
          ]
        },
ログイン後にコピー

commands.json 全体はここで確認できます。

9. KeywordQueryEventListener を変更して、検索機能を実装します。

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)
ログイン後にコピー

10. URL を開く機能を追加します。 Vim コマンド URL を開くには、ウェブブラウザをインポートし、on_enter アクションを変更する必要があります。

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)
ログイン後にコピー

11. 主な変更点は次のとおりです。

  • OpenUrlAction インポートを追加しました
  • HideWindowAction を OpenUrlAction に置き換えました
  • コマンドの rtorr_description を使用して URL を構築しました

12. 完全なプロジェクト コードはここで参照できます。

ulauncher-vim リポジトリ

ここに ulauncher 拡張機能があります

参考文献

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

以上がコマンド データベースを使用してランチャー拡張機能を開発するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート