공식 플러그인 예제 분석
Lertaro.PluginSdk의 여러 인터페이스가 실전에서 어떻게 협력하는지 이해하기 위해 공식 리포지토리에 포함된 4가지 대표 오픈소스 플러그인의 구현 패턴을 분석합니다.
1. CoreExtensions —— 액션, Shell 메뉴 및 퀵 패널
CoreExtensions 플러그인은 Lertaro의 핵심 기능 확장 패키지로 IPlugin, IActionProvider, IConfigurable 및 여러 하위 프로바이더를 구현합니다.
핵심 구현 사항
- 정적 결과 액션 (
IActionProvider.GetActions()): 열기 및 탐색기에서 위치 찾기, 경로와 파일 복사, 즐겨찾기 추가, 이름 바꾸기, 명령 프롬프트, 삭제, 관리자 권한 실행 등 기본 파일 액션 제공. - 네이티브 Shell 메뉴 통합 (
IDynamicActionProvider):ShellMenuActionProvider를 통해 Windows Shell COM 인터페이스와 연동하여 "보내기", 7-Zip, VS Code 등 계단식 우클릭 메뉴를Ctrl+O액션 메뉴 내에 렌더링. - 스키마 기반 설정 폼 (
IConfigurable): 그룹화(Group), 문자열 목록(StringList), 단축키 녹화(Hotkey)를 포함한 폼 스키마를 정의하여 XAML 작성 없이 설정 센터에 네이티브 UI 자동 생성. - 다양한 퀵 패널 탭 (
IQuickPanelTabProvider):FavoritesTabProvider/HistoryTabProvider: 디스크에서 다시 읽는 대신 호스트가 이미 로드해 둔 즐겨찾기와 기록을 그대로 결과로 넘깁니다. 기록 조회는Task.Run으로 UI 스레드 밖으로 넘기므로, 패널을 소환할 때 그 조회를 기다리는 일이 없습니다.WindowsRecentTabProvider: 백그라운드에서Recent폴더를 탐색하고 COM으로 바로가기 대상을 해석하여Metadata.Modified를 채워 정렬 지원.LastDirectoryTabProvider/RecentFilesTabProvider: 호스트가 제공하는ExplorerPathService및RecentFilesService를 직접 조회.
2. PinyinAlias —— 비 ASCII 별칭 변환 엔진
PinyinAlias 플러그인은 중국어 파일명에 대한 병음 전체 및 초성 검색을 지원하며 IAliasLiveMatcherProvider(IAliasProvider 확장)와 ITranslationProvider를 구현합니다.
핵심 구현 사항
- 입출력 문자 집합 경계 (
InputRanges/OutputRanges): 입력 경계를 CJK 한자 블록 하나(U+3007–U+9FFD)로, 출력 범위를 소문자a–z로 선언. 호스트는 이 경계를 활용해 한자와 영문이 섞인 쿼리를 자면 매칭과 병음 매칭으로 자동 분할. - 빠른 사전 검사 (
CanHandle(text)): 별칭 생성 전 한자가 포함되어 있는지 먼저 스캔하여 순수 영문 문자열은 즉시false를 반환하고 후속 처리를 건너뜀. - 발음 라이브 일치(
IAliasLiveMatcherProvider): 발음을 더 이상 인덱스에 저장하지 않습니다. 플러그인은 검색어마다 바뀐 적인 비트 병렬 일치기(ASCII 문자/숨자 2–63개)를 구성하고, 호스트가 후보 이름의 문자를 하나씩 검사합니다. 매 문자는 해당 가지 발음 중 비어있는 접두를 사용하므로, 일치 구간은 항상 연속되어야 하며 다음자 이름도 추가 용량이 들지 않습니다.GetAliases(text)는 이제 번체가의 간체 표기만 출력합니다. - 임베디드 다국어 및 스레드 안전 캐싱:
ITranslationProvider를 통해 표시 이름을 다국어화하고, 내부에서는lock기반 딕셔너리로 JSON 번역을 캐싱하여 반복 파싱 방지.
3. FlowLauncherBridge —— 커뮤니티 플러그인 호환 및 격리 런타임
FlowLauncherBridge 플러그인은 외부 Flow Launcher 생태계를 Lertaro에 통합하기 위한 대규모 브리지 시스템입니다.
핵심 구현 사항
- 다중 언어 프로세스 간 브리지: C# (.NET), Python 3.12, Node.js v20 LTS 및
.exe플러그인을 원활히 실행. - 완전 격리 독립 런타임: Python / Node.js 런타임을 사용자별 데이터 폴더가 아니라 Lertaro의 공용 데이터 디렉토리(
SharedDataDirectory\FlowData\PythonEmbeded-{arch}) 아래에 자동 배치합니다. 각 플러그인은 자기 인터프리터와 리디렉션된 표준 입출력으로 JSON-RPC를 주고받으며, 명명된 파이프는 쓰지 않고 시스템 PATH에도 손대지 않습니다. - 동적 설정 폼 및 WebView2 리치 미리보기: 외부 플러그인의
SettingsTemplate.yaml/.json을PluginConfigSchema로 동적 매핑하고 사전이나 날씨 등의 HTML 카드를 QuickLook 내에 렌더링.
4. FileUnlocker —— 파일 점유 해제 액션
FileUnlocker는 Windows Restart Manager API로 파일 점유를 조회하고 해제를 요청하는 단일 액션 플러그인의 예입니다.
핵심 구현 사항
- 단일 선택 제한: 존재하는 파일 하나를 선택했을 때만 액션을 제공하여 폴더나 다중 선택에 대한 모호한 요청을 방지.
- 프로세스 정보 표시: 점유 프로세스 이름, PID, 실행 파일 경로를 표시하고 파일 상태 변화에 대응할 새로 고침을 제공.
- 요청 기반 해제: 점유 프로세스에 파일 해제를 요청하며, 프로세스가 없거나 작업 중일 때 해제 버튼을 비활성화.
- 호스트 창 프레임: WPF 뷰를 SDK의 테마 지원
PluginWindow대화상자에 넣어 플러그인이 테마, DPI, 작업 표시줄, Alt+Tab 처리를 중복 구현하지 않도록 구성.