https://github.com/tadashi-aikawa/obsidian-another-quick-switcher/issues/21 ## Search targetについて ### 今 | 選択肢 | 対象 | | -------- | -------------------------------------------- | | markdown | Markdownファイル | | backlink | originFileへのリンクがあるMarkdownファイル | | link | originFileからリンクしているMarkdownファイル | ### これから | 選択肢 | 対象 | | -------- | ------------------------------------ | | file | ファイル | | backlink | originFileへのリンクがあるファイル | | link | originFileからリンクしているファイル | - ファイルはincludeかexcludeか? - 最終的には両方必要そう? - 直近だとincludeだけでいいかも ## テスト用特殊データ - [[excalidraw-test.excalidraw]] - ![[Pasted image 20221205133123.png]] ## 検証観点 - [ ] ダイアログを開いて動作確認 - [ ] 拡張子が判別できること - [ ] [[Markdown]] - [ ] 画像ファイル - [ ] [[Canvas (Obsidian)|Canvas]] - [ ] [[Excalidraw]] - [ ] [[Obsidian]]に対応しているファイルは[[Obsidian]]で開くこと - [ ] [[Markdown]] - [ ] 画像ファイル - [ ] [[Canvas (Obsidian)|Canvas]] - [ ] [[Excalidraw]] - [ ] [[Obsidian]]に未対応のファイルは[[OS]]に紐づいたアプリケーションで開くこと - [ ] `*.js` - [ ] `*.css` - [ ] insert to editorが動くこと - [ ] [[Markdown]] - [ ] 画像ファイル - [ ] [[Canvas (Obsidian)|Canvas]] - [ ] [[Excalidraw]] - [ ] `*.js` - [ ] `*.css` - [ ] show backlinksが動くこと - [ ] [[Markdown]] - [ ] 画像ファイル - [ ] [[Canvas (Obsidian)|Canvas]] - [ ] [[Excalidraw]] - [ ] show backlinksが動かないこと - [ ] `*.js` - [ ] `*.css` - [ ] ファイルからリンクされた[[Markdown]]ファイルにて - [ ] [[Backlinks]]に以下のファイルが表示されること - [ ] [[Markdown]] - [ ] [[Excalidraw]] ([[🧊Togowl]] から) - [ ] [[Backlinks]]に以下のファイルが表示されないこと - [ ] [[Canvas (Obsidian)|Canvas]] ([[🧊Togowl]] から) - [[Canvas (Obsidian)|Canvas]]にノートを埋め込んでもリンクとして機能しないっぽい - [ ] [[リンク]]に以下のファイルが表示されること (本ファイルから) - [ ] [[Markdown]] - [ ] 画像ファイル - [ ] [[Canvas (Obsidian)|Canvas]] - [ ] [[Excalidraw]] - [ ] [[Hover Editor]]でも動くこと - [ ] [[Canvas (Obsidian)|Canvas]]ファイルを開いてみる - [ ] メインウィンドウ以外でも動くこと - [ ] [[Canvas (Obsidian)|Canvas]]ファイルを開いてみる - [ ] カレントファイルが空でも動くこと - [ ] [[Canvas (Obsidian)|Canvas]]ファイルを開いてみる - [ ] [[Canvas (Obsidian)|Canvas]]ファイルでは動くこと - [ ] [[Backlinks]]が表示されること - [ ] [[Canvas (Obsidian)|Canvas]]ファイルでは[[リンク]]は動かないこと - [[Canvas (Obsidian)|Canvas]]にノートを埋め込んでもリンクとして機能しないっぽい - [ ] [[Excalidraw]]ファイルでも動くこと - [ ] [[リンク]]が表示されること - [ ] [[Backlinks]]が表示されること ## 検証 ### 何も改修加えていない状態 - [ ] ダイアログを開いて動作確認 - [ ] 拡張子が判別できること - [ ] [[Markdown]] - [ ] 画像ファイル - [ ] [[Canvas (Obsidian)|Canvas]] - [ ] [[Excalidraw]] - [x] [[Obsidian]]に対応しているファイルは[[Obsidian]]で開くこと - [x] [[Markdown]] - [x] 画像ファイル - [x] [[Canvas (Obsidian)|Canvas]] - [x] [[Excalidraw]] - [x] [[Obsidian]]に未対応のファイルは[[OS]]に紐づいたアプリケーションで開くこと - [x] `*.js` - [x] `*.css` - [x] insert to editorが動くこと - [x] [[Markdown]] - [x] 画像ファイル - [x] [[Canvas (Obsidian)|Canvas]] - [x] [[Excalidraw]] - [x] `*.js` - [x] `*.css` - [x] show backlinksが動くこと - [x] [[Markdown]] - [x] 画像ファイル - [x] [[Canvas (Obsidian)|Canvas]] - [x] [[Excalidraw]] - [ ] show backlinksが動かないこと - [x] `*.js` - [ ] `*.css` - [x] ファイルからリンクされた[[Markdown]]ファイルにて - [x] [[Backlinks]]に以下のファイルが表示されること - [x] [[Markdown]] - [x] [[Excalidraw]] ([[🧊Togowl]] から) - [x] [[Backlinks]]に以下のファイルが表示されないこと - [x] [[Canvas (Obsidian)|Canvas]] ([[🧊Togowl]] から) - [[Canvas (Obsidian)|Canvas]]にノートを埋め込んでもリンクとして機能しないっぽい - [x] [[リンク]]に以下のファイルが表示されること (本ファイルから) - [x] [[Markdown]] - [x] 画像ファイル - [x] [[Canvas (Obsidian)|Canvas]] - [x] [[Excalidraw]] - [x] [[Hover Editor]]でも動くこと - [x] [[Canvas (Obsidian)|Canvas]]ファイルを開いてみる - [x] メインウィンドウ以外でも動くこと - [x] [[Canvas (Obsidian)|Canvas]]ファイルを開いてみる - [x] カレントファイルが空でも動くこと - [x] [[Canvas (Obsidian)|Canvas]]ファイルを開いてみる - [x] [[Canvas (Obsidian)|Canvas]]ファイルでは動くこと - [x] [[Backlinks]]が表示されること - [x] [[Canvas (Obsidian)|Canvas]]ファイルでは[[リンク]]は動かないこと - [[Canvas (Obsidian)|Canvas]]にノートを埋め込んでもリンクとして機能しないっぽい - [x] [[Excalidraw]]ファイルでも動くこと - [x] [[リンク]]が表示されること - [x] [[Backlinks]]が表示されること ### beta1リリース前 - [x] ダイアログを開いて動作確認 - [x] 拡張子が判別できること - [x] [[Markdown]] - [x] 画像ファイル - [x] [[Canvas (Obsidian)|Canvas]] - [x] [[Excalidraw]] - [x] [[Obsidian]]に対応しているファイルは[[Obsidian]]で開くこと - [x] [[Markdown]] - [x] 画像ファイル - [x] [[Canvas (Obsidian)|Canvas]] - [x] [[Excalidraw]] - [x] [[Obsidian]]に未対応のファイルは[[OS]]に紐づいたアプリケーションで開くこと - [x] `*.js` - [x] `*.css` - [x] insert to editorが動くこと - [x] [[Markdown]] - [x] 画像ファイル - [x] [[Canvas (Obsidian)|Canvas]] - [x] [[Excalidraw]] - [x] `*.js` - [x] `*.css` - [x] show backlinksが動くこと - [x] [[Markdown]] - [x] 画像ファイル - [x] [[Canvas (Obsidian)|Canvas]] - [x] [[Excalidraw]] - [x] show backlinksが動かないこと - [x] `*.js` - [x] `*.css` - ❌==`hoge.css`と`hoge.css.md`のようなファイルがあるとうまくいかない== - [x] ファイルからリンクされた[[Markdown]]ファイルにて - [x] [[Backlinks]]に以下のファイルが表示されること - [x] [[Markdown]] - [x] [[Excalidraw]] ([[🧊Togowl]] から) - [x] [[Backlinks]]に以下のファイルが表示されないこと - [x] [[Canvas (Obsidian)|Canvas]] ([[🧊Togowl]] から) - [[Canvas (Obsidian)|Canvas]]にノートを埋め込んでもリンクとして機能しないっぽい - [x] [[リンク]]に以下のファイルが表示されること (本ファイルから) - [x] [[Markdown]] - [x] 画像ファイル - [x] [[Canvas (Obsidian)|Canvas]] - [x] [[Excalidraw]] - [x] [[Hover Editor]]でも動くこと - [x] [[Canvas (Obsidian)|Canvas]]ファイルを開いてみる - [x] メインウィンドウ以外でも動くこと - [x] [[Canvas (Obsidian)|Canvas]]ファイルを開いてみる - [x] カレントファイルが空でも動くこと - [x] [[Canvas (Obsidian)|Canvas]]ファイルを開いてみる - [x] [[Canvas (Obsidian)|Canvas]]ファイルでは動くこと - [x] [[Backlinks]]が表示されること - [x] [[Canvas (Obsidian)|Canvas]]ファイルでは[[リンク]]は動かないこと - [[Canvas (Obsidian)|Canvas]]にノートを埋め込んでもリンクとして機能しないっぽい - [x] [[Excalidraw]]ファイルでも動くこと - [x] [[リンク]]が表示されること - [x] [[Backlinks]]が表示されること ## 改修調査 `onOpen`の以下 ```ts const markdownView = this.appHelper.getMarkdownViewInActiveLeaf(); ``` この実装は ```ts getMarkdownViewInActiveLeaf(): MarkdownView | null { if (!this.unsafeApp.workspace.getActiveViewOfType(MarkdownView)) { return null; } return this.unsafeApp.workspace.activeLeaf!.view as MarkdownView; } ``` `MarkdownView`特有のインターフェース以下を使っているか確認 (`editor`は怪しい) ```ts export class MarkdownView extends TextFileView { editor: Editor; previewMode: MarkdownPreviewView; currentMode: MarkdownSubView; constructor(leaf: WorkspaceLeaf); getViewType(): string; getMode(): MarkdownViewModeType; getViewData(): string; clear(): void; setViewData(data: string, clear: boolean): void; showSearch(replace?: boolean): void; } ``` ここは平気だった。あとは`openMarkdownFile`。これが問題なければOK。 ```ts openMarkdownFile(file: TFile, option: Partial<OpenMarkdownFileOption> = {}) { const opt: OpenMarkdownFileOption = { ...{ leaf: "same-tab" }, ...option, }; const openFile = (leaf: WorkspaceLeaf, background = false) => { leaf .openFile(file, { ...this.unsafeApp.workspace.activeLeaf?.getViewState(), active: !background, }) .then(() => { const markdownView = this.unsafeApp.workspace.getActiveViewOfType(MarkdownView); if (markdownView) { if (opt.offset != null) { this.moveTo(opt.offset, markdownView.editor); } else if (opt.line != null) { const p = { line: opt.line, offset: 0, col: 0 }; this.moveTo({ start: p, end: p }); } } }); }; let leaf: WorkspaceLeaf; switch (opt.leaf) { case "same-tab": leaf = this.unsafeApp.workspace.getLeaf(); openFile(leaf); break; case "new-tab": leaf = this.unsafeApp.workspace.getLeaf(true); openFile(leaf); break; case "new-tab-background": leaf = this.unsafeApp.workspace.getLeaf(true); openFile(leaf, true); break; case "new-pane-horizontal": leaf = this.unsafeApp.workspace.getLeaf("split", "horizontal"); openFile(leaf); break; case "new-pane-vertical": leaf = this.unsafeApp.workspace.getLeaf("split", "vertical"); openFile(leaf); break; case "new-window": openFile(this.unsafeApp.workspace.openPopoutLeaf()); break; case "popup": const hoverEditorInstance = this.unsafeApp.plugins.plugins["obsidian-hover-editor"]; if (hoverEditorInstance) { leaf = hoverEditorInstance.spawnPopover(undefined, () => { openFile(leaf); }); } else { openFile(this.unsafeApp.workspace.getLeaf()); } break; default: throw new ExhaustiveError(opt.leaf); } } ``` ここがキモ ```ts .then(() => { const markdownView = this.unsafeApp.workspace.getActiveViewOfType(MarkdownView); if (markdownView) { if (opt.offset != null) { this.moveTo(opt.offset, markdownView.editor); } else if (opt.line != null) { const p = { line: opt.line, offset: 0, col: 0 }; this.moveTo({ start: p, end: p }); } } }); ``` `markdownView.editor`は`MarkdownView`でしか呼べない。ただ、このif文はそもそも[[Markdown]]ファイルでなければ入ってこない。[[Markdown]]以外の場合にoffsetやlineで移動する必要がないから。ということはここは気にしなくていい。(`markdownView`という名前も問題ない) ## 改修方針 `app-helper.ts`にメソッドを追加。 ```ts getFileViewInActiveLeaf(): FileView | null { if (!this.unsafeApp.workspace.getActiveViewOfType(FileView)) { return null; } return this.unsafeApp.workspace.activeLeaf!.view as FileView; } ``` Viewにはいくつかある。親から子にかけて。 - [[Component]] - [[View]] - [[ItemView]] - [[FileView]] - [[EditableFileView]] - [[TextFileView]] - [[MarkdownView]] 今回の対象はファイル単位であれば編集の可否は問わないので、[[FileView]]が最適と判断。 ## その他のついで改修 - 埋め込みがtarget = linkに出ない