> 백엔드 개발 > 파이썬 튜토리얼 > 명령 데이터베이스를 사용하여 ulauncher 확장 개발

명령 데이터베이스를 사용하여 ulauncher 확장 개발

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. 매니페스트.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. 이제 매니페스트.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. 키워드쿼리이벤트리스너를 수정하여 검색 기능을 구현합니다.

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을 열려면 webbrowser를 가져오고 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

위 내용은 명령 데이터베이스를 사용하여 ulauncher 확장 개발의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿