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に出ない