> [!left-bubble] ![[claude-san-minichara.webp]]
> 本ページの内容は[[Claude Code]]がまとめた実装ログです。
> [!warning]
> この対応は[[Obsidian Mobile]]で動作しなくなるので注意。
---
**作業日時**: 2025/06/29 18:49:18
**対応Issue**: [#354](https://github.com/tadashi-aikawa/obsidian-various-complements-plugin/issues/354)
**概要**: プレフィックスマッチによるパス除外機能を拡張し、Globパターンをサポートする機能を実装
## 実装概要
GitHub Issue #354 で要求されていた、suffix path pattern(`**/attachments`など)による柔軟なパス除外機能を実装しました。現在のプレフィックス除外機能と並行して動作し、micromatchライブラリを使用した高性能なGlobマッチングを提供します。
## 初回実装(基本機能)
### 1. 依存関係の追加
**package.json**:
```json
"dependencies": {
"micromatch": "^4.0.5"
}
"devDependencies": {
"@types/micromatch": "^4.0.6"
}
```
### 2. Globマッチング機能の実装
**src/util/glob.ts**:
```typescript
import micromatch from "micromatch";
export function isMatchedGlobPatterns(
path: string,
patterns: string[]
): boolean {
if (patterns.length === 0) {
return false;
}
try {
return micromatch.isMatch(path, patterns);
} catch (error) {
console.warn(`Invalid glob pattern detected: ${error}`);
return false;
}
}
```
### 3. 設定項目の追加
**src/setting/settings.ts**:
```typescript
// 型定義
excludeCurrentVaultPathGlobPatterns: string[];
excludeInternalLinkPathGlobPatterns: string[];
// デフォルト値
excludeCurrentVaultPathGlobPatterns: [],
excludeInternalLinkPathGlobPatterns: [],
```
### 4. プロバイダーへの機能追加
**CurrentVaultWordProvider.ts**:
- Globパターンによる除外判定を追加
- `setSettings`メソッドにGlobパターン配列を追加
- プレフィックス除外と並行動作
**InternalLinkWordProvider.ts**:
- 同様にGlobパターン除外機能を追加
- `refreshWords`メソッドの引数に`excludePathGlobPatterns`を追加
### 5. 設定UIの実装
**Current Vault & Internal Link Complement**:
```typescript
new Setting(containerEl)
.setName("Exclude path glob patterns")
.setDesc("Glob patterns to exclude files. Supports wildcards like **/attachments, **/*.png, etc.")
.addTextArea((tac) => {
const el = tac
.setValue(settings.excludeCurrentVaultPathGlobPatterns.join("\n"))
.setPlaceholder("**/attachments\n**/*.png")
.onChange(async (value) => {
settings.excludeCurrentVaultPathGlobPatterns = smartLineBreakSplit(value);
await this.plugin.saveSettings();
this.display();
});
});
```
### 6. テストの実装
**src/util/glob.test.ts**:
- 基本的なGlobパターンマッチングのテスト
- エラーハンドリングのテスト
- 複数パターン(OR論理)のテスト
- 全12テストケース
## フィードバック対応(設計改善)
### 指摘事項
1. 設定項目名に `path` という文言が含まれていない(本文のワードと勘違いされる恐れ)
2. 設定項目の型を `string` ではなく `string[]` にする(他の設定項目との一貫性)
### 修正内容
#### 1. 設定項目名の変更
```typescript
// 変更前
excludeCurrentVaultGlobPatterns: string;
excludeInternalLinkGlobPatterns: string;
// 変更後
excludeCurrentVaultPathGlobPatterns: string[];
excludeInternalLinkPathGlobPatterns: string[];
```
#### 2. 型の変更とユーティリティ関数の簡素化
- `parseGlobPatterns` 関数を削除(不要になったため)
- 直接 `string[]` を受け取るように変更
- `smartLineBreakSplit` 関数を使用(既存のWordPatternsと同じ実装)
#### 3. プロバイダーの更新
- AutoCompleteSuggest.tsで `parseGlobPatterns` の呼び出しを削除
- 直接配列を渡すように変更
#### 4. 設定UIの改善
**excludeCurrentVaultWordPatterns の実装パターンに合わせて修正**:
```typescript
.setValue(this.plugin.settings.excludeCurrentVaultPathGlobPatterns.join("\n"))
.onChange(async (value) => {
this.plugin.settings.excludeCurrentVaultPathGlobPatterns = smartLineBreakSplit(value);
await this.plugin.saveSettings();
this.display();
});
```
## パフォーマンス警告の実装
### 課題
Globパターンマッチングはプレフィックスマッチより処理負荷が高いため、適切な使い分けをユーザーに促す必要がある。
### 実装方針
設定値に応じて動的に警告を表示する方式を採用(常時表示ではなく)。
### 実装内容
#### 1. 条件付き警告表示
```typescript
if (this.plugin.settings.excludeCurrentVaultPathGlobPatterns.length > 0) {
containerEl.createEl("div", {
text: "⚠ Glob patterns add processing overhead. Use prefix path patterns above for better performance when possible.",
cls: "various-complements__settings__warning",
});
}
```
#### 2. リアルタイム更新機能
```typescript
.onChange(async (value) => {
this.plugin.settings.excludeCurrentVaultPathGlobPatterns = smartLineBreakSplit(value);
await this.plugin.saveSettings();
this.display(); // 警告の表示/非表示を即座に更新
});
```
### 動作仕様
- **警告表示条件**: Globパターンが1つ以上設定されている場合のみ
- **リアルタイム更新**: パターン入力/削除時に即座に警告の表示/非表示が切り替わる
- **表示位置**: 設定項目の直前(既存の partial match 警告と同じ方式)
## 技術的詳細
### 使用ライブラリ
- **micromatch v4.0.7**: 高性能、現代標準のGlobマッチングライブラリ
- **選択理由**: minimatchより高速、活発なメンテナンス、豊富な機能
### パフォーマンス考慮
- エラーハンドリング付きで安全な実装
- 無効なパターンでもアプリケーションがクラッシュしない
- 既存のプレフィックス除外機能は維持(後方互換性)
### 使用例
**問題解決パターン(Issue #354 の要求)**:
```
**/attachments
```
**その他の便利なパターン**:
```
**/*.{png,jpg,gif}
Private/**
**/temp/**
```
## 検証結果
### テスト実行結果
- ✅ 型チェック: エラーなし
- ✅ 全テスト: 440/440通過
- ✅ カバレッジ: 96.59%維持
- ✅ Globテスト: 8/8通過
### 最終確認事項
- [x] 設定項目名に "Path" を含む
- [x] 型は `string[]` で一貫性確保
- [x] パフォーマンス警告の動的表示
- [x] リアルタイム警告更新
- [x] 既存機能との並行動作
- [x] 後方互換性の維持
## まとめ
GitHub Issue #354 で要求されていた柔軟なパス除外機能を完全に実装しました。プレフィックスマッチでは対応できない複雑なパターン(`**/attachments`など)に対応し、適切なパフォーマンス警告も併せて提供することで、ユーザーが目的に応じて最適な方法を選択できるようになりました。
**主な成果**:
- 柔軟なGlobパターンによるパス除外機能
- 高性能なmicromatchライブラリの採用
- 既存機能との一貫性を保った設計
- 適切なユーザーガイダンスとパフォーマンス警告
- 包括的なテストと品質保証
この実装により、ユーザーは手動でフルパスを設定することなく、様々なパターンでファイル除外が可能になりました。