diff --git a/src/main.ts b/src/main.ts index 9fb4d13..8391618 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,14 +1,23 @@ import { Plugin, TFile } from 'obsidian' import { + addNoteToReindex, addToIndex, initGlobalSearchIndex, + reindexNotes, removeFromIndex, } from './search' import { OmnisearchInFileModal, OmnisearchVaultModal } from './modals' -import { loadSettings, SettingsTab } from './settings' +import { loadSettings, settings, SettingsTab } from './settings' + +const mainWindow = require('electron').remote.getCurrentWindow() +const onBlur = (): void => { + reindexNotes() +} export default class OmnisearchPlugin extends Plugin { async onload(): Promise { + mainWindow.on('blur', onBlur) + await loadSettings(this) this.addSettingTab(new SettingsTab(this)) @@ -43,8 +52,13 @@ export default class OmnisearchPlugin extends Plugin { ) this.registerEvent( this.app.vault.on('modify', async file => { - removeFromIndex(file.path) - await addToIndex(file) + if (settings.reindexInRealTime) { + removeFromIndex(file.path) + await addToIndex(file) + } + else { + addNoteToReindex(file) + } }), ) this.registerEvent( @@ -59,4 +73,8 @@ export default class OmnisearchPlugin extends Plugin { await initGlobalSearchIndex() }) } + + onunload(): void { + mainWindow.off('blur', onBlur) + } } diff --git a/src/search.ts b/src/search.ts index 3a92836..6c8716a 100644 --- a/src/search.ts +++ b/src/search.ts @@ -1,4 +1,4 @@ -import { Notice, TFile, type TAbstractFile } from 'obsidian' +import { Notice, TAbstractFile, TFile } from 'obsidian' import MiniSearch, { type SearchResult } from 'minisearch' import { chsRegex, @@ -281,7 +281,7 @@ export async function addToIndex(file: TAbstractFile): Promise { * Useful to find internal links that lead (yet) to nowhere * @param name */ -export function addNonExistingToIndex(name: string, parent:string): void { +export function addNonExistingToIndex(name: string, parent: string): void { name = removeAnchors(name) if (getNoteFromCache(name)) return @@ -315,11 +315,25 @@ export function removeFromIndex(path: string): void { if (note) { minisearchInstance.remove(note) removeNoteFromCache(path) - getNonExistingNotesFromCache().filter(n => n.parent === path).forEach(n => { - removeFromIndex(n.path) - }) + getNonExistingNotesFromCache() + .filter(n => n.parent === path) + .forEach(n => { + removeFromIndex(n.path) + }) } else { console.warn(`not not found under path ${path}`) } } + +const notesToReindex = new Set() +export function addNoteToReindex(note: TAbstractFile): void { + notesToReindex.add(note) +} +export async function reindexNotes(): Promise { + for (const note of notesToReindex) { + removeFromIndex(note.path) + await addToIndex(note) + } + notesToReindex.clear() +} diff --git a/src/settings.ts b/src/settings.ts index 6ca5dcb..a2379aa 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -11,6 +11,7 @@ interface WeightingSettings { export interface OmnisearchSettings extends WeightingSettings { showIndexingNotices: boolean respectExcluded: boolean + reindexInRealTime: boolean } export class SettingsTab extends PluginSettingTab { @@ -52,10 +53,23 @@ export class SettingsTab extends PluginSettingTab { }), ) + // Index in real-time + new Setting(containerEl) + .setName('Reindex in real-time') + .setDesc('By default, notes a reindexed when Obsidian focus is lost. Enable this to reindex in real-time. May affect performances.') + .addToggle(toggle => + toggle.setValue(settings.reindexInRealTime).onChange(async v => { + settings.reindexInRealTime = v + await saveSettings(this.plugin) + }), + ) + new Setting(containerEl).setName('Results weighting').setHeading() new Setting(containerEl) - .setName(`File name & declared aliases (default: ${DEFAULT_SETTINGS.weightBasename})`) + .setName( + `File name & declared aliases (default: ${DEFAULT_SETTINGS.weightBasename})`, + ) .addSlider(cb => this.weightSlider(cb, 'weightBasename')) new Setting(containerEl) @@ -85,6 +99,7 @@ export class SettingsTab extends PluginSettingTab { export const DEFAULT_SETTINGS: OmnisearchSettings = { showIndexingNotices: false, respectExcluded: true, + reindexInRealTime: false, weightBasename: 2, weightH1: 1.5, weightH2: 1.3,